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

Contents of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.48 - (hide annotations) (download)
Wed Feb 20 19:18:53 2008 UTC (6 years, 8 months ago) by cardoe
Branch: MAIN
Changes since 1.47: +21 -9 lines
add ESVN_SWITCH_CMD and use svn switch as necessary

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

  ViewVC Help
Powered by ViewVC 1.1.20