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

Diff of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.45

  ViewVC Help
Powered by ViewVC 1.1.20