/[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.79
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.79 2012/06/10 11:31:12 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
152# @ECLASS-VARIABLE: ESVN_OFFLINE 150# @ECLASS-VARIABLE: ESVN_OFFLINE
153# @DESCRIPTION: 151# @DESCRIPTION:
154# Set this variable to a non-empty value to disable the automatic updating of 152# 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 153# an svn source tree. This is intended to be set outside the subversion source
156# tree by users. 154# tree by users.
157ESVN_OFFLINE="${ESVN_OFFLINE:-${ESCM_OFFLINE}}" 155ESVN_OFFLINE="${ESVN_OFFLINE:-${EVCS_OFFLINE}}"
158 156
159# @ECLASS-VARIABLE: ESVN_UMASK 157# @ECLASS-VARIABLE: ESVN_UMASK
160# @DESCRIPTION: 158# @DESCRIPTION:
161# Set this variable to a custom umask. This is intended to be set by users. 159# 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 160# By setting this to something like 002, it can make life easier for people
201 199
202 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}" 200 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}"
203 201
204 # check for the protocol 202 # check for the protocol
205 local protocol="${repo_uri%%:*}" 203 local protocol="${repo_uri%%:*}"
206
207 case "${protocol}" in 204 case "${protocol}" in
208 http|https) 205 http|https)
209 if ! built_with_use -o dev-vcs/subversion webdav-neon webdav-serf; then 206 if ! built_with_use -o dev-vcs/subversion webdav-neon webdav-serf; then
210 echo 207 echo
211 eerror "In order to emerge this package, you need to" 208 eerror "In order to emerge this package, you need to"
232 if [[ ! -d ${ESVN_STORE_DIR} ]]; then 229 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
233 debug-print "${FUNCNAME}: initial checkout. creating subversion directory" 230 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
234 mkdir -m 775 -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}." 231 mkdir -m 775 -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
235 fi 232 fi
236 233
237 pushd "${ESVN_STORE_DIR}" > /dev/null || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}" 234 pushd "${ESVN_STORE_DIR}" >/dev/null || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
238 235
239 local wc_path="$(subversion__get_wc_path "${repo_uri}")" 236 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
240 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion" 237 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
241 238
242 [[ -n "${revision}" ]] && options="${options} -r ${revision}" 239 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
274 271
275 elif [[ -n ${ESVN_OFFLINE} ]]; then 272 elif [[ -n ${ESVN_OFFLINE} ]]; then
276 svn upgrade "${wc_path}" &>/dev/null 273 svn upgrade "${wc_path}" &>/dev/null
277 svn cleanup "${wc_path}" &>/dev/null 274 svn cleanup "${wc_path}" &>/dev/null
278 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy." 275 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
276
279 if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then 277 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." 278 die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally."
281 fi 279 fi
282 einfo "Fetching disabled: Using existing repository copy at revision ${ESVN_WC_REVISION}." 280 einfo "Fetching disabled: Using existing repository copy at revision ${ESVN_WC_REVISION}."
283 else 281 else
361 #* "svn export" has a bug. see http://bugs.gentoo.org/119236 359 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
362 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}." 360 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
363 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}." 361 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
364 fi 362 fi
365 363
366 popd > /dev/null 364 popd >/dev/null
367
368 echo 365 echo
369} 366}
370 367
371# @FUNCTION: subversion_bootstrap 368# @FUNCTION: subversion_bootstrap
372# @DESCRIPTION: 369# @DESCRIPTION:
377 fi 374 fi
378 375
379 cd "${S}" 376 cd "${S}"
380 377
381 if [[ -n ${ESVN_PATCHES} ]]; then 378 if [[ -n ${ESVN_PATCHES} ]]; then
379 local patch fpatch
382 einfo "apply patches -->" 380 einfo "apply patches -->"
383
384 local patch fpatch
385
386 for patch in ${ESVN_PATCHES}; do 381 for patch in ${ESVN_PATCHES}; do
387 if [[ -f ${patch} ]]; then 382 if [[ -f ${patch} ]]; then
388 epatch "${patch}" 383 epatch "${patch}"
389
390 else 384 else
391 for fpatch in ${FILESDIR}/${patch}; do 385 for fpatch in ${FILESDIR}/${patch}; do
392 if [[ -f ${fpatch} ]]; then 386 if [[ -f ${fpatch} ]]; then
393 epatch "${fpatch}" 387 epatch "${fpatch}"
394
395 else 388 else
396 die "${ESVN}: ${patch} not found" 389 die "${ESVN}: ${patch} not found"
397
398 fi 390 fi
399 done 391 done
400
401 fi 392 fi
402 done 393 done
403
404 echo 394 echo
405 fi 395 fi
406 396
407 if [[ -n ${ESVN_BOOTSTRAP} ]]; then 397 if [[ -n ${ESVN_BOOTSTRAP} ]]; then
408 einfo "begin bootstrap -->" 398 einfo "begin bootstrap -->"
409
410 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then 399 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then
411 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}" 400 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
412 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP." 401 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
413
414 else 402 else
415 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}" 403 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
416 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP." 404 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
417
418 fi
419 fi 405 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 406 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} 407}
438 408
439# @FUNCTION: subversion_wc_info 409# @FUNCTION: subversion_wc_info
440# @USAGE: [repo_uri] 410# @USAGE: [repo_uri]
441# @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH 411# @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")" 430 export ESVN_WC_UUID="$(subversion__svn_info "${wc_path}" "Repository UUID")"
461 export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")" 431 export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")"
462 export ESVN_WC_PATH="${wc_path}" 432 export ESVN_WC_PATH="${wc_path}"
463} 433}
464 434
465## -- Private Functions 435# @FUNCTION: subversion_src_unpack
466 436# @DESCRIPTION:
467## -- subversion__svn_info() ------------------------------------------------- # 437# Default src_unpack. Fetch and, in older EAPIs, bootstrap.
468# 438subversion_src_unpack() {
469# param $1 - a target. 439 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
470# param $2 - a key name. 440 if has "${EAPI:-0}" 0 1; then
471# 441 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 442 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} 443}
502 444
503## -- subversion__get_wc_path() ---------------------------------------------- # 445# @FUNCTION: subversion_src_prepare
504# 446# @DESCRIPTION:
505# param $1 - a repository URI. 447# Default src_prepare. Bootstrap.
506subversion__get_wc_path() { 448subversion_src_prepare() {
507 local repo_uri="$(subversion__get_repository_uri "${1}")" 449 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} 450}
534 451
535# @FUNCTION: subversion_pkg_preinst 452# @FUNCTION: subversion_pkg_preinst
536# @USAGE: [repo_uri] 453# @USAGE: [repo_uri]
537# @DESCRIPTION: 454# @DESCRIPTION:
538# Log the svn revision of source code. Doing this in pkg_preinst because we 455# 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 456# want the logs to stick around if packages are uninstalled without messing with
540# config protection. 457# config protection.
541subversion_pkg_preinst() { 458subversion_pkg_preinst() {
542 local pkgdate=$(date "+%Y%m%d %H:%M:%S") 459 local pkgdate=$(date "+%Y%m%d %H:%M:%S")
543 subversion_wc_info "${1:-${ESVN_REPO_URI}}" 460 subversion_wc_info "${1}"
544 if [[ -n ${ESCM_LOGDIR} ]]; then 461 if [[ -n ${ESCM_LOGDIR} ]]; then
545 local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}" 462 local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}"
546 if [[ ! -d ${dir} ]]; then 463 if [[ ! -d ${dir} ]]; then
547 mkdir -p "${dir}" || \ 464 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 465 fi
550 local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}" 466 local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}"
551 if [[ -d ${dir} ]]; then 467 if [[ -d ${dir} ]]; then
552 echo "${logmessage}" >> "${dir}/${PN}.log" 468 echo "${logmessage}" >>"${dir}/${PN}.log"
553 else 469 else
554 eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'" 470 eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'"
555 fi 471 fi
556 fi 472 fi
557} 473}
474
475## -- Private Functions
476
477## -- subversion__svn_info() ------------------------------------------------- #
478#
479# param $1 - a target.
480# param $2 - a key name.
481#
482subversion__svn_info() {
483 local target="${1}"
484 local key="${2}"
485
486 env LC_ALL=C svn info ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${target}" \
487 | grep -i "^${key}" \
488 | cut -d" " -f2-
489}
490
491## -- subversion__get_repository_uri() --------------------------------------- #
492#
493# param $1 - a repository URI.
494subversion__get_repository_uri() {
495 local repo_uri="${1}"
496
497 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
498 if [[ -z ${repo_uri} ]]; then
499 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
500 fi
501 # delete trailing slash
502 if [[ -z ${repo_uri##*/} ]]; then
503 repo_uri="${repo_uri%/}"
504 fi
505 repo_uri="${repo_uri%@*}"
506
507 echo "${repo_uri}"
508}
509
510## -- subversion__get_wc_path() ---------------------------------------------- #
511#
512# param $1 - a repository URI.
513subversion__get_wc_path() {
514 local repo_uri="$(subversion__get_repository_uri "${1}")"
515
516 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
517
518 echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
519}
520
521## -- subversion__get_peg_revision() ----------------------------------------- #
522#
523# param $1 - a repository URI.
524subversion__get_peg_revision() {
525 local repo_uri="${1}"
526 local peg_rev=
527
528 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
529 # repo_uri has peg revision?
530 if [[ ${repo_uri} = *@* ]]; then
531 peg_rev="${repo_uri##*@}"
532 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
533 else
534 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
535 fi
536
537 echo "${peg_rev}"
538}

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

  ViewVC Help
Powered by ViewVC 1.1.20