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