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

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

  ViewVC Help
Powered by ViewVC 1.1.20