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

Contents of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.40 - (show annotations) (download)
Sun Apr 1 12:21:09 2007 UTC (7 years, 5 months ago) by hattya
Branch: MAIN
Changes since 1.39: +2 -1 lines
fixes bug #156666

1 # Copyright 1999-2007 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.39 2007/01/19 10:39:51 hattya Exp $
4
5 ## --------------------------------------------------------------------------- #
6 # Author: Akinori Hattori <hattya@gentoo.org>
7 #
8 # The subversion eclass is written to fetch the software sources from
9 # subversion repositories like the cvs eclass.
10 #
11 #
12 # Description:
13 # If you use this eclass, the ${S} is ${WORKDIR}/${P}.
14 # It is necessary to define the ESVN_REPO_URI variable at least.
15 #
16 ## --------------------------------------------------------------------------- #
17
18 inherit eutils
19
20 ESVN="subversion.eclass"
21
22 EXPORT_FUNCTIONS src_unpack
23
24 HOMEPAGE="http://subversion.tigris.org/"
25 DESCRIPTION="Based on the ${ECLASS} eclass"
26
27
28 ## -- add subversion in DEPEND
29 #
30 DEPEND="dev-util/subversion"
31
32
33 ## -- ESVN_STORE_DIR: subversion sources store directory
34 #
35 ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/svn-src"
36
37
38 ## -- ESVN_FETCH_CMD: subversion fetch command
39 #
40 ESVN_FETCH_CMD="svn checkout"
41
42 ## -- ESVN_UPDATE_CMD: subversion update command
43 #
44 ESVN_UPDATE_CMD="svn update"
45
46
47 ## -- ESVN_OPTIONS:
48 #
49 # the options passed to checkout or update.
50 #
51 : ESVN_OPTIONS=${ESVN_OPTIONS:=}
52
53
54 ## -- ESVN_REPO_URI: repository uri
55 #
56 # e.g. http://foo/trunk, svn://bar/trunk
57 #
58 # supported protocols:
59 # http://
60 # https://
61 # svn://
62 # svn+ssh://
63 #
64 : ESVN_REPO_URI=${ESVN_REPO_URI:=}
65
66
67 ## -- ESVN_PROJECT: project name of your ebuild (= name space)
68 #
69 # subversion eclass will check out the subversion repository like:
70 #
71 # ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/}
72 #
73 # so if you define ESVN_REPO_URI as http://svn.collab.net/repo/svn/trunk or
74 # http://svn.collab.net/repo/svn/trunk/. and PN is subversion-svn.
75 # it will check out like:
76 #
77 # ${ESVN_STORE_DIR}/subversion/trunk
78 #
79 # this is not used in order to declare the name of the upstream project.
80 # so that you can declare this like:
81 #
82 # # jakarta commons-loggin
83 # ESVN_PROJECT=commons/logging
84 #
85 # default: ${PN/-svn}.
86 #
87 : ESVN_PROJECT=${ESVN_PROJECT:=${PN/-svn}}
88
89
90 ## -- ESVN_BOOTSTRAP:
91 #
92 # bootstrap script or command like autogen.sh or etc..
93 #
94 : ESVN_BOOTSTRAP=${ESVN_BOOTSTRAP:=}
95
96
97 ## -- ESVN_PATCHES:
98 #
99 # subversion eclass can apply pathces in subversion_bootstrap().
100 # you can use regexp in this valiable like *.diff or *.patch or etc.
101 # NOTE: this patches will apply before eval ESVN_BOOTSTRAP.
102 #
103 # the process of applying the patch is:
104 # 1. just epatch it, if the patch exists in the path.
105 # 2. scan it under FILESDIR and epatch it, if the patch exists in FILESDIR.
106 # 3. die.
107 #
108 : ESVN_PATCHES=${ESVN_PATCHES:=}
109
110
111 ## -- ESVN_RESTRICT:
112 #
113 # this should be a space delimited list of subversion eclass features to
114 # restrict.
115 # export)
116 # don't export the working copy to S.
117 #
118 : ESVN_RESTRICT=${ESVN_RESTRICT:=}
119
120
121 ## -- subversion_fetch() ----------------------------------------------------- #
122 #
123 # @param $1 - a repository URI. default is the ESVN_REPO_URI.
124 # @param $2 - a check out path in S.
125 #
126 function subversion_fetch() {
127
128 local repo_uri="$(subversion__get_repository_uri "${1}")"
129 local S_dest="${2}"
130
131 # check for the protocol
132 local protocol="${repo_uri%%:*}"
133
134 case "${protocol}" in
135 http|https)
136 if built_with_use dev-util/subversion nowebdav; then
137 echo
138 eerror "In order to emerge this package, you need to"
139 eerror "re-emerge subversion with USE=-nowebdav"
140 echo
141 die "${ESVN}: please run 'USE=-nowebdav emerge subversion'"
142 fi
143 ;;
144 svn|svn+ssh)
145 ;;
146 *)
147 die "${ESVN}: fetch from "${protocol}" is not yet implemented."
148 ;;
149 esac
150
151 # every time
152 addread "/etc/subversion"
153 addwrite "${ESVN_STORE_DIR}"
154
155 if [[ ! -d "${ESVN_STORE_DIR}" ]]; then
156 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
157 mkdir -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
158 fi
159
160 cd "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
161
162 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
163 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
164
165 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
166 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
167 debug-print "${FUNCNAME}: options = \"${options}\""
168
169 if [[ ! -d "${wc_path}/.svn" ]]; then
170 # first check out
171 einfo "subversion check out start -->"
172 einfo " repository: ${repo_uri}"
173
174 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
175
176 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
177 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
178 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}."
179
180 else
181 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
182
183 if [ "${ESVN_WC_URL}" != "$(subversion__get_repository_uri "${repo_uri}" 1)" ]; then
184 die "${ESVN}: ESVN_REPO_URI (or specified URI) and working copy's URL are not matched."
185 fi
186
187 # update working copy
188 einfo "subversion update start -->"
189 einfo " repository: ${repo_uri}"
190
191 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
192
193 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
194 ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update from ${repo_uri}."
195
196 fi
197
198 einfo " working copy: ${wc_path}"
199
200 if ! has "export" ${ESVN_RESTRICT}; then
201 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
202
203 local S="${S}/${S_dest}"
204
205 # export to the ${WORKDIR}
206 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
207 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
208 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
209 fi
210
211 echo
212
213 }
214
215
216 ## -- subversion_bootstrap() ------------------------------------------------ #
217 #
218 function subversion_bootstrap() {
219
220 if has "export" ${ESVN_RESTRICT}; then
221 return
222 fi
223
224 cd "${S}"
225
226 if [[ -n "${ESVN_PATCHES}" ]]; then
227 einfo "apply patches -->"
228
229 local p=
230
231 for p in ${ESVN_PATCHES}; do
232 if [[ -f "${p}" ]]; then
233 epatch "${p}"
234
235 else
236 local q=
237
238 for q in ${FILESDIR}/${p}; do
239 if [[ -f "${q}" ]]; then
240 epatch "${q}"
241
242 else
243 die "${ESVN}; ${p} is not found"
244
245 fi
246 done
247 fi
248 done
249
250 echo
251
252 fi
253
254 if [[ -n "${ESVN_BOOTSTRAP}" ]]; then
255 einfo "begin bootstrap -->"
256
257 if [[ -f "${ESVN_BOOTSTRAP}" && -x "${ESVN_BOOTSTRAP}" ]]; then
258 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
259 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
260
261 else
262 einfo " bootstrap with commands: ${ESVN_BOOTSTRAP}"
263 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
264
265 fi
266 fi
267
268 }
269
270
271 ## -- subversion_src_unpack() ------------------------------------------------ #
272 #
273 function subversion_src_unpack() {
274
275 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
276 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
277
278 }
279
280
281 ## -- subversion_wc_info() --------------------------------------------------- #
282 #
283 # @param $1 - repository URI. default is ESVN_REPO_URI.
284 #
285 function subversion_wc_info() {
286
287 local repo_uri="$(subversion__get_repository_uri "${1}")"
288 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
289
290 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
291 debug-print "${FUNCNAME}: wc_path = ${wc_path}"
292
293 if [[ ! -e "${wc_path}" ]]; then
294 return 1
295 fi
296
297 local k
298
299 for k in url revision; do
300 export ESVN_WC_$(echo "${k}" | tr "[a-z]" "[A-Z]")="$(subversion__svn_info "${wc_path}" "${k}")"
301 done
302
303 }
304
305
306 ## -- Private Functions
307
308
309 ## -- subversion__svn_info() ------------------------------------------------- #
310 #
311 # @param $1 - a target.
312 # @param $2 - a key name.
313 #
314 function subversion__svn_info() {
315
316 local target="${1}"
317 local key="${2}"
318
319 env LC_ALL=C svn info "${target}" | grep -i "^${key}" | cut -d" " -f2-
320
321 }
322
323
324 ## -- subversion__get_repository_uri() --------------------------------------- #
325 #
326 # @param $1 - a repository URI.
327 # @param $2 - a peg revision is deleted from a return value if this is
328 # specified.
329 #
330 function subversion__get_repository_uri() {
331
332 local repo_uri="${1:-${ESVN_REPO_URI}}"
333 local remove_peg_revision="${2}"
334
335 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
336 debug-print "${FUNCNAME}: remove_peg_revision = ${remove_peg_revision}"
337
338 if [[ -z "${repo_uri}" ]]; then
339 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
340 fi
341
342 # delete trailing slash
343 if [[ -z "${repo_uri##*/}" ]]; then
344 repo_uri="${repo_uri%/}"
345 fi
346
347 if [[ -n "${remove_peg_revision}" ]]; then
348 if subversion__has_peg_revision "${repo_uri}"; then
349 repo_uri="${repo_uri%@*}"
350
351 debug-print "${FUNCNAME}: repo_uri has a peg revision"
352 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
353 fi
354 fi
355
356 echo "${repo_uri}"
357
358 }
359
360
361 ## -- subversion__get_wc_path() ---------------------------------------------- #
362 #
363 # @param $1 - a repository URI.
364 #
365 function subversion__get_wc_path() {
366
367 local repo_uri="$(subversion__get_repository_uri "${1}" 1)"
368
369 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
370
371 echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
372
373 }
374
375
376 ## -- subversion__has_peg_revision() ----------------------------------------- #
377 #
378 # @param $1 - a repository URI.
379 #
380 function subversion__has_peg_revision() {
381
382 local repo_uri="${1}"
383
384 debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
385
386 # repo_uri has peg revision ?
387 if [[ "${repo_uri}" != *@* ]]; then
388 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
389 return 1
390 fi
391
392 local peg_rev="${repo_uri##*@}"
393 local rev=$(subversion__svn_info "${repo_uri}" "revision")
394
395 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
396 debug-print "${FUNCNAME}: rev = ${rev} "
397
398 if [[ "${peg_rev}" -eq "${rev}" ]]; then
399 return 0
400 fi
401
402 return 1
403
404 }

  ViewVC Help
Powered by ViewVC 1.1.20