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

Contents of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.52 - (hide annotations) (download)
Wed Feb 20 22:35:40 2008 UTC (6 years, 8 months ago) by zlin
Branch: MAIN
Changes since 1.51: +34 -16 lines
Add support for ESVN_UP_FREQ.

1 hattya 1.45 # Copyright 1999-2008 Gentoo Foundation
2 hattya 1.1 # Distributed under the terms of the GNU General Public License v2
3 zlin 1.52 # $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.51 2008/02/20 22:28:49 zlin Exp $
4 hattya 1.1
5 zlin 1.46 # @ECLASS: subversion.eclass
6     # @MAINTAINER:
7     # Akinori Hattori <hattya@gentoo.org>
8     # Bo ├śrsted Andresen <zlin@gentoo.org>
9 swegener 1.23 #
10 zlin 1.46 # Original Author: Akinori Hattori <hattya@gentoo.org>
11 hattya 1.1 #
12 zlin 1.46 # @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 hattya 1.1
17 hattya 1.8 inherit eutils
18 hattya 1.1
19 zlin 1.46 ESVN="${ECLASS}"
20 hattya 1.1
21 zlin 1.50 EXPORT_FUNCTIONS src_unpack pkg_preinst
22 hattya 1.1
23 hattya 1.5 DESCRIPTION="Based on the ${ECLASS} eclass"
24 hattya 1.1
25 zlin 1.46 DEPEND="dev-util/subversion
26     net-misc/rsync"
27 hattya 1.1
28 zlin 1.46 # @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 hattya 1.25 ESVN_FETCH_CMD="svn checkout"
37    
38 zlin 1.46 # @ECLASS-VARIABLE: ESVN_UPDATE_CMD
39     # @DESCRIPTION:
40     # subversion update command
41 hattya 1.25 ESVN_UPDATE_CMD="svn update"
42 hattya 1.1
43 cardoe 1.48 # @ECLASS-VARIABLE: ESVN_SWITCH_CMD
44     # @DESCRIPTION:
45     # subversion switch command
46     ESVN_SWITCH_CMD="svn switch"
47    
48 zlin 1.46 # @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 hattya 1.1 #
58 zlin 1.46 # e.g. http://foo/trunk, svn://bar/trunk, svn://bar/branch/foo@1234
59 hattya 1.12 #
60     # supported protocols:
61     # http://
62     # https://
63     # svn://
64 hattya 1.33 # svn+ssh://
65 hattya 1.1 #
66 zlin 1.46 # to peg to a specific revision, append @REV to the repo's uri
67     ESVN_REPO_URI="${ESVN_REPO_URI:-}"
68 hattya 1.1
69 cardoe 1.47 # @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 zlin 1.46 # @ECLASS-VARIABLE: ESVN_PROJECT
80     # @DESCRIPTION:
81     # project name of your ebuild (= name space)
82 hattya 1.1 #
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 hattya 1.33 # 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 hattya 1.1 # default: ${PN/-svn}.
100 zlin 1.46 ESVN_PROJECT="${ESVN_PROJECT:-${PN/-svn}}"
101 hattya 1.1
102 zlin 1.46 # @ECLASS-VARIABLE: ESVN_BOOTSTRAP
103     # @DESCRIPTION:
104 hattya 1.8 # bootstrap script or command like autogen.sh or etc..
105 zlin 1.46 ESVN_BOOTSTRAP="${ESVN_BOOTSTRAP:-}"
106 hattya 1.1
107 zlin 1.46 # @ECLASS-VARIABLE: ESVN_PATCHES
108     # @DESCRIPTION:
109     # subversion eclass can apply patches in subversion_bootstrap().
110 peper 1.43 # 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 hattya 1.8 #
113 zlin 1.46 # Patches are searched both in ${PWD} and ${FILESDIR}, if not found in either
114     # location, the installation dies.
115     ESVN_PATCHES="${ESVN_PATCHES:-}"
116 hattya 1.33
117 zlin 1.46 # @ECLASS-VARIABLE: ESVN_RESTRICT
118     # @DESCRIPTION:
119 hattya 1.39 # this should be a space delimited list of subversion eclass features to
120     # restrict.
121 hattya 1.33 # export)
122     # don't export the working copy to S.
123 zlin 1.46 ESVN_RESTRICT="${ESVN_RESTRICT:-}"
124 hattya 1.45
125 zlin 1.49 # @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 zlin 1.52 # @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 zlin 1.50 # @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 zlin 1.46 # @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 cardoe 1.47 local repo_uri="$(subversion__get_repository_uri "${1:-${ESVN_REPO_URI}}")"
158     local revision="$(subversion__get_peg_revision "${1:-${ESVN_REPO_URI}}")"
159 hattya 1.39 local S_dest="${2}"
160 hattya 1.25
161 zlin 1.51 if [[ -z ${repo_uri} ]]; then
162     die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
163     fi
164    
165 cardoe 1.47 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}"
166    
167 hattya 1.33 # check for the protocol
168 hattya 1.39 local protocol="${repo_uri%%:*}"
169 hattya 1.1
170 hattya 1.33 case "${protocol}" in
171 vapier 1.24 http|https)
172 hattya 1.25 if built_with_use dev-util/subversion nowebdav; then
173 hattya 1.34 echo
174 vapier 1.24 eerror "In order to emerge this package, you need to"
175     eerror "re-emerge subversion with USE=-nowebdav"
176 hattya 1.34 echo
177     die "${ESVN}: please run 'USE=-nowebdav emerge subversion'"
178 vapier 1.24 fi
179     ;;
180 hattya 1.33 svn|svn+ssh)
181     ;;
182 hattya 1.5 *)
183 zlin 1.46 die "${ESVN}: fetch from '${protocol}' is not yet implemented."
184 hattya 1.5 ;;
185     esac
186 hattya 1.1
187 hattya 1.38 addread "/etc/subversion"
188     addwrite "${ESVN_STORE_DIR}"
189    
190 zlin 1.46 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
191 hattya 1.17 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
192 hattya 1.33 mkdir -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
193 hattya 1.1 fi
194    
195 hattya 1.33 cd "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
196 hattya 1.1
197 hattya 1.39 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
198 hattya 1.38 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
199 hattya 1.1
200 cardoe 1.47 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
201    
202     if [[ "${ESVN_OPTIONS}" = *-r* ]]; then
203     ewarn "\${ESVN_OPTIONS} contains -r, this usage is unsupported. Please"
204     ewarn "see \${ESVN_REPO_URI}"
205     fi
206    
207 hattya 1.39 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
208 hattya 1.25 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
209 hattya 1.38 debug-print "${FUNCNAME}: options = \"${options}\""
210 joker 1.37
211 zlin 1.46 if [[ ! -d ${wc_path}/.svn ]]; then
212 hattya 1.1 # first check out
213     einfo "subversion check out start -->"
214 cardoe 1.47 einfo " repository: ${repo_uri}${revision:+@}${revision}"
215 hattya 1.1
216 hattya 1.39 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
217    
218     mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
219     cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
220 hattya 1.38 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}."
221 hattya 1.12
222 zlin 1.49 elif [[ -n ${ESVN_OFFLINE} ]]; then
223     subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
224     if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then
225     die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally."
226     fi
227     einfo "Fetching disabled: Using existing repository copy"
228 hattya 1.1 else
229 peper 1.44 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
230 hattya 1.45
231 zlin 1.52 local esvn_up_freq=
232     if [[ -n ${ESVN_UP_FREQ} ]]; then
233     if [[ -n ${ESVN_UP_FREQ//[[:digit:]]} ]]; then
234     die "${ESVN}: ESVN_UP_FREQ must be an integer value corresponding to the minimum number of hours between svn up."
235     elif [[ -z $(find "${wc_path}/.svn/entries" -mmin "+$((ESVN_UP_FREQ*60))") ]]; then
236     einfo "Fetching disabled since ${ESVN_UP_FREQ} hours hasn't passed since last update."
237     esvn_up_freq=no_update
238     fi
239     fi
240    
241     if [[ -z ${esvn_up_freq} ]]; then
242     if [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then
243     einfo "suversion switch start -->"
244     einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}"
245     einfo " new repository: ${repo_uri}${revision:+@}${revision}"
246 cardoe 1.48
247 zlin 1.52 debug-print "${FUNCNAME}: ${ESVN_SWITCH_CMD} ${options} ${repo_uri}"
248 hattya 1.34
249 zlin 1.52 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
250     ${ESVN_SWITCH_CMD} ${options} ${repo_uri} || die "${ESVN}: can't update from ${repo_uri}"
251     else
252     # update working copy
253     einfo "subversion update start -->"
254     einfo " repository: ${repo_uri}${revision:+@}${revision}"
255 hattya 1.25
256 zlin 1.52 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
257 hattya 1.39
258 zlin 1.52 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
259     ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update from ${repo_uri}."
260     fi
261 cardoe 1.48 fi
262 peper 1.43 fi
263 hattya 1.1
264 hattya 1.39 einfo " working copy: ${wc_path}"
265 hattya 1.33
266     if ! has "export" ${ESVN_RESTRICT}; then
267 hattya 1.39 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
268    
269     local S="${S}/${S_dest}"
270 hattya 1.33
271     # export to the ${WORKDIR}
272     #* "svn export" has a bug. see http://bugs.gentoo.org/119236
273     #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
274     rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
275     fi
276 hattya 1.1
277 hattya 1.8 echo
278 hattya 1.1 }
279    
280 zlin 1.46 # @FUNCTION: subversion_bootstrap
281     # @DESCRIPTION:
282     # Apply patches in ${ESVN_PATCHES} and run ${ESVN_BOOTSTRAP} if specified.
283     subversion_bootstrap() {
284 hattya 1.33 if has "export" ${ESVN_RESTRICT}; then
285     return
286     fi
287 hattya 1.1
288 hattya 1.8 cd "${S}"
289    
290 zlin 1.46 if [[ -n ${ESVN_PATCHES} ]]; then
291 hattya 1.15 einfo "apply patches -->"
292 hattya 1.12
293 peper 1.43 local patch fpatch
294 hattya 1.45
295 peper 1.43 for patch in ${ESVN_PATCHES}; do
296 zlin 1.46 if [[ -f ${patch} ]]; then
297 peper 1.43 epatch "${patch}"
298 hattya 1.45
299 hattya 1.8 else
300 peper 1.43 for fpatch in ${FILESDIR}/${patch}; do
301 zlin 1.46 if [[ -f ${fpatch} ]]; then
302 peper 1.43 epatch "${fpatch}"
303 hattya 1.45
304 hattya 1.8 else
305 peper 1.43 die "${ESVN}: ${patch} not found"
306 hattya 1.45
307 hattya 1.8 fi
308     done
309 hattya 1.45
310 hattya 1.8 fi
311     done
312 hattya 1.45
313 hattya 1.8 echo
314     fi
315    
316 zlin 1.46 if [[ -n ${ESVN_BOOTSTRAP} ]]; then
317 hattya 1.8 einfo "begin bootstrap -->"
318 hattya 1.12
319 zlin 1.46 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then
320 hattya 1.8 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
321     eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
322 hattya 1.45
323 hattya 1.8 else
324 peper 1.43 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
325 hattya 1.8 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
326 hattya 1.45
327 hattya 1.1 fi
328     fi
329     }
330    
331 zlin 1.46 # @FUNCTION: subversion_src_unpack
332     # @DESCRIPTION:
333     # default src_unpack. fetch and bootstrap.
334     subversion_src_unpack() {
335 hattya 1.34 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
336     subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
337 hattya 1.1 }
338 hattya 1.33
339 zlin 1.46 # @FUNCTION: subversion_wc_info
340     # @USAGE: [repo_uri]
341 cardoe 1.47 # @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH
342 zlin 1.46 # @DESCRIPTION:
343     # Get svn info for the specified repo_uri. The default repo_uri is ESVN_REPO_URI.
344 hattya 1.39 #
345 zlin 1.46 # The working copy information on the specified repository URI are set to
346 hattya 1.45 # ESVN_WC_* variables.
347 zlin 1.46 subversion_wc_info() {
348 hattya 1.39 local repo_uri="$(subversion__get_repository_uri "${1}")"
349     local wc_path="$(subversion__get_wc_path "${repo_uri}")"
350    
351     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
352     debug-print "${FUNCNAME}: wc_path = ${wc_path}"
353    
354 zlin 1.46 if [[ ! -d ${wc_path} ]]; then
355 hattya 1.39 return 1
356     fi
357    
358 cardoe 1.47 export ESVN_WC_URL="$(subversion__svn_info "${wc_path}" "URL")"
359     export ESVN_WC_ROOT="$(subversion__svn_info "${wc_path}" "Repository Root")"
360     export ESVN_WC_UUID="$(subversion__svn_info "${wc_path}" "Repository UUID")"
361     export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")"
362 hattya 1.45 export ESVN_WC_PATH="${wc_path}"
363 hattya 1.39 }
364    
365     ## -- Private Functions
366    
367     ## -- subversion__svn_info() ------------------------------------------------- #
368     #
369 zlin 1.46 # param $1 - a target.
370     # param $2 - a key name.
371 hattya 1.39 #
372 zlin 1.46 subversion__svn_info() {
373 hattya 1.39 local target="${1}"
374     local key="${2}"
375    
376     env LC_ALL=C svn info "${target}" | grep -i "^${key}" | cut -d" " -f2-
377     }
378    
379     ## -- subversion__get_repository_uri() --------------------------------------- #
380     #
381 zlin 1.46 # param $1 - a repository URI.
382     subversion__get_repository_uri() {
383 cardoe 1.47 local repo_uri="${1}"
384 hattya 1.39
385     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
386 hattya 1.33
387 zlin 1.46 if [[ -z ${repo_uri} ]]; then
388 hattya 1.39 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
389     fi
390 hattya 1.33
391     # delete trailing slash
392 zlin 1.46 if [[ -z ${repo_uri##*/} ]]; then
393 hattya 1.33 repo_uri="${repo_uri%/}"
394     fi
395    
396 cardoe 1.47 repo_uri="${repo_uri%@*}"
397 hattya 1.39
398     echo "${repo_uri}"
399     }
400    
401     ## -- subversion__get_wc_path() ---------------------------------------------- #
402     #
403 zlin 1.46 # param $1 - a repository URI.
404     subversion__get_wc_path() {
405 cardoe 1.47 local repo_uri="$(subversion__get_repository_uri "${1}")"
406 hattya 1.39
407     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
408    
409     echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
410     }
411    
412 cardoe 1.47 ## -- subversion__get_peg_revision() ----------------------------------------- #
413 hattya 1.39 #
414 zlin 1.46 # param $1 - a repository URI.
415 cardoe 1.47 subversion__get_peg_revision() {
416 hattya 1.39 local repo_uri="${1}"
417    
418     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
419    
420     # repo_uri has peg revision ?
421 zlin 1.46 if [[ ${repo_uri} != *@* ]]; then
422 hattya 1.39 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
423 hattya 1.33 fi
424 zlin 1.49
425 cardoe 1.47 local peg_rev=
426     [[ ${repo_uri} = *@* ]] && peg_rev="${repo_uri##*@}"
427 hattya 1.33
428 hattya 1.39 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
429    
430 cardoe 1.47 echo "${peg_rev}"
431 hattya 1.33 }
432 zlin 1.50
433     # @FUNCTION: subversion_pkg_preinst
434     # @DESCRIPTION:
435     # Log the svn revision of source code. Doing this in pkg_preinst because we
436     # want the logs to stick around if packages are uninstalled without messing with
437     # config protection.
438     subversion_pkg_preinst() {
439     local pkgdate=$(date "+%Y%m%d %H:%M:%S")
440     subversion_wc_info
441     if [[ -n ${ESCM_LOGDIR} ]]; then
442     local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}"
443     if [[ ! -d ${dir} ]]; then
444     mkdir -p "${dir}" || \
445     eerror "Failed to create '${dir}' for logging svn revision to '${PORTDIR_SCM}'"
446     fi
447     local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}"
448     if [[ -d ${dir} ]]; then
449     echo "${logmessage}" >> "${dir}/${PN}.log"
450     else
451     eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'"
452     fi
453     fi
454 zlin 1.51 }

  ViewVC Help
Powered by ViewVC 1.1.20