/[gentoo-x86]/eclass/subversion.eclass
Gentoo

Diff of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.75 Revision 1.81
1# Copyright 1999-2012 Gentoo Foundation 1# Copyright 1999-2012 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.75 2012/02/21 18:03:49 jlec Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.81 2012/07/29 04:26:10 hattya Exp $
4 4
5# @ECLASS: subversion.eclass 5# @ECLASS: subversion.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# Akinori Hattori <hattya@gentoo.org> 7# Akinori Hattori <hattya@gentoo.org>
8# Bo ├śrsted Andresen <zlin@gentoo.org>
9# Arfrever Frehtes Taifersar Arahesis <arfrever@gentoo.org>
10# @AUTHOR: 8# @AUTHOR:
11# Original Author: Akinori Hattori <hattya@gentoo.org> 9# Original Author: Akinori Hattori <hattya@gentoo.org>
12# @BLURB: The subversion eclass is written to fetch software sources from subversion repositories 10# @BLURB: The subversion eclass is written to fetch software sources from subversion repositories
13# @DESCRIPTION: 11# @DESCRIPTION:
14# The subversion eclass provides functions to fetch, patch and bootstrap 12# The subversion eclass provides functions to fetch, patch and bootstrap
25 *) 23 *)
26 EXPORT_FUNCTIONS src_unpack src_prepare pkg_preinst 24 EXPORT_FUNCTIONS src_unpack src_prepare pkg_preinst
27 ;; 25 ;;
28esac 26esac
29 27
30DESCRIPTION="Based on the ${ECLASS} eclass"
31
32SUBVERSION_DEPEND="dev-vcs/subversion 28DEPEND="dev-vcs/subversion
33 net-misc/rsync" 29 net-misc/rsync"
34
35if [[ -z "${ESVN_DISABLE_DEPENDENCIES}" ]]; then
36 DEPEND="${SUBVERSION_DEPEND}"
37fi
38 30
39# @ECLASS-VARIABLE: ESVN_STORE_DIR 31# @ECLASS-VARIABLE: ESVN_STORE_DIR
40# @DESCRIPTION: 32# @DESCRIPTION:
41# subversion sources store directory. Users may override this in /etc/make.conf 33# subversion sources store directory. Users may override this in /etc/make.conf
42[[ -z ${ESVN_STORE_DIR} ]] && ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/svn-src" 34[[ -z ${ESVN_STORE_DIR} ]] && ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/svn-src"
141# restrict. 133# restrict.
142# export) 134# export)
143# don't export the working copy to S. 135# don't export the working copy to S.
144ESVN_RESTRICT="${ESVN_RESTRICT:-}" 136ESVN_RESTRICT="${ESVN_RESTRICT:-}"
145 137
146# @ECLASS-VARIABLE: ESVN_DISABLE_DEPENDENCIES
147# @DESCRIPTION:
148# Set this variable to a non-empty value to disable the automatic inclusion of
149# Subversion in dependencies.
150ESVN_DISABLE_DEPENDENCIES="${ESVN_DISABLE_DEPENDENCIES:-}"
151
152# @ECLASS-VARIABLE: ESVN_OFFLINE 138# @ECLASS-VARIABLE: ESVN_OFFLINE
153# @DESCRIPTION: 139# @DESCRIPTION:
154# Set this variable to a non-empty value to disable the automatic updating of 140# Set this variable to a non-empty value to disable the automatic updating of
155# an svn source tree. This is intended to be set outside the subversion source 141# an svn source tree. This is intended to be set outside the subversion source
156# tree by users. 142# tree by users.
157ESVN_OFFLINE="${ESVN_OFFLINE:-${ESCM_OFFLINE}}" 143ESVN_OFFLINE="${ESVN_OFFLINE:-${EVCS_OFFLINE}}"
158 144
159# @ECLASS-VARIABLE: ESVN_UMASK 145# @ECLASS-VARIABLE: ESVN_UMASK
160# @DESCRIPTION: 146# @DESCRIPTION:
161# Set this variable to a custom umask. This is intended to be set by users. 147# Set this variable to a custom umask. This is intended to be set by users.
162# By setting this to something like 002, it can make life easier for people 148# By setting this to something like 002, it can make life easier for people
201 187
202 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}" 188 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}"
203 189
204 # check for the protocol 190 # check for the protocol
205 local protocol="${repo_uri%%:*}" 191 local protocol="${repo_uri%%:*}"
206
207 case "${protocol}" in 192 case "${protocol}" in
208 http|https) 193 http|https)
209 if ! built_with_use -o dev-vcs/subversion webdav-neon webdav-serf; then 194 if ! built_with_use -o dev-vcs/subversion webdav-neon webdav-serf; then
210 echo 195 echo
211 eerror "In order to emerge this package, you need to" 196 eerror "In order to emerge this package, you need to"
232 if [[ ! -d ${ESVN_STORE_DIR} ]]; then 217 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
233 debug-print "${FUNCNAME}: initial checkout. creating subversion directory" 218 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
234 mkdir -m 775 -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}." 219 mkdir -m 775 -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
235 fi 220 fi
236 221
237 pushd "${ESVN_STORE_DIR}" > /dev/null || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}" 222 pushd "${ESVN_STORE_DIR}" >/dev/null || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
238 223
239 local wc_path="$(subversion__get_wc_path "${repo_uri}")" 224 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
240 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion" 225 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
241 226
242 [[ -n "${revision}" ]] && options="${options} -r ${revision}" 227 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
274 259
275 elif [[ -n ${ESVN_OFFLINE} ]]; then 260 elif [[ -n ${ESVN_OFFLINE} ]]; then
276 svn upgrade "${wc_path}" &>/dev/null 261 svn upgrade "${wc_path}" &>/dev/null
277 svn cleanup "${wc_path}" &>/dev/null 262 svn cleanup "${wc_path}" &>/dev/null
278 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy." 263 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
264
279 if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then 265 if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then
280 die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally." 266 die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally."
281 fi 267 fi
282 einfo "Fetching disabled: Using existing repository copy at revision ${ESVN_WC_REVISION}." 268 einfo "Fetching disabled: Using existing repository copy at revision ${ESVN_WC_REVISION}."
283 else 269 else
361 #* "svn export" has a bug. see http://bugs.gentoo.org/119236 347 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
362 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}." 348 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
363 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}." 349 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
364 fi 350 fi
365 351
366 popd > /dev/null 352 popd >/dev/null
367
368 echo 353 echo
369} 354}
370 355
371# @FUNCTION: subversion_bootstrap 356# @FUNCTION: subversion_bootstrap
372# @DESCRIPTION: 357# @DESCRIPTION:
377 fi 362 fi
378 363
379 cd "${S}" 364 cd "${S}"
380 365
381 if [[ -n ${ESVN_PATCHES} ]]; then 366 if [[ -n ${ESVN_PATCHES} ]]; then
367 local patch fpatch
382 einfo "apply patches -->" 368 einfo "apply patches -->"
383
384 local patch fpatch
385
386 for patch in ${ESVN_PATCHES}; do 369 for patch in ${ESVN_PATCHES}; do
387 if [[ -f ${patch} ]]; then 370 if [[ -f ${patch} ]]; then
388 epatch "${patch}" 371 epatch "${patch}"
389
390 else 372 else
391 for fpatch in ${FILESDIR}/${patch}; do 373 for fpatch in ${FILESDIR}/${patch}; do
392 if [[ -f ${fpatch} ]]; then 374 if [[ -f ${fpatch} ]]; then
393 epatch "${fpatch}" 375 epatch "${fpatch}"
394
395 else 376 else
396 die "${ESVN}: ${patch} not found" 377 die "${ESVN}: ${patch} not found"
397
398 fi 378 fi
399 done 379 done
400
401 fi 380 fi
402 done 381 done
403
404 echo 382 echo
405 fi 383 fi
406 384
407 if [[ -n ${ESVN_BOOTSTRAP} ]]; then 385 if [[ -n ${ESVN_BOOTSTRAP} ]]; then
408 einfo "begin bootstrap -->" 386 einfo "begin bootstrap -->"
409
410 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then 387 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then
411 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}" 388 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
412 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP." 389 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
413
414 else 390 else
415 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}" 391 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
416 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP." 392 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
417
418 fi
419 fi 393 fi
420}
421
422# @FUNCTION: subversion_src_unpack
423# @DESCRIPTION:
424# Default src_unpack. Fetch and, in older EAPIs, bootstrap.
425subversion_src_unpack() {
426 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
427 if has "${EAPI:-0}" 0 1; then
428 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
429 fi 394 fi
430}
431
432# @FUNCTION: subversion_src_prepare
433# @DESCRIPTION:
434# Default src_prepare. Bootstrap.
435subversion_src_prepare() {
436 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
437} 395}
438 396
439# @FUNCTION: subversion_wc_info 397# @FUNCTION: subversion_wc_info
440# @USAGE: [repo_uri] 398# @USAGE: [repo_uri]
441# @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH 399# @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH
460 export ESVN_WC_UUID="$(subversion__svn_info "${wc_path}" "Repository UUID")" 418 export ESVN_WC_UUID="$(subversion__svn_info "${wc_path}" "Repository UUID")"
461 export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")" 419 export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")"
462 export ESVN_WC_PATH="${wc_path}" 420 export ESVN_WC_PATH="${wc_path}"
463} 421}
464 422
465## -- Private Functions 423# @FUNCTION: subversion_src_unpack
466 424# @DESCRIPTION:
467## -- subversion__svn_info() ------------------------------------------------- # 425# Default src_unpack. Fetch and, in older EAPIs, bootstrap.
468# 426subversion_src_unpack() {
469# param $1 - a target. 427 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
470# param $2 - a key name. 428 if has "${EAPI:-0}" 0 1; then
471# 429 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
472subversion__svn_info() {
473 local target="${1}"
474 local key="${2}"
475
476 env LC_ALL=C svn info \
477 ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" \
478 "${target}" | grep -i "^${key}" | cut -d" " -f2-
479}
480
481## -- subversion__get_repository_uri() --------------------------------------- #
482#
483# param $1 - a repository URI.
484subversion__get_repository_uri() {
485 local repo_uri="${1}"
486
487 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
488
489 if [[ -z ${repo_uri} ]]; then
490 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
491 fi 430 fi
492
493 # delete trailing slash
494 if [[ -z ${repo_uri##*/} ]]; then
495 repo_uri="${repo_uri%/}"
496 fi
497
498 repo_uri="${repo_uri%@*}"
499
500 echo "${repo_uri}"
501} 431}
502 432
503## -- subversion__get_wc_path() ---------------------------------------------- # 433# @FUNCTION: subversion_src_prepare
504# 434# @DESCRIPTION:
505# param $1 - a repository URI. 435# Default src_prepare. Bootstrap.
506subversion__get_wc_path() { 436subversion_src_prepare() {
507 local repo_uri="$(subversion__get_repository_uri "${1}")" 437 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
508
509 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
510
511 echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
512}
513
514## -- subversion__get_peg_revision() ----------------------------------------- #
515#
516# param $1 - a repository URI.
517subversion__get_peg_revision() {
518 local repo_uri="${1}"
519
520 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
521
522 # repo_uri has peg revision ?
523 if [[ ${repo_uri} != *@* ]]; then
524 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
525 fi
526
527 local peg_rev=
528 [[ ${repo_uri} = *@* ]] && peg_rev="${repo_uri##*@}"
529
530 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
531
532 echo "${peg_rev}"
533} 438}
534 439
535# @FUNCTION: subversion_pkg_preinst 440# @FUNCTION: subversion_pkg_preinst
536# @USAGE: [repo_uri] 441# @USAGE: [repo_uri]
537# @DESCRIPTION: 442# @DESCRIPTION:
538# Log the svn revision of source code. Doing this in pkg_preinst because we 443# Log the svn revision of source code. Doing this in pkg_preinst because we
539# want the logs to stick around if packages are uninstalled without messing with 444# want the logs to stick around if packages are uninstalled without messing with
540# config protection. 445# config protection.
541subversion_pkg_preinst() { 446subversion_pkg_preinst() {
542 local pkgdate=$(date "+%Y%m%d %H:%M:%S") 447 local pkgdate=$(date "+%Y%m%d %H:%M:%S")
543 subversion_wc_info "${1:-${ESVN_REPO_URI}}" 448 subversion_wc_info "${1}"
544 if [[ -n ${ESCM_LOGDIR} ]]; then 449 if [[ -n ${ESCM_LOGDIR} ]]; then
545 local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}" 450 local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}"
546 if [[ ! -d ${dir} ]]; then 451 if [[ ! -d ${dir} ]]; then
547 mkdir -p "${dir}" || \ 452 mkdir -p "${dir}" || eerror "Failed to create '${dir}' for logging svn revision"
548 eerror "Failed to create '${dir}' for logging svn revision to '${PORTDIR_SCM}'"
549 fi 453 fi
550 local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}" 454 local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}"
551 if [[ -d ${dir} ]]; then 455 if [[ -d ${dir} ]]; then
552 echo "${logmessage}" >> "${dir}/${PN}.log" 456 echo "${logmessage}" >>"${dir}/${PN}.log"
553 else 457 else
554 eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'" 458 eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'"
555 fi 459 fi
556 fi 460 fi
557} 461}
462
463## -- Private Functions
464
465## -- subversion__svn_info() ------------------------------------------------- #
466#
467# param $1 - a target.
468# param $2 - a key name.
469#
470subversion__svn_info() {
471 local target="${1}"
472 local key="${2}"
473
474 env LC_ALL=C svn info ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${target}" \
475 | grep -i "^${key}" \
476 | cut -d" " -f2-
477}
478
479## -- subversion__get_repository_uri() --------------------------------------- #
480#
481# param $1 - a repository URI.
482subversion__get_repository_uri() {
483 local repo_uri="${1}"
484
485 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
486 if [[ -z ${repo_uri} ]]; then
487 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
488 fi
489 # delete trailing slash
490 if [[ -z ${repo_uri##*/} ]]; then
491 repo_uri="${repo_uri%/}"
492 fi
493 repo_uri="${repo_uri%@*}"
494
495 echo "${repo_uri}"
496}
497
498## -- subversion__get_wc_path() ---------------------------------------------- #
499#
500# param $1 - a repository URI.
501subversion__get_wc_path() {
502 local repo_uri="$(subversion__get_repository_uri "${1}")"
503
504 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
505
506 echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
507}
508
509## -- subversion__get_peg_revision() ----------------------------------------- #
510#
511# param $1 - a repository URI.
512subversion__get_peg_revision() {
513 local repo_uri="${1}"
514 local peg_rev=
515
516 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
517 # repo_uri has peg revision?
518 if [[ ${repo_uri} = *@* ]]; then
519 peg_rev="${repo_uri##*@}"
520 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
521 else
522 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
523 fi
524
525 echo "${peg_rev}"
526}

Legend:
Removed from v.1.75  
changed lines
  Added in v.1.81

  ViewVC Help
Powered by ViewVC 1.1.20