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

Contents of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.60 - (show annotations) (download)
Tue May 27 09:49:09 2008 UTC (6 years, 4 months ago) by zlin
Branch: MAIN
Changes since 1.59: +2 -1 lines
Make sure S exists thanks to Peter Volkov (pva) on bug #223813.

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

  ViewVC Help
Powered by ViewVC 1.1.20