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

Diff of /eclass/subversion.eclass

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

Revision 1.31 Revision 1.80
1# Copyright 1999-2006 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.31 2006/04/30 09:26:56 hattya Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.80 2012/07/29 03:37:37 hattya Exp $
4 4
5## --------------------------------------------------------------------------- # 5# @ECLASS: subversion.eclass
6# @MAINTAINER:
7# Akinori Hattori <hattya@gentoo.org>
8# @AUTHOR:
6# Author: Akinori Hattori <hattya@gentoo.org> 9# Original Author: Akinori Hattori <hattya@gentoo.org>
7#
8# The subversion eclass is written to fetch the software sources from 10# @BLURB: The subversion eclass is written to fetch software sources from subversion repositories
9# subversion repositories like the cvs eclass. 11# @DESCRIPTION:
10# 12# The subversion eclass provides functions to fetch, patch and bootstrap
11# 13# software sources from subversion repositories.
12# Description:
13# If you use this eclass, the ${S} is ${WORKDIR}/${P}.
14# It is necessary to define the ESVN_REPO_URI variable at least.
15#
16## --------------------------------------------------------------------------- #
17 14
18inherit eutils 15inherit eutils
19 16
20ESVN="subversion.eclass" 17ESVN="${ECLASS}"
21 18
19case "${EAPI:-0}" in
20 0|1)
22EXPORT_FUNCTIONS src_unpack 21 EXPORT_FUNCTIONS src_unpack pkg_preinst
22 ;;
23 *)
24 EXPORT_FUNCTIONS src_unpack src_prepare pkg_preinst
25 ;;
26esac
23 27
24HOMEPAGE="http://subversion.tigris.org/" 28SUBVERSION_DEPEND="dev-vcs/subversion
25DESCRIPTION="Based on the ${ECLASS} eclass" 29 net-misc/rsync"
26 30
31if [[ -z "${ESVN_DISABLE_DEPENDENCIES}" ]]; then
32 DEPEND="${SUBVERSION_DEPEND}"
33fi
27 34
28## -- add subversion in DEPEND 35# @ECLASS-VARIABLE: ESVN_STORE_DIR
29# 36# @DESCRIPTION:
30DEPEND="dev-util/subversion" 37# subversion sources store directory. Users may override this in /etc/make.conf
31
32
33## -- ESVN_STORE_DIR: subversion sources store directory
34#
35ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/svn-src" 38[[ -z ${ESVN_STORE_DIR} ]] && ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/svn-src"
36 39
37 40# @ECLASS-VARIABLE: ESVN_FETCH_CMD
38## -- ESVN_FETCH_CMD: subversion fetch command 41# @DESCRIPTION:
39# 42# subversion checkout command
40ESVN_FETCH_CMD="svn checkout" 43ESVN_FETCH_CMD="svn checkout"
41 44
42## -- ESVN_UPDATE_CMD: subversion update command 45# @ECLASS-VARIABLE: ESVN_UPDATE_CMD
43# 46# @DESCRIPTION:
47# subversion update command
44ESVN_UPDATE_CMD="svn update" 48ESVN_UPDATE_CMD="svn update"
45 49
50# @ECLASS-VARIABLE: ESVN_SWITCH_CMD
51# @DESCRIPTION:
52# subversion switch command
53ESVN_SWITCH_CMD="svn switch"
46 54
47## -- ESVN_OPTIONS: 55# @ECLASS-VARIABLE: ESVN_OPTIONS
48# 56# @DESCRIPTION:
49# the options passed to checkout or update. 57# the options passed to checkout or update. If you want a specific revision see
50# 58# ESVN_REPO_URI instead of using -rREV.
51[ -z "${ESVN_OPTIONS}" ] && ESVN_OPTIONS= 59ESVN_OPTIONS="${ESVN_OPTIONS:-}"
52 60
53 61# @ECLASS-VARIABLE: ESVN_REPO_URI
54## -- ESVN_REPO_URI: repository uri 62# @DESCRIPTION:
63# repository uri
55# 64#
56# e.g. http://foo/trunk, svn://bar/trunk 65# e.g. http://foo/trunk, svn://bar/trunk, svn://bar/branch/foo@1234
57# 66#
58# supported protocols: 67# supported protocols:
59# http:// 68# http://
60# https:// 69# https://
61# svn:// 70# svn://
71# svn+ssh://
62# 72#
63[ -z "${ESVN_REPO_URI}" ] && ESVN_REPO_URI="" 73# to peg to a specific revision, append @REV to the repo's uri
74ESVN_REPO_URI="${ESVN_REPO_URI:-}"
64 75
76# @ECLASS-VARIABLE: ESVN_REVISION
77# @DESCRIPTION:
78# User configurable revision checkout or update to from the repository
79#
80# Useful for live svn or trunk svn ebuilds allowing the user to peg
81# to a specific revision
82#
83# Note: This should never be set in an ebuild!
84ESVN_REVISION="${ESVN_REVISION:-}"
65 85
66## -- ESVN_PROJECT: project name of your ebuild 86# @ECLASS-VARIABLE: ESVN_USER
87# @DESCRIPTION:
88# User name
89ESVN_USER="${ESVN_USER:-}"
90
91# @ECLASS-VARIABLE: ESVN_PASSWORD
92# @DESCRIPTION:
93# Password
94ESVN_PASSWORD="${ESVN_PASSWORD:-}"
95
96# @ECLASS-VARIABLE: ESVN_PROJECT
97# @DESCRIPTION:
98# project name of your ebuild (= name space)
67# 99#
68# subversion eclass will check out the subversion repository like: 100# subversion eclass will check out the subversion repository like:
69# 101#
70# ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/} 102# ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/}
71# 103#
73# http://svn.collab.net/repo/svn/trunk/. and PN is subversion-svn. 105# http://svn.collab.net/repo/svn/trunk/. and PN is subversion-svn.
74# it will check out like: 106# it will check out like:
75# 107#
76# ${ESVN_STORE_DIR}/subversion/trunk 108# ${ESVN_STORE_DIR}/subversion/trunk
77# 109#
110# this is not used in order to declare the name of the upstream project.
111# so that you can declare this like:
112#
113# # jakarta commons-loggin
114# ESVN_PROJECT=commons/logging
115#
78# default: ${PN/-svn}. 116# default: ${PN/-svn}.
79# 117ESVN_PROJECT="${ESVN_PROJECT:-${PN/-svn}}"
80[ -z "${ESVN_PROJECT}" ] && ESVN_PROJECT="${PN/-svn}"
81 118
82 119# @ECLASS-VARIABLE: ESVN_BOOTSTRAP
83## -- ESVN_BOOTSTRAP: 120# @DESCRIPTION:
84#
85# bootstrap script or command like autogen.sh or etc.. 121# bootstrap script or command like autogen.sh or etc..
86# 122ESVN_BOOTSTRAP="${ESVN_BOOTSTRAP:-}"
87[ -z "${ESVN_BOOTSTRAP}" ] && ESVN_BOOTSTRAP=""
88 123
89 124# @ECLASS-VARIABLE: ESVN_PATCHES
90## -- ESVN_PATCHES: 125# @DESCRIPTION:
91#
92# subversion eclass can apply pathces in subversion_bootstrap(). 126# subversion eclass can apply patches in subversion_bootstrap().
93# you can use regexp in this valiable like *.diff or *.patch or etc. 127# you can use regexp in this variable like *.diff or *.patch or etc.
94# NOTE: this patches will apply before eval ESVN_BOOTSTRAP. 128# NOTE: patches will be applied before ESVN_BOOTSTRAP is processed.
95# 129#
96# the process of applying the patch is: 130# Patches are searched both in ${PWD} and ${FILESDIR}, if not found in either
97# 1. just epatch it, if the patch exists in the path. 131# location, the installation dies.
98# 2. scan it under FILESDIR and epatch it, if the patch exists in FILESDIR. 132ESVN_PATCHES="${ESVN_PATCHES:-}"
99# 3. die.
100#
101[ -z "${ESVN_PATCHES}" ] && ESVN_PATCHES=""
102 133
134# @ECLASS-VARIABLE: ESVN_RESTRICT
135# @DESCRIPTION:
136# this should be a space delimited list of subversion eclass features to
137# restrict.
138# export)
139# don't export the working copy to S.
140ESVN_RESTRICT="${ESVN_RESTRICT:-}"
103 141
104## -- subversion_svn_fetch() ------------------------------------------------- # 142# @ECLASS-VARIABLE: ESVN_DISABLE_DEPENDENCIES
143# @DESCRIPTION:
144# Set this variable to a non-empty value to disable the automatic inclusion of
145# Subversion in dependencies.
146ESVN_DISABLE_DEPENDENCIES="${ESVN_DISABLE_DEPENDENCIES:-}"
105 147
148# @ECLASS-VARIABLE: ESVN_OFFLINE
149# @DESCRIPTION:
150# Set this variable to a non-empty value to disable the automatic updating of
151# an svn source tree. This is intended to be set outside the subversion source
152# tree by users.
153ESVN_OFFLINE="${ESVN_OFFLINE:-${EVCS_OFFLINE}}"
154
155# @ECLASS-VARIABLE: ESVN_UMASK
156# @DESCRIPTION:
157# Set this variable to a custom umask. This is intended to be set by users.
158# By setting this to something like 002, it can make life easier for people
159# who do development as non-root (but are in the portage group), and then
160# switch over to building with FEATURES=userpriv. Or vice-versa. Shouldn't
161# be a security issue here as anyone who has portage group write access
162# already can screw the system over in more creative ways.
163ESVN_UMASK="${ESVN_UMASK:-${EVCS_UMASK}}"
164
165# @ECLASS-VARIABLE: ESVN_UP_FREQ
166# @DESCRIPTION:
167# Set the minimum number of hours between svn up'ing in any given svn module. This is particularly
168# useful for split KDE ebuilds where we want to ensure that all submodules are compiled for the same
169# revision. It should also be kept user overrideable.
170ESVN_UP_FREQ="${ESVN_UP_FREQ:=}"
171
172# @ECLASS-VARIABLE: ESCM_LOGDIR
173# @DESCRIPTION:
174# User configuration variable. If set to a path such as e.g. /var/log/scm any
175# package inheriting from subversion.eclass will record svn revision to
176# ${CATEGORY}/${PN}.log in that path in pkg_preinst. This is not supposed to be
177# set by ebuilds/eclasses. It defaults to empty so users need to opt in.
178ESCM_LOGDIR="${ESCM_LOGDIR:=}"
179
180# @FUNCTION: subversion_fetch
181# @USAGE: [repo_uri] [destination]
182# @DESCRIPTION:
183# Wrapper function to fetch sources from subversion via svn checkout or svn update,
184# depending on whether there is an existing working copy in ${ESVN_STORE_DIR}.
185#
186# Can take two optional parameters:
187# repo_uri - a repository URI. default is ESVN_REPO_URI.
188# destination - a check out path in S.
106function subversion_svn_fetch() { 189subversion_fetch() {
190 local repo_uri="$(subversion__get_repository_uri "${1:-${ESVN_REPO_URI}}")"
191 local revision="$(subversion__get_peg_revision "${1:-${ESVN_REPO_URI}}")"
192 local S_dest="${2}"
107 193
108 local ESVN_CO_DIR 194 if [[ -z ${repo_uri} ]]; then
195 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
196 fi
109 197
110 # ESVN_REPO_URI is empty. 198 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}"
111 [ -z "${ESVN_REPO_URI}" ] && die "${ESVN}: ESVN_REPO_URI is empty."
112 199
113 # check for the protocol. 200 # check for the protocol
114 case ${ESVN_REPO_URI%%:*} in 201 local protocol="${repo_uri%%:*}"
202 case "${protocol}" in
115 http|https) 203 http|https)
116 if built_with_use dev-util/subversion nowebdav; then 204 if ! built_with_use -o dev-vcs/subversion webdav-neon webdav-serf; then
205 echo
117 eerror "In order to emerge this package, you need to" 206 eerror "In order to emerge this package, you need to"
118 eerror "re-emerge subversion with USE=-nowebdav" 207 eerror "reinstall Subversion with support for WebDAV."
119 die "Please run 'USE=-nowebdav emerge subversion'" 208 eerror "Subversion requires either Neon or Serf to support WebDAV."
209 echo
210 die "${ESVN}: reinstall Subversion with support for WebDAV."
120 fi 211 fi
121 ;; 212 ;;
122 svn) ;; 213 svn|svn+ssh)
214 ;;
123 *) 215 *)
124 die "${ESVN}: fetch from "${ESVN_REPO_URI%:*}" is not yet implemented." 216 die "${ESVN}: fetch from '${protocol}' is not yet implemented."
125 ;; 217 ;;
126 esac 218 esac
127 219
220 addread "/etc/subversion"
221 addwrite "${ESVN_STORE_DIR}"
222
223 if [[ -n "${ESVN_UMASK}" ]]; then
224 eumask_push "${ESVN_UMASK}"
225 fi
226
128 if [ ! -d "${ESVN_STORE_DIR}" ]; then 227 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
129 debug-print "${FUNCNAME}: initial checkout. creating subversion directory" 228 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
130
131 addwrite /
132 mkdir -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}."
133 chmod -f o+rw "${ESVN_STORE_DIR}" || die "${ESVN}: can't chmod ${ESVN_STORE_DIR}."
134 export SANDBOX_WRITE="${SANDBOX_WRITE%%:/}"
135 fi 230 fi
136 231
137 cd -P "${ESVN_STORE_DIR}" || 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}"
138 ESVN_STORE_DIR=${PWD}
139 233
140 # every time 234 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
141 addwrite "/etc/subversion"
142 addwrite "${ESVN_STORE_DIR}"
143
144 if ! has userpriv ${FEATURES}; then
145 # -userpriv
146 addwrite "/root/.subversion"
147
148 else
149 # +userpriv
150 ESVN_OPTIONS="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion" 235 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
151 236
152 fi 237 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
153 238
154 [ -z "${ESVN_REPO_URI##*/}" ] && ESVN_REPO_URI="${ESVN_REPO_URI%/}" 239 if [[ "${ESVN_OPTIONS}" = *-r* ]]; then
155 ESVN_CO_DIR="${ESVN_PROJECT}/${ESVN_REPO_URI##*/}" 240 ewarn "\${ESVN_OPTIONS} contains -r, this usage is unsupported. Please"
241 ewarn "see \${ESVN_REPO_URI}"
242 fi
156 243
244 if has_version ">=dev-vcs/subversion-1.6.0"; then
245 options="${options} --config-option=config:auth:password-stores="
246 fi
247
248 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
157 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\"" 249 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
250 debug-print "${FUNCNAME}: options = \"${options}\""
158 251
159 if [ ! -d "${ESVN_CO_DIR}/.svn" ]; then 252 if [[ ! -d ${wc_path}/.svn ]]; then
253 if [[ -n ${ESVN_OFFLINE} ]]; then
254 ewarn "ESVN_OFFLINE cannot be used when there is no existing checkout."
255 fi
160 # first check out 256 # first check out
161 einfo "subversion check out start -->" 257 einfo "subversion check out start -->"
162 einfo " repository: ${ESVN_REPO_URI}" 258 einfo " repository: ${repo_uri}${revision:+@}${revision}"
163 259
260 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
261
164 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}." 262 mkdir -m 775 -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
165 chmod -f o+rw "${ESVN_PROJECT}" || die "${ESVN}: can't chmod ${ESVN_PROJECT}." 263 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
166 cd "${ESVN_PROJECT}" 264 if [[ -n "${ESVN_USER}" ]]; then
167 ${ESVN_FETCH_CMD} ${ESVN_OPTIONS} "${ESVN_REPO_URI}" || die "${ESVN}: can't fetch from ${ESVN_REPO_URI}." 265 ${ESVN_FETCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
266 else
267 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
268 fi
168 269
270 elif [[ -n ${ESVN_OFFLINE} ]]; then
271 svn upgrade "${wc_path}" &>/dev/null
272 svn cleanup "${wc_path}" &>/dev/null
273 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
274
275 if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then
276 die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally."
277 fi
278 einfo "Fetching disabled: Using existing repository copy at revision ${ESVN_WC_REVISION}."
169 else 279 else
280 svn upgrade "${wc_path}" &>/dev/null
281 svn cleanup "${wc_path}" &>/dev/null
282 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
283
284 local esvn_up_freq=
285 if [[ -n ${ESVN_UP_FREQ} ]]; then
286 if [[ -n ${ESVN_UP_FREQ//[[:digit:]]} ]]; then
287 die "${ESVN}: ESVN_UP_FREQ must be an integer value corresponding to the minimum number of hours between svn up."
288 elif [[ -z $(find "${wc_path}/.svn/entries" -mmin "+$((ESVN_UP_FREQ*60))") ]]; then
289 einfo "Fetching disabled since ${ESVN_UP_FREQ} hours has not passed since last update."
290 einfo "Using existing repository copy at revision ${ESVN_WC_REVISION}."
291 esvn_up_freq=no_update
292 fi
293 fi
294
295 if [[ -z ${esvn_up_freq} ]]; then
296 if [[ ${ESVN_WC_UUID} != $(subversion__svn_info "${repo_uri}" "Repository UUID") ]]; then
297 # UUID mismatch. Delete working copy and check out it again.
298 einfo "subversion recheck out start -->"
299 einfo " old UUID: ${ESVN_WC_UUID}"
300 einfo " new UUID: $(subversion__svn_info "${repo_uri}" "Repository UUID")"
301 einfo " repository: ${repo_uri}${revision:+@}${revision}"
302
303 rm -fr "${ESVN_PROJECT}" || die
304
305 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
306
307 mkdir -m 775 -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
308 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
309 if [[ -n "${ESVN_USER}" ]]; then
310 ${ESVN_FETCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
311 else
312 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
313 fi
314 elif [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then
315 einfo "subversion switch start -->"
316 einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}"
317 einfo " new repository: ${repo_uri}${revision:+@}${revision}"
318
319 debug-print "${FUNCNAME}: ${ESVN_SWITCH_CMD} ${options} ${repo_uri}"
320
321 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
322 if [[ -n "${ESVN_USER}" ]]; then
323 ${ESVN_SWITCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" ${repo_uri} || die "${ESVN}: can't update ${wc_path} from ${repo_uri}."
324 else
325 ${ESVN_SWITCH_CMD} ${options} ${repo_uri} || die "${ESVN}: can't update ${wc_path} from ${repo_uri}."
326 fi
327 else
170 # update working copy 328 # update working copy
171 einfo "subversion update start -->" 329 einfo "subversion update start -->"
172 einfo " repository: ${ESVN_REPO_URI}" 330 einfo " repository: ${repo_uri}${revision:+@}${revision}"
173 331
174 cd "${ESVN_CO_DIR}" 332 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
175 ${ESVN_UPDATE_CMD} ${ESVN_OPTIONS} || die "${ESVN}: can't update from ${ESVN_REPO_URI}."
176 333
334 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
335 if [[ -n "${ESVN_USER}" ]]; then
336 ${ESVN_UPDATE_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" || die "${ESVN}: can't update ${wc_path} from ${repo_uri}."
337 else
338 ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update ${wc_path} from ${repo_uri}."
339 fi
340 fi
177 fi 341 fi
342 fi
178 343
179 einfo " working copy: ${ESVN_STORE_DIR}/${ESVN_CO_DIR}" 344 if [[ -n "${ESVN_UMASK}" ]]; then
345 eumask_pop
346 fi
180 347
348 einfo " working copy: ${wc_path}"
349
350 if ! has "export" ${ESVN_RESTRICT}; then
351 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
352
353 local S="${S}/${S_dest}"
354 mkdir -p "${S}"
355
181 # export to the ${WORKDIR} 356 # export to the ${WORKDIR}
182 # "svn export" has a bug. see http://bugs.gentoo.org/119236 357 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
183 #svn export "${ESVN_STORE_DIR}/${ESVN_CO_DIR}" "${S}" || die "${ESVN}: can't export to ${S}." 358 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
184 rsync -a --exclude=".svn/" "${ESVN_STORE_DIR}/${ESVN_CO_DIR}/" "${S}" || die "${ESVN}: can't export to ${S}." 359 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
360 fi
361
362 popd >/dev/null
185 echo 363 echo
186
187} 364}
188 365
189 366# @FUNCTION: subversion_bootstrap
190## -- subversion_bootstrap() ------------------------------------------------ # 367# @DESCRIPTION:
191 368# Apply patches in ${ESVN_PATCHES} and run ${ESVN_BOOTSTRAP} if specified.
192function subversion_bootstrap() { 369subversion_bootstrap() {
193 370 if has "export" ${ESVN_RESTRICT}; then
194 local patch lpatch 371 return
372 fi
195 373
196 cd "${S}" 374 cd "${S}"
197 375
198 if [ "${ESVN_PATCHES}" ]; then 376 if [[ -n ${ESVN_PATCHES} ]]; then
377 local patch fpatch
199 einfo "apply patches -->" 378 einfo "apply patches -->"
200
201 for patch in ${ESVN_PATCHES}; do 379 for patch in ${ESVN_PATCHES}; do
202 if [ -f "${patch}" ]; then 380 if [[ -f ${patch} ]]; then
203 epatch ${patch} 381 epatch "${patch}"
204
205 else 382 else
206 for lpatch in ${FILESDIR}/${patch}; do 383 for fpatch in ${FILESDIR}/${patch}; do
207 if [ -f "${lpatch}" ]; then 384 if [[ -f ${fpatch} ]]; then
208 epatch ${lpatch} 385 epatch "${fpatch}"
209
210 else 386 else
211 die "${ESVN}; ${patch} is not found" 387 die "${ESVN}: ${patch} not found"
212
213 fi 388 fi
214 done 389 done
215 fi 390 fi
216 done 391 done
217 echo 392 echo
218 fi 393 fi
219 394
220 if [ "${ESVN_BOOTSTRAP}" ]; then 395 if [[ -n ${ESVN_BOOTSTRAP} ]]; then
221 einfo "begin bootstrap -->" 396 einfo "begin bootstrap -->"
222
223 if [ -f "${ESVN_BOOTSTRAP}" -a -x "${ESVN_BOOTSTRAP}" ]; then 397 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then
224 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}" 398 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
225 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP." 399 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
226
227 else 400 else
228 einfo " bootstrap with commands: ${ESVN_BOOTSTRAP}" 401 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
229 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP." 402 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
230
231 fi
232 fi 403 fi
233 404 fi
234} 405}
235 406
407# @FUNCTION: subversion_wc_info
408# @USAGE: [repo_uri]
409# @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH
410# @DESCRIPTION:
411# Get svn info for the specified repo_uri. The default repo_uri is ESVN_REPO_URI.
412#
413# The working copy information on the specified repository URI are set to
414# ESVN_WC_* variables.
415subversion_wc_info() {
416 local repo_uri="$(subversion__get_repository_uri "${1:-${ESVN_REPO_URI}}")"
417 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
236 418
237## -- subversion_src_unpack() ------------------------------------------------ # 419 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
420 debug-print "${FUNCNAME}: wc_path = ${wc_path}"
238 421
422 if [[ ! -d ${wc_path} ]]; then
423 return 1
424 fi
425
426 export ESVN_WC_URL="$(subversion__svn_info "${wc_path}" "URL")"
427 export ESVN_WC_ROOT="$(subversion__svn_info "${wc_path}" "Repository Root")"
428 export ESVN_WC_UUID="$(subversion__svn_info "${wc_path}" "Repository UUID")"
429 export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")"
430 export ESVN_WC_PATH="${wc_path}"
431}
432
433# @FUNCTION: subversion_src_unpack
434# @DESCRIPTION:
435# Default src_unpack. Fetch and, in older EAPIs, bootstrap.
239function subversion_src_unpack() { 436subversion_src_unpack() {
240
241 subversion_svn_fetch || die "${ESVN}: unknown problem in subversion_svn_fetch()." 437 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
438 if has "${EAPI:-0}" 0 1; then
439 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
440 fi
441}
442
443# @FUNCTION: subversion_src_prepare
444# @DESCRIPTION:
445# Default src_prepare. Bootstrap.
446subversion_src_prepare() {
242 subversion_bootstrap || die "${ESVN}: unknown problem in subversion_bootstrap()." 447 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
243
244} 448}
449
450# @FUNCTION: subversion_pkg_preinst
451# @USAGE: [repo_uri]
452# @DESCRIPTION:
453# Log the svn revision of source code. Doing this in pkg_preinst because we
454# want the logs to stick around if packages are uninstalled without messing with
455# config protection.
456subversion_pkg_preinst() {
457 local pkgdate=$(date "+%Y%m%d %H:%M:%S")
458 subversion_wc_info "${1}"
459 if [[ -n ${ESCM_LOGDIR} ]]; then
460 local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}"
461 if [[ ! -d ${dir} ]]; then
462 mkdir -p "${dir}" || eerror "Failed to create '${dir}' for logging svn revision"
463 fi
464 local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}"
465 if [[ -d ${dir} ]]; then
466 echo "${logmessage}" >>"${dir}/${PN}.log"
467 else
468 eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'"
469 fi
470 fi
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.31  
changed lines
  Added in v.1.80

  ViewVC Help
Powered by ViewVC 1.1.20