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

Contents of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.46 - (hide annotations) (download)
Wed Feb 20 17:11:34 2008 UTC (6 years, 2 months ago) by zlin
Branch: MAIN
Changes since 1.45: +104 -142 lines
Document subversion.eclass for use with eclass-manpages. Add myself to maintainers.

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

  ViewVC Help
Powered by ViewVC 1.1.20