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

Diff of /eclass/subversion.eclass

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

Revision 1.4 Revision 1.41
1# Copyright 1999-2004 Gentoo Technologies, Inc. 1# Copyright 1999-2007 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.4 2004/02/08 14:37:59 hattya Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.41 2007/04/01 14:48:37 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/" 24HOMEPAGE="http://subversion.tigris.org/"
25DESCRIPTION="Based on the ${ECLASS} eclass"
25 26
26 27
27## -- add subversion in DEPEND 28## -- add subversion in DEPEND
28# 29#
29newdepend "dev-util/subversion" 30DEPEND="dev-util/subversion"
30 31
31 32
32## -- ESVN_STORE_DIR: subversion sources store directory 33## -- ESVN_STORE_DIR: subversion sources store directory
33# 34#
34ESVN_STORE_DIR="${DISTDIR}/svn-src" 35ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/svn-src"
35 36
36 37
37## -- ESVN_FETCH_CMD: subversion fetch command 38## -- ESVN_FETCH_CMD: subversion fetch command
38# 39#
39# default: svn checkout 40ESVN_FETCH_CMD="svn checkout"
40#
41[ -z "${ESVN_FETCH_CMD}" ] && ESVN_FETCH_CMD="svn checkout"
42 41
43## -- ESVN_UPDATE_CMD: subversion update command 42## -- ESVN_UPDATE_CMD: subversion update command
44# 43#
45# default: svn update 44ESVN_UPDATE_CMD="svn update"
45
46
47## -- ESVN_OPTIONS:
46# 48#
47[ -z "${ESVN_UPDATE_CMD}" ] && ESVN_UPDATE_CMD="svn update" 49# the options passed to checkout or update.
50#
51: ESVN_OPTIONS=${ESVN_OPTIONS:=}
48 52
49 53
50## -- ESVN_REPO_URI: repository uri 54## -- ESVN_REPO_URI: repository uri
51# 55#
52# e.g. http://foo/trunk, svn://bar/trunk 56# e.g. http://foo/trunk, svn://bar/trunk
53# but currentry support http only.
54# 57#
55[ -z "${ESVN_REPO_URI}" ] && ESVN_REPO_URI="" 58# supported protocols:
59# http://
60# https://
61# svn://
62# svn+ssh://
63#
64: ESVN_REPO_URI=${ESVN_REPO_URI:=}
56 65
57 66
58## -- ESVN_PROJECT: project name of your ebuild 67## -- ESVN_PROJECT: project name of your ebuild (= name space)
59# 68#
60# subversion eclass will check out the subversion repository like: 69# subversion eclass will check out the subversion repository like:
61# 70#
62# ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/} 71# ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/}
63# 72#
65# http://svn.collab.net/repo/svn/trunk/. and PN is subversion-svn. 74# http://svn.collab.net/repo/svn/trunk/. and PN is subversion-svn.
66# it will check out like: 75# it will check out like:
67# 76#
68# ${ESVN_STORE_DIR}/subversion/trunk 77# ${ESVN_STORE_DIR}/subversion/trunk
69# 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#
70# default: ${PN/-svn}. 85# default: ${PN/-svn}.
71# 86#
72[ -z "${ESVN_PROJECT}" ] && ESVN_PROJECT="${PN/-svn}" 87: ESVN_PROJECT=${ESVN_PROJECT:=${PN/-svn}}
73 88
74 89
75## -- ESVN_BOOTSTRAP: 90## -- ESVN_BOOTSTRAP:
76# 91#
77# bootstrap script. like autogen.sh or etc.. 92# bootstrap script or command like autogen.sh or etc..
78# 93#
79[ -z "${ESVN_BOOTSTRAP}" ] && ESVN_BOOTSTRAP="" 94: ESVN_BOOTSTRAP=${ESVN_BOOTSTRAP:=}
80 95
81 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
82## -- subversion_svn_fetch() ------------------------------------------------- # 121## -- subversion_fetch() ----------------------------------------------------- #
83 122#
123# @param $1 - a repository URI. default is the ESVN_REPO_URI.
124# @param $2 - a check out path in S.
125#
84subversion_svn_fetch() { 126function subversion_fetch() {
85 127
86 # http only... 128 local repo_uri="$(subversion__get_repository_uri "${1}")"
87 if [ "${ESVN_REPO_URI%%:*}" != "http" ]; then 129 local S_dest="${2}"
88 if [ -z "${ESVN_REPO_URI}" ]; then
89 die "subversion.eclass: ESVN_REPO_URI is empty."
90 130
91 else 131 # check for the protocol
92 die "subversion.eclass: fetch from "${ESVN_REPO_URI%:*}" is not yet implemented." 132 local protocol="${repo_uri%%:*}"
93 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'"
94 fi 142 fi
95 fi 143 ;;
96 144 svn|svn+ssh)
97 if [ ! -d "${ESVN_STORE_DIR}" ]; then 145 ;;
98 # I don't know why this causes access violation. 146 *)
99 addwrite "${ESVN_STORE_DIR}" 147 die "${ESVN}: fetch from "${protocol}" is not yet implemented."
100 148 ;;
101 mkdir -p "${ESVN_STORE_DIR}" || die "subversion.eclass: can't mkdir ${ESVN_STORE_DIR}." 149 esac
102 einfo "created store directory: ${ESVN_STORE_DIR}"
103 einfo
104 fi
105
106 cd "${ESVN_STORE_DIR}" || die "subversion.eclass: can't cd to ${ESVN_STORE_DIR}."
107 150
108 # every time 151 # every time
109 addwrite "/etc/subversion" 152 addread "/etc/subversion"
153 addwrite "${ESVN_STORE_DIR}"
110 154
111 # -userpriv
112 addwrite "/root/.subversion"
113
114 einfo
115
116 if [ -z ${ESVN_REPO_URI##*/} ]; then
117 ESVN_REPO_FIX="${ESVN_REPO_FIX%/}"
118 fi
119
120 ESVN_CO_DIR="${ESVN_PROJECT}/${ESVN_REPO_URI##*/}"
121
122 if [ ! -d "${ESVN_CO_DIR}/.svn" ]; then 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
123 # first check out 170 # first check out
124 einfo "subversion check out start -->" 171 einfo "subversion check out start -->"
125 einfo 172 einfo " repository: ${repo_uri}"
126 einfo "check out from: ${ESVN_REPO_URI}"
127 173
174 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
175
128 mkdir -p "${ESVN_PROJECT}" || die "subversion.eclass: can't mkdir ${ESVN_PROJECT}." 176 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
129 cd "${ESVN_PROJECT}" || die "subversion.eclass: can't cd to ${ESVN_PROJECT}." 177 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
130 178 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}."
131 ${ESVN_FETCH_CMD} "${ESVN_REPO_URI}" || die "subversion.eclass: can't fetch from ${ESVN_REPO_URI}."
132 einfo " stored in: ${ESVN_STORE_DIR}/${ESVN_CO_DIR}"
133 179
134 else 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
135 # update working copy 187 # update working copy
136 einfo "subversion update start -->" 188 einfo "subversion update start -->"
137 einfo 189 einfo " repository: ${repo_uri}"
138 einfo " update from: ${ESVN_REPO_URI}"
139 190
140 cd "${ESVN_CO_DIR}" || die "subversion.eclass: can't cd to ${ESVN_CO_DIR}." 191 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
141 ${ESVN_UPDATE_CMD} || die "subversion.eclass: can't update from ${ESVN_REPO_URI}."
142 einfo " updated in: ${ESVN_STORE_DIR}/${ESVN_CO_DIR}"
143 fi
144 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
145 # copy to the ${WORKDIR} 205 # export to the ${WORKDIR}
146 cp -Rf "${ESVN_STORE_DIR}/${ESVN_CO_DIR}" "${WORKDIR}/${P}" || die "subversion.eclass: can't copy to ${WORKDIR}/${P}." 206 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
147 einfo 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
148 212
149} 213}
150 214
151 215
152## -- subversion_bootstrap() ------------------------------------------------ # 216## -- subversion_bootstrap() ------------------------------------------------ #
153 217#
154subversion_bootstrap() { 218function subversion_bootstrap() {
155 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
156 if [ -n "${ESVN_BOOTSTRAP}" ]; then 254 if [[ -n "${ESVN_BOOTSTRAP}" ]]; then
157 cd "${WORKDIR}/${P}" 255 einfo "begin bootstrap -->"
158 256
159 if [ -x "${ESVN_BOOTSTRAP}" ]; then 257 if [[ -f "${ESVN_BOOTSTRAP}" && -x "${ESVN_BOOTSTRAP}" ]]; then
160 ./${ESVN_BOOTSTRAP} 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
161 fi 265 fi
162
163 fi 266 fi
164 267
165} 268}
166 269
167 270
168## -- subversion_src_unpack() ------------------------------------------------ # 271## -- subversion_src_unpack() ------------------------------------------------ #
169 272#
170subversion_src_unpack() { 273function subversion_src_unpack() {
171 274
172 subversion_svn_fetch 275 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
173 subversion_bootstrap 276 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
174 277
175} 278}
279
280
281## -- subversion_wc_info() --------------------------------------------------- #
282#
283# @param $1 - repository URI. default is ESVN_REPO_URI.
284#
285function 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_$(subversion__to_upper_case "${k}")="$(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#
314function 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#
330function 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#
365function 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#
380function 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
394 case "$(subversion__to_upper_case "${peg_rev}")" in
395 [[:digit:]]*)
396 # NUMBER
397 ;;
398 HEAD|BASE|COMMITED|PREV)
399 ;;
400 {[^}]*})
401 # DATE
402 ;;
403 *)
404 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
405 return 1
406 ;;
407 esac
408
409 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
410
411 return 0
412
413}
414
415
416## -- subversion__to_upper_case() ----------------------------------------- #
417#
418# @param $@ - the strings to upper case.
419#
420function subversion__to_upper_case() {
421 echo "${@}" | tr "[a-z]" "[A-Z]"
422}

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.41

  ViewVC Help
Powered by ViewVC 1.1.20