/[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.82
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.82 2012/07/29 05:38:42 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
19ESVN="${ECLASS}" 17ESVN="${ECLASS}"
20 18
21case "${EAPI:-0}" in 19case "${EAPI:-0}" in
22 0|1) 20 0|1)
23 EXPORT_FUNCTIONS src_unpack pkg_preinst 21 EXPORT_FUNCTIONS src_unpack pkg_preinst
22 DEPEND="dev-vcs/subversion"
24 ;; 23 ;;
25 *) 24 *)
26 EXPORT_FUNCTIONS src_unpack src_prepare pkg_preinst 25 EXPORT_FUNCTIONS src_unpack src_prepare pkg_preinst
26 DEPEND="|| ( dev-vcs/subversion[webdav-neon] dev-vcs/subversion[webdav-serf] )"
27 ;; 27 ;;
28esac 28esac
29 29
30DESCRIPTION="Based on the ${ECLASS} eclass" 30DEPEND+=" net-misc/rsync"
31
32SUBVERSION_DEPEND="dev-vcs/subversion
33 net-misc/rsync"
34
35if [[ -z "${ESVN_DISABLE_DEPENDENCIES}" ]]; then
36 DEPEND="${SUBVERSION_DEPEND}"
37fi
38 31
39# @ECLASS-VARIABLE: ESVN_STORE_DIR 32# @ECLASS-VARIABLE: ESVN_STORE_DIR
40# @DESCRIPTION: 33# @DESCRIPTION:
41# subversion sources store directory. Users may override this in /etc/make.conf 34# 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" 35[[ -z ${ESVN_STORE_DIR} ]] && ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/svn-src"
141# restrict. 134# restrict.
142# export) 135# export)
143# don't export the working copy to S. 136# don't export the working copy to S.
144ESVN_RESTRICT="${ESVN_RESTRICT:-}" 137ESVN_RESTRICT="${ESVN_RESTRICT:-}"
145 138
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 139# @ECLASS-VARIABLE: ESVN_OFFLINE
153# @DESCRIPTION: 140# @DESCRIPTION:
154# Set this variable to a non-empty value to disable the automatic updating of 141# 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 142# an svn source tree. This is intended to be set outside the subversion source
156# tree by users. 143# tree by users.
157ESVN_OFFLINE="${ESVN_OFFLINE:-${ESCM_OFFLINE}}" 144ESVN_OFFLINE="${ESVN_OFFLINE:-${EVCS_OFFLINE}}"
158 145
159# @ECLASS-VARIABLE: ESVN_UMASK 146# @ECLASS-VARIABLE: ESVN_UMASK
160# @DESCRIPTION: 147# @DESCRIPTION:
161# Set this variable to a custom umask. This is intended to be set by users. 148# 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 149# By setting this to something like 002, it can make life easier for people
201 188
202 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}" 189 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}"
203 190
204 # check for the protocol 191 # check for the protocol
205 local protocol="${repo_uri%%:*}" 192 local protocol="${repo_uri%%:*}"
206
207 case "${protocol}" in 193 case "${protocol}" in
208 http|https) 194 http|https)
209 if ! built_with_use -o dev-vcs/subversion webdav-neon webdav-serf; then
210 echo
211 eerror "In order to emerge this package, you need to"
212 eerror "reinstall Subversion with support for WebDAV."
213 eerror "Subversion requires either Neon or Serf to support WebDAV."
214 echo
215 die "${ESVN}: reinstall Subversion with support for WebDAV."
216 fi
217 ;; 195 ;;
218 svn|svn+ssh) 196 svn|svn+ssh)
219 ;; 197 ;;
220 *) 198 *)
221 die "${ESVN}: fetch from '${protocol}' is not yet implemented." 199 die "${ESVN}: fetch from '${protocol}' is not yet implemented."
232 if [[ ! -d ${ESVN_STORE_DIR} ]]; then 210 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
233 debug-print "${FUNCNAME}: initial checkout. creating subversion directory" 211 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
234 mkdir -m 775 -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}." 212 mkdir -m 775 -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
235 fi 213 fi
236 214
237 pushd "${ESVN_STORE_DIR}" > /dev/null || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}" 215 pushd "${ESVN_STORE_DIR}" >/dev/null || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
238 216
239 local wc_path="$(subversion__get_wc_path "${repo_uri}")" 217 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
240 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion" 218 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
241 219
242 [[ -n "${revision}" ]] && options="${options} -r ${revision}" 220 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
274 252
275 elif [[ -n ${ESVN_OFFLINE} ]]; then 253 elif [[ -n ${ESVN_OFFLINE} ]]; then
276 svn upgrade "${wc_path}" &>/dev/null 254 svn upgrade "${wc_path}" &>/dev/null
277 svn cleanup "${wc_path}" &>/dev/null 255 svn cleanup "${wc_path}" &>/dev/null
278 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy." 256 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
257
279 if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then 258 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." 259 die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally."
281 fi 260 fi
282 einfo "Fetching disabled: Using existing repository copy at revision ${ESVN_WC_REVISION}." 261 einfo "Fetching disabled: Using existing repository copy at revision ${ESVN_WC_REVISION}."
283 else 262 else
361 #* "svn export" has a bug. see http://bugs.gentoo.org/119236 340 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
362 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}." 341 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
363 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}." 342 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
364 fi 343 fi
365 344
366 popd > /dev/null 345 popd >/dev/null
367
368 echo 346 echo
369} 347}
370 348
371# @FUNCTION: subversion_bootstrap 349# @FUNCTION: subversion_bootstrap
372# @DESCRIPTION: 350# @DESCRIPTION:
377 fi 355 fi
378 356
379 cd "${S}" 357 cd "${S}"
380 358
381 if [[ -n ${ESVN_PATCHES} ]]; then 359 if [[ -n ${ESVN_PATCHES} ]]; then
360 local patch fpatch
382 einfo "apply patches -->" 361 einfo "apply patches -->"
383
384 local patch fpatch
385
386 for patch in ${ESVN_PATCHES}; do 362 for patch in ${ESVN_PATCHES}; do
387 if [[ -f ${patch} ]]; then 363 if [[ -f ${patch} ]]; then
388 epatch "${patch}" 364 epatch "${patch}"
389
390 else 365 else
391 for fpatch in ${FILESDIR}/${patch}; do 366 for fpatch in ${FILESDIR}/${patch}; do
392 if [[ -f ${fpatch} ]]; then 367 if [[ -f ${fpatch} ]]; then
393 epatch "${fpatch}" 368 epatch "${fpatch}"
394
395 else 369 else
396 die "${ESVN}: ${patch} not found" 370 die "${ESVN}: ${patch} not found"
397
398 fi 371 fi
399 done 372 done
400
401 fi 373 fi
402 done 374 done
403
404 echo 375 echo
405 fi 376 fi
406 377
407 if [[ -n ${ESVN_BOOTSTRAP} ]]; then 378 if [[ -n ${ESVN_BOOTSTRAP} ]]; then
408 einfo "begin bootstrap -->" 379 einfo "begin bootstrap -->"
409
410 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then 380 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then
411 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}" 381 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
412 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP." 382 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
413
414 else 383 else
415 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}" 384 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
416 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP." 385 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
417
418 fi
419 fi 386 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 387 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} 388}
438 389
439# @FUNCTION: subversion_wc_info 390# @FUNCTION: subversion_wc_info
440# @USAGE: [repo_uri] 391# @USAGE: [repo_uri]
441# @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH 392# @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")" 411 export ESVN_WC_UUID="$(subversion__svn_info "${wc_path}" "Repository UUID")"
461 export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")" 412 export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")"
462 export ESVN_WC_PATH="${wc_path}" 413 export ESVN_WC_PATH="${wc_path}"
463} 414}
464 415
465## -- Private Functions 416# @FUNCTION: subversion_src_unpack
466 417# @DESCRIPTION:
467## -- subversion__svn_info() ------------------------------------------------- # 418# Default src_unpack. Fetch and, in older EAPIs, bootstrap.
468# 419subversion_src_unpack() {
469# param $1 - a target. 420 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
470# param $2 - a key name. 421 if has "${EAPI:-0}" 0 1; then
471# 422 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 423 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} 424}
502 425
503## -- subversion__get_wc_path() ---------------------------------------------- # 426# @FUNCTION: subversion_src_prepare
504# 427# @DESCRIPTION:
505# param $1 - a repository URI. 428# Default src_prepare. Bootstrap.
506subversion__get_wc_path() { 429subversion_src_prepare() {
507 local repo_uri="$(subversion__get_repository_uri "${1}")" 430 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} 431}
534 432
535# @FUNCTION: subversion_pkg_preinst 433# @FUNCTION: subversion_pkg_preinst
536# @USAGE: [repo_uri] 434# @USAGE: [repo_uri]
537# @DESCRIPTION: 435# @DESCRIPTION:
538# Log the svn revision of source code. Doing this in pkg_preinst because we 436# 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 437# want the logs to stick around if packages are uninstalled without messing with
540# config protection. 438# config protection.
541subversion_pkg_preinst() { 439subversion_pkg_preinst() {
542 local pkgdate=$(date "+%Y%m%d %H:%M:%S") 440 local pkgdate=$(date "+%Y%m%d %H:%M:%S")
543 subversion_wc_info "${1:-${ESVN_REPO_URI}}" 441 subversion_wc_info "${1}"
544 if [[ -n ${ESCM_LOGDIR} ]]; then 442 if [[ -n ${ESCM_LOGDIR} ]]; then
545 local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}" 443 local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}"
546 if [[ ! -d ${dir} ]]; then 444 if [[ ! -d ${dir} ]]; then
547 mkdir -p "${dir}" || \ 445 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 446 fi
550 local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}" 447 local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}"
551 if [[ -d ${dir} ]]; then 448 if [[ -d ${dir} ]]; then
552 echo "${logmessage}" >> "${dir}/${PN}.log" 449 echo "${logmessage}" >>"${dir}/${PN}.log"
553 else 450 else
554 eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'" 451 eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'"
555 fi 452 fi
556 fi 453 fi
557} 454}
455
456## -- Private Functions
457
458## -- subversion__svn_info() ------------------------------------------------- #
459#
460# param $1 - a target.
461# param $2 - a key name.
462#
463subversion__svn_info() {
464 local target="${1}"
465 local key="${2}"
466
467 env LC_ALL=C svn info ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${target}" \
468 | grep -i "^${key}" \
469 | cut -d" " -f2-
470}
471
472## -- subversion__get_repository_uri() --------------------------------------- #
473#
474# param $1 - a repository URI.
475subversion__get_repository_uri() {
476 local repo_uri="${1}"
477
478 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
479 if [[ -z ${repo_uri} ]]; then
480 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
481 fi
482 # delete trailing slash
483 if [[ -z ${repo_uri##*/} ]]; then
484 repo_uri="${repo_uri%/}"
485 fi
486 repo_uri="${repo_uri%@*}"
487
488 echo "${repo_uri}"
489}
490
491## -- subversion__get_wc_path() ---------------------------------------------- #
492#
493# param $1 - a repository URI.
494subversion__get_wc_path() {
495 local repo_uri="$(subversion__get_repository_uri "${1}")"
496
497 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
498
499 echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
500}
501
502## -- subversion__get_peg_revision() ----------------------------------------- #
503#
504# param $1 - a repository URI.
505subversion__get_peg_revision() {
506 local repo_uri="${1}"
507 local peg_rev=
508
509 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
510 # repo_uri has peg revision?
511 if [[ ${repo_uri} = *@* ]]; then
512 peg_rev="${repo_uri##*@}"
513 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
514 else
515 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
516 fi
517
518 echo "${peg_rev}"
519}

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

  ViewVC Help
Powered by ViewVC 1.1.20