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

Contents of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.49 - (hide annotations) (download)
Wed Feb 20 20:32:00 2008 UTC (6 years, 7 months ago) by zlin
Branch: MAIN
Changes since 1.48: +15 -2 lines
Add support for ESVN_OFFLINE and ESCM_OFFLINE.

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.49 # $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.48 2008/02/20 19:18:53 cardoe 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     EXPORT_FUNCTIONS src_unpack
24    
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.46 # @FUNCTION: subversion_fetch
135     # @USAGE: [repo_uri] [destination]
136     # @DESCRIPTION:
137     # Wrapper function to fetch sources from subversion via svn checkout or svn update,
138     # depending on whether there is an existing working copy in ${ESVN_STORE_DIR}.
139     #
140     # Can take two optional parameters:
141     # repo_uri - a repository URI. default is ESVN_REPO_URI.
142     # destination - a check out path in S.
143     subversion_fetch() {
144 cardoe 1.47 local repo_uri="$(subversion__get_repository_uri "${1:-${ESVN_REPO_URI}}")"
145     local revision="$(subversion__get_peg_revision "${1:-${ESVN_REPO_URI}}")"
146 hattya 1.39 local S_dest="${2}"
147 hattya 1.25
148 cardoe 1.47 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}"
149    
150 hattya 1.33 # check for the protocol
151 hattya 1.39 local protocol="${repo_uri%%:*}"
152 hattya 1.1
153 hattya 1.33 case "${protocol}" in
154 vapier 1.24 http|https)
155 hattya 1.25 if built_with_use dev-util/subversion nowebdav; then
156 hattya 1.34 echo
157 vapier 1.24 eerror "In order to emerge this package, you need to"
158     eerror "re-emerge subversion with USE=-nowebdav"
159 hattya 1.34 echo
160     die "${ESVN}: please run 'USE=-nowebdav emerge subversion'"
161 vapier 1.24 fi
162     ;;
163 hattya 1.33 svn|svn+ssh)
164     ;;
165 hattya 1.5 *)
166 zlin 1.46 die "${ESVN}: fetch from '${protocol}' is not yet implemented."
167 hattya 1.5 ;;
168     esac
169 hattya 1.1
170 hattya 1.38 addread "/etc/subversion"
171     addwrite "${ESVN_STORE_DIR}"
172    
173 zlin 1.46 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
174 hattya 1.17 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
175 hattya 1.33 mkdir -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
176 hattya 1.1 fi
177    
178 hattya 1.33 cd "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
179 hattya 1.1
180 hattya 1.39 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
181 hattya 1.38 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
182 hattya 1.1
183 cardoe 1.47 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
184    
185     if [[ "${ESVN_OPTIONS}" = *-r* ]]; then
186     ewarn "\${ESVN_OPTIONS} contains -r, this usage is unsupported. Please"
187     ewarn "see \${ESVN_REPO_URI}"
188     fi
189    
190 hattya 1.39 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
191 hattya 1.25 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
192 hattya 1.38 debug-print "${FUNCNAME}: options = \"${options}\""
193 joker 1.37
194 zlin 1.46 if [[ ! -d ${wc_path}/.svn ]]; then
195 hattya 1.1 # first check out
196     einfo "subversion check out start -->"
197 cardoe 1.47 einfo " repository: ${repo_uri}${revision:+@}${revision}"
198 hattya 1.1
199 hattya 1.39 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
200    
201     mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
202     cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
203 hattya 1.38 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}."
204 hattya 1.12
205 zlin 1.49 elif [[ -n ${ESVN_OFFLINE} ]]; then
206     subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
207     if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then
208     die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally."
209     fi
210     einfo "Fetching disabled: Using existing repository copy"
211 hattya 1.1 else
212 peper 1.44 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
213 hattya 1.45
214 cardoe 1.47 if [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then
215 cardoe 1.48 einfo "suversion switch start -->"
216     einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}"
217     einfo " new repository: ${repo_uri}${revision:+@}${revision}"
218    
219     debug-print "${FUNCNAME}: ${ESVN_SWITCH_CMD} ${options} ${repo_uri}"
220 hattya 1.34
221 cardoe 1.48 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
222     ${ESVN_SWITCH_CMD} ${options} ${repo_uri} || die "${ESVN}: can't update from ${repo_uri}"
223     else
224     # update working copy
225     einfo "subversion update start -->"
226     einfo " repository: ${repo_uri}${revision:+@}${revision}"
227 hattya 1.25
228 cardoe 1.48 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
229 hattya 1.39
230 cardoe 1.48 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
231     ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update from ${repo_uri}."
232     fi
233 hattya 1.45
234 peper 1.43 fi
235 hattya 1.1
236 hattya 1.39 einfo " working copy: ${wc_path}"
237 hattya 1.33
238     if ! has "export" ${ESVN_RESTRICT}; then
239 hattya 1.39 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
240    
241     local S="${S}/${S_dest}"
242 hattya 1.33
243     # export to the ${WORKDIR}
244     #* "svn export" has a bug. see http://bugs.gentoo.org/119236
245     #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
246     rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
247     fi
248 hattya 1.1
249 hattya 1.8 echo
250 hattya 1.1 }
251    
252 zlin 1.46 # @FUNCTION: subversion_bootstrap
253     # @DESCRIPTION:
254     # Apply patches in ${ESVN_PATCHES} and run ${ESVN_BOOTSTRAP} if specified.
255     subversion_bootstrap() {
256 hattya 1.33 if has "export" ${ESVN_RESTRICT}; then
257     return
258     fi
259 hattya 1.1
260 hattya 1.8 cd "${S}"
261    
262 zlin 1.46 if [[ -n ${ESVN_PATCHES} ]]; then
263 hattya 1.15 einfo "apply patches -->"
264 hattya 1.12
265 peper 1.43 local patch fpatch
266 hattya 1.45
267 peper 1.43 for patch in ${ESVN_PATCHES}; do
268 zlin 1.46 if [[ -f ${patch} ]]; then
269 peper 1.43 epatch "${patch}"
270 hattya 1.45
271 hattya 1.8 else
272 peper 1.43 for fpatch in ${FILESDIR}/${patch}; do
273 zlin 1.46 if [[ -f ${fpatch} ]]; then
274 peper 1.43 epatch "${fpatch}"
275 hattya 1.45
276 hattya 1.8 else
277 peper 1.43 die "${ESVN}: ${patch} not found"
278 hattya 1.45
279 hattya 1.8 fi
280     done
281 hattya 1.45
282 hattya 1.8 fi
283     done
284 hattya 1.45
285 hattya 1.8 echo
286     fi
287    
288 zlin 1.46 if [[ -n ${ESVN_BOOTSTRAP} ]]; then
289 hattya 1.8 einfo "begin bootstrap -->"
290 hattya 1.12
291 zlin 1.46 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then
292 hattya 1.8 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
293     eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
294 hattya 1.45
295 hattya 1.8 else
296 peper 1.43 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
297 hattya 1.8 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
298 hattya 1.45
299 hattya 1.1 fi
300     fi
301     }
302    
303 zlin 1.46 # @FUNCTION: subversion_src_unpack
304     # @DESCRIPTION:
305     # default src_unpack. fetch and bootstrap.
306     subversion_src_unpack() {
307 hattya 1.34 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
308     subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
309 hattya 1.1 }
310 hattya 1.33
311 zlin 1.46 # @FUNCTION: subversion_wc_info
312     # @USAGE: [repo_uri]
313 cardoe 1.47 # @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH
314 zlin 1.46 # @DESCRIPTION:
315     # Get svn info for the specified repo_uri. The default repo_uri is ESVN_REPO_URI.
316 hattya 1.39 #
317 zlin 1.46 # The working copy information on the specified repository URI are set to
318 hattya 1.45 # ESVN_WC_* variables.
319 zlin 1.46 subversion_wc_info() {
320 hattya 1.39 local repo_uri="$(subversion__get_repository_uri "${1}")"
321     local wc_path="$(subversion__get_wc_path "${repo_uri}")"
322    
323     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
324     debug-print "${FUNCNAME}: wc_path = ${wc_path}"
325    
326 zlin 1.46 if [[ ! -d ${wc_path} ]]; then
327 hattya 1.39 return 1
328     fi
329    
330 cardoe 1.47 export ESVN_WC_URL="$(subversion__svn_info "${wc_path}" "URL")"
331     export ESVN_WC_ROOT="$(subversion__svn_info "${wc_path}" "Repository Root")"
332     export ESVN_WC_UUID="$(subversion__svn_info "${wc_path}" "Repository UUID")"
333     export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")"
334 hattya 1.45 export ESVN_WC_PATH="${wc_path}"
335 hattya 1.39 }
336    
337     ## -- Private Functions
338    
339     ## -- subversion__svn_info() ------------------------------------------------- #
340     #
341 zlin 1.46 # param $1 - a target.
342     # param $2 - a key name.
343 hattya 1.39 #
344 zlin 1.46 subversion__svn_info() {
345 hattya 1.39 local target="${1}"
346     local key="${2}"
347    
348     env LC_ALL=C svn info "${target}" | grep -i "^${key}" | cut -d" " -f2-
349     }
350    
351     ## -- subversion__get_repository_uri() --------------------------------------- #
352     #
353 zlin 1.46 # param $1 - a repository URI.
354     subversion__get_repository_uri() {
355 cardoe 1.47 local repo_uri="${1}"
356 hattya 1.39
357     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
358 hattya 1.33
359 zlin 1.46 if [[ -z ${repo_uri} ]]; then
360 hattya 1.39 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
361     fi
362 hattya 1.33
363     # delete trailing slash
364 zlin 1.46 if [[ -z ${repo_uri##*/} ]]; then
365 hattya 1.33 repo_uri="${repo_uri%/}"
366     fi
367    
368 cardoe 1.47 repo_uri="${repo_uri%@*}"
369 hattya 1.39
370     echo "${repo_uri}"
371     }
372    
373     ## -- subversion__get_wc_path() ---------------------------------------------- #
374     #
375 zlin 1.46 # param $1 - a repository URI.
376     subversion__get_wc_path() {
377 cardoe 1.47 local repo_uri="$(subversion__get_repository_uri "${1}")"
378 hattya 1.39
379     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
380    
381     echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
382     }
383    
384 cardoe 1.47 ## -- subversion__get_peg_revision() ----------------------------------------- #
385 hattya 1.39 #
386 zlin 1.46 # param $1 - a repository URI.
387 cardoe 1.47 subversion__get_peg_revision() {
388 hattya 1.39 local repo_uri="${1}"
389    
390     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
391    
392     # repo_uri has peg revision ?
393 zlin 1.46 if [[ ${repo_uri} != *@* ]]; then
394 hattya 1.39 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
395 hattya 1.33 fi
396 zlin 1.49
397 cardoe 1.47 local peg_rev=
398     [[ ${repo_uri} = *@* ]] && peg_rev="${repo_uri##*@}"
399 hattya 1.33
400 hattya 1.39 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
401    
402 cardoe 1.47 echo "${peg_rev}"
403 hattya 1.33 }

  ViewVC Help
Powered by ViewVC 1.1.20