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

Contents of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.50 - (hide annotations) (download)
Wed Feb 20 20:36:30 2008 UTC (6 years, 6 months ago) by zlin
Branch: MAIN
Changes since 1.49: +33 -2 lines
Add support for ESCM_LOGDIR using pkg_preinst.

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

  ViewVC Help
Powered by ViewVC 1.1.20