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

Contents of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.47 - (hide annotations) (download)
Wed Feb 20 17:55:27 2008 UTC (6 years, 1 month ago) by cardoe
Branch: MAIN
Changes since 1.46: +39 -54 lines
Add ESVN_REVISION support. Remove problematic to_upper function. Provide revision data to user. Provide more working copy info via ESVN_WC_* variables. All this couldn't have been done without kojiro's help.

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.47 # $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.46 2008/02/20 17:11:34 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     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 zlin 1.46 # @ECLASS-VARIABLE: ESVN_OPTIONS
46     # @DESCRIPTION:
47     # the options passed to checkout or update. If you want a specific revision see
48     # ESVN_REPO_URI instead of using -rREV.
49     ESVN_OPTIONS="${ESVN_OPTIONS:-}"
50    
51     # @ECLASS-VARIABLE: ESVN_REPO_URI
52     # @DESCRIPTION:
53     # repository uri
54 hattya 1.1 #
55 zlin 1.46 # e.g. http://foo/trunk, svn://bar/trunk, svn://bar/branch/foo@1234
56 hattya 1.12 #
57     # supported protocols:
58     # http://
59     # https://
60     # svn://
61 hattya 1.33 # svn+ssh://
62 hattya 1.1 #
63 zlin 1.46 # to peg to a specific revision, append @REV to the repo's uri
64     ESVN_REPO_URI="${ESVN_REPO_URI:-}"
65 hattya 1.1
66 cardoe 1.47 # @ECLASS-VARIABLE: ESVN_REVISION
67     # @DESCRIPTION:
68     # User configurable revision checkout or update to from the repository
69     #
70     # Useful for live svn or trunk svn ebuilds allowing the user to peg
71     # to a specific revision
72     #
73     # Note: This should never be set in an ebuild!
74     ESVN_REVISION="${ESVN_REVISION:-}"
75    
76 zlin 1.46 # @ECLASS-VARIABLE: ESVN_PROJECT
77     # @DESCRIPTION:
78     # project name of your ebuild (= name space)
79 hattya 1.1 #
80     # subversion eclass will check out the subversion repository like:
81     #
82     # ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/}
83     #
84     # so if you define ESVN_REPO_URI as http://svn.collab.net/repo/svn/trunk or
85     # http://svn.collab.net/repo/svn/trunk/. and PN is subversion-svn.
86     # it will check out like:
87     #
88     # ${ESVN_STORE_DIR}/subversion/trunk
89     #
90 hattya 1.33 # this is not used in order to declare the name of the upstream project.
91     # so that you can declare this like:
92     #
93     # # jakarta commons-loggin
94     # ESVN_PROJECT=commons/logging
95     #
96 hattya 1.1 # default: ${PN/-svn}.
97 zlin 1.46 ESVN_PROJECT="${ESVN_PROJECT:-${PN/-svn}}"
98 hattya 1.1
99 zlin 1.46 # @ECLASS-VARIABLE: ESVN_BOOTSTRAP
100     # @DESCRIPTION:
101 hattya 1.8 # bootstrap script or command like autogen.sh or etc..
102 zlin 1.46 ESVN_BOOTSTRAP="${ESVN_BOOTSTRAP:-}"
103 hattya 1.1
104 zlin 1.46 # @ECLASS-VARIABLE: ESVN_PATCHES
105     # @DESCRIPTION:
106     # subversion eclass can apply patches in subversion_bootstrap().
107 peper 1.43 # you can use regexp in this variable like *.diff or *.patch or etc.
108     # NOTE: patches will be applied before ESVN_BOOTSTRAP is processed.
109 hattya 1.8 #
110 zlin 1.46 # Patches are searched both in ${PWD} and ${FILESDIR}, if not found in either
111     # location, the installation dies.
112     ESVN_PATCHES="${ESVN_PATCHES:-}"
113 hattya 1.33
114 zlin 1.46 # @ECLASS-VARIABLE: ESVN_RESTRICT
115     # @DESCRIPTION:
116 hattya 1.39 # this should be a space delimited list of subversion eclass features to
117     # restrict.
118 hattya 1.33 # export)
119     # don't export the working copy to S.
120 zlin 1.46 ESVN_RESTRICT="${ESVN_RESTRICT:-}"
121 hattya 1.45
122 zlin 1.46 # @FUNCTION: subversion_fetch
123     # @USAGE: [repo_uri] [destination]
124     # @DESCRIPTION:
125     # Wrapper function to fetch sources from subversion via svn checkout or svn update,
126     # depending on whether there is an existing working copy in ${ESVN_STORE_DIR}.
127     #
128     # Can take two optional parameters:
129     # repo_uri - a repository URI. default is ESVN_REPO_URI.
130     # destination - a check out path in S.
131     subversion_fetch() {
132 cardoe 1.47 local repo_uri="$(subversion__get_repository_uri "${1:-${ESVN_REPO_URI}}")"
133     local revision="$(subversion__get_peg_revision "${1:-${ESVN_REPO_URI}}")"
134 hattya 1.39 local S_dest="${2}"
135 hattya 1.25
136 cardoe 1.47 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}"
137    
138 hattya 1.33 # check for the protocol
139 hattya 1.39 local protocol="${repo_uri%%:*}"
140 hattya 1.1
141 hattya 1.33 case "${protocol}" in
142 vapier 1.24 http|https)
143 hattya 1.25 if built_with_use dev-util/subversion nowebdav; then
144 hattya 1.34 echo
145 vapier 1.24 eerror "In order to emerge this package, you need to"
146     eerror "re-emerge subversion with USE=-nowebdav"
147 hattya 1.34 echo
148     die "${ESVN}: please run 'USE=-nowebdav emerge subversion'"
149 vapier 1.24 fi
150     ;;
151 hattya 1.33 svn|svn+ssh)
152     ;;
153 hattya 1.5 *)
154 zlin 1.46 die "${ESVN}: fetch from '${protocol}' is not yet implemented."
155 hattya 1.5 ;;
156     esac
157 hattya 1.1
158 hattya 1.38 addread "/etc/subversion"
159     addwrite "${ESVN_STORE_DIR}"
160    
161 zlin 1.46 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
162 hattya 1.17 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
163 hattya 1.33 mkdir -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
164 hattya 1.1 fi
165    
166 hattya 1.33 cd "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
167 hattya 1.1
168 hattya 1.39 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
169 hattya 1.38 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
170 hattya 1.1
171 cardoe 1.47 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
172    
173     if [[ "${ESVN_OPTIONS}" = *-r* ]]; then
174     ewarn "\${ESVN_OPTIONS} contains -r, this usage is unsupported. Please"
175     ewarn "see \${ESVN_REPO_URI}"
176     fi
177    
178 hattya 1.39 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
179 hattya 1.25 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
180 hattya 1.38 debug-print "${FUNCNAME}: options = \"${options}\""
181 joker 1.37
182 zlin 1.46 if [[ ! -d ${wc_path}/.svn ]]; then
183 hattya 1.1 # first check out
184     einfo "subversion check out start -->"
185 cardoe 1.47 einfo " repository: ${repo_uri}${revision:+@}${revision}"
186 hattya 1.1
187 hattya 1.39 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
188    
189     mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
190     cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
191 hattya 1.38 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}."
192 hattya 1.12
193 hattya 1.1 else
194 peper 1.44 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
195 hattya 1.45
196 cardoe 1.47 if [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then
197 hattya 1.38 die "${ESVN}: ESVN_REPO_URI (or specified URI) and working copy's URL are not matched."
198 hattya 1.34 fi
199    
200 hattya 1.1 # update working copy
201     einfo "subversion update start -->"
202 cardoe 1.47 einfo " repository: ${repo_uri}${revision:+@}${revision}"
203 hattya 1.25
204 hattya 1.39 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
205    
206     cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
207 hattya 1.38 ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update from ${repo_uri}."
208 hattya 1.45
209 peper 1.43 fi
210 hattya 1.1
211 hattya 1.39 einfo " working copy: ${wc_path}"
212 hattya 1.33
213     if ! has "export" ${ESVN_RESTRICT}; then
214 hattya 1.39 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
215    
216     local S="${S}/${S_dest}"
217 hattya 1.33
218     # export to the ${WORKDIR}
219     #* "svn export" has a bug. see http://bugs.gentoo.org/119236
220     #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
221     rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
222     fi
223 hattya 1.1
224 hattya 1.8 echo
225 hattya 1.1 }
226    
227 zlin 1.46 # @FUNCTION: subversion_bootstrap
228     # @DESCRIPTION:
229     # Apply patches in ${ESVN_PATCHES} and run ${ESVN_BOOTSTRAP} if specified.
230     subversion_bootstrap() {
231 hattya 1.33 if has "export" ${ESVN_RESTRICT}; then
232     return
233     fi
234 hattya 1.1
235 hattya 1.8 cd "${S}"
236    
237 zlin 1.46 if [[ -n ${ESVN_PATCHES} ]]; then
238 hattya 1.15 einfo "apply patches -->"
239 hattya 1.12
240 peper 1.43 local patch fpatch
241 hattya 1.45
242 peper 1.43 for patch in ${ESVN_PATCHES}; do
243 zlin 1.46 if [[ -f ${patch} ]]; then
244 peper 1.43 epatch "${patch}"
245 hattya 1.45
246 hattya 1.8 else
247 peper 1.43 for fpatch in ${FILESDIR}/${patch}; do
248 zlin 1.46 if [[ -f ${fpatch} ]]; then
249 peper 1.43 epatch "${fpatch}"
250 hattya 1.45
251 hattya 1.8 else
252 peper 1.43 die "${ESVN}: ${patch} not found"
253 hattya 1.45
254 hattya 1.8 fi
255     done
256 hattya 1.45
257 hattya 1.8 fi
258     done
259 hattya 1.45
260 hattya 1.8 echo
261     fi
262    
263 zlin 1.46 if [[ -n ${ESVN_BOOTSTRAP} ]]; then
264 hattya 1.8 einfo "begin bootstrap -->"
265 hattya 1.12
266 zlin 1.46 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then
267 hattya 1.8 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
268     eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
269 hattya 1.45
270 hattya 1.8 else
271 peper 1.43 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
272 hattya 1.8 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
273 hattya 1.45
274 hattya 1.1 fi
275     fi
276     }
277    
278 zlin 1.46 # @FUNCTION: subversion_src_unpack
279     # @DESCRIPTION:
280     # default src_unpack. fetch and bootstrap.
281     subversion_src_unpack() {
282 hattya 1.34 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
283     subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
284 hattya 1.1 }
285 hattya 1.33
286 zlin 1.46 # @FUNCTION: subversion_wc_info
287     # @USAGE: [repo_uri]
288 cardoe 1.47 # @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH
289 zlin 1.46 # @DESCRIPTION:
290     # Get svn info for the specified repo_uri. The default repo_uri is ESVN_REPO_URI.
291 hattya 1.39 #
292 zlin 1.46 # The working copy information on the specified repository URI are set to
293 hattya 1.45 # ESVN_WC_* variables.
294 zlin 1.46 subversion_wc_info() {
295 hattya 1.39 local repo_uri="$(subversion__get_repository_uri "${1}")"
296     local wc_path="$(subversion__get_wc_path "${repo_uri}")"
297    
298     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
299     debug-print "${FUNCNAME}: wc_path = ${wc_path}"
300    
301 zlin 1.46 if [[ ! -d ${wc_path} ]]; then
302 hattya 1.39 return 1
303     fi
304    
305 cardoe 1.47 export ESVN_WC_URL="$(subversion__svn_info "${wc_path}" "URL")"
306     export ESVN_WC_ROOT="$(subversion__svn_info "${wc_path}" "Repository Root")"
307     export ESVN_WC_UUID="$(subversion__svn_info "${wc_path}" "Repository UUID")"
308     export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")"
309 hattya 1.45 export ESVN_WC_PATH="${wc_path}"
310 hattya 1.39 }
311    
312     ## -- Private Functions
313    
314     ## -- subversion__svn_info() ------------------------------------------------- #
315     #
316 zlin 1.46 # param $1 - a target.
317     # param $2 - a key name.
318 hattya 1.39 #
319 zlin 1.46 subversion__svn_info() {
320 hattya 1.39 local target="${1}"
321     local key="${2}"
322    
323     env LC_ALL=C svn info "${target}" | grep -i "^${key}" | cut -d" " -f2-
324     }
325    
326     ## -- subversion__get_repository_uri() --------------------------------------- #
327     #
328 zlin 1.46 # param $1 - a repository URI.
329     subversion__get_repository_uri() {
330 cardoe 1.47 local repo_uri="${1}"
331 hattya 1.39
332     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
333 hattya 1.33
334 zlin 1.46 if [[ -z ${repo_uri} ]]; then
335 hattya 1.39 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
336     fi
337 hattya 1.33
338     # delete trailing slash
339 zlin 1.46 if [[ -z ${repo_uri##*/} ]]; then
340 hattya 1.33 repo_uri="${repo_uri%/}"
341     fi
342    
343 cardoe 1.47 repo_uri="${repo_uri%@*}"
344 hattya 1.39
345     echo "${repo_uri}"
346     }
347    
348     ## -- subversion__get_wc_path() ---------------------------------------------- #
349     #
350 zlin 1.46 # param $1 - a repository URI.
351     subversion__get_wc_path() {
352 cardoe 1.47 local repo_uri="$(subversion__get_repository_uri "${1}")"
353 hattya 1.39
354     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
355    
356     echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
357     }
358    
359 cardoe 1.47 ## -- subversion__get_peg_revision() ----------------------------------------- #
360 hattya 1.39 #
361 zlin 1.46 # param $1 - a repository URI.
362 cardoe 1.47 subversion__get_peg_revision() {
363 hattya 1.39 local repo_uri="${1}"
364    
365     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
366    
367     # repo_uri has peg revision ?
368 zlin 1.46 if [[ ${repo_uri} != *@* ]]; then
369 hattya 1.39 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
370 hattya 1.33 fi
371 cardoe 1.47
372     local peg_rev=
373     [[ ${repo_uri} = *@* ]] && peg_rev="${repo_uri##*@}"
374 hattya 1.33
375 hattya 1.39 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
376    
377 cardoe 1.47 echo "${peg_rev}"
378 hattya 1.33 }

  ViewVC Help
Powered by ViewVC 1.1.20