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

Diff of /eclass/subversion.eclass

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

Revision 1.27 Revision 1.41
1# Copyright 1999-2006 Gentoo Foundation 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.27 2006/02/05 20:47:17 vapier 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
46 46
47## -- ESVN_OPTIONS: 47## -- ESVN_OPTIONS:
48# 48#
49# the options passed to checkout or update. 49# the options passed to checkout or update.
50# 50#
51[ -z "${ESVN_OPTIONS}" ] && ESVN_OPTIONS= 51: ESVN_OPTIONS=${ESVN_OPTIONS:=}
52 52
53 53
54## -- ESVN_REPO_URI: repository uri 54## -- ESVN_REPO_URI: repository uri
55# 55#
56# e.g. http://foo/trunk, svn://bar/trunk 56# e.g. http://foo/trunk, svn://bar/trunk
57# 57#
58# supported protocols: 58# supported protocols:
59# http:// 59# http://
60# https:// 60# https://
61# svn:// 61# svn://
62# svn+ssh://
62# 63#
63[ -z "${ESVN_REPO_URI}" ] && ESVN_REPO_URI="" 64: ESVN_REPO_URI=${ESVN_REPO_URI:=}
64 65
65 66
66## -- ESVN_PROJECT: project name of your ebuild 67## -- ESVN_PROJECT: project name of your ebuild (= name space)
67# 68#
68# subversion eclass will check out the subversion repository like: 69# subversion eclass will check out the subversion repository like:
69# 70#
70# ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/} 71# ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/}
71# 72#
73# 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.
74# it will check out like: 75# it will check out like:
75# 76#
76# ${ESVN_STORE_DIR}/subversion/trunk 77# ${ESVN_STORE_DIR}/subversion/trunk
77# 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#
78# default: ${PN/-svn}. 85# default: ${PN/-svn}.
79# 86#
80[ -z "${ESVN_PROJECT}" ] && ESVN_PROJECT="${PN/-svn}" 87: ESVN_PROJECT=${ESVN_PROJECT:=${PN/-svn}}
81 88
82 89
83## -- ESVN_BOOTSTRAP: 90## -- ESVN_BOOTSTRAP:
84# 91#
85# bootstrap script or command like autogen.sh or etc.. 92# bootstrap script or command like autogen.sh or etc..
86# 93#
87[ -z "${ESVN_BOOTSTRAP}" ] && ESVN_BOOTSTRAP="" 94: ESVN_BOOTSTRAP=${ESVN_BOOTSTRAP:=}
88 95
89 96
90## -- ESVN_PATCHES: 97## -- ESVN_PATCHES:
91# 98#
92# subversion eclass can apply pathces in subversion_bootstrap(). 99# subversion eclass can apply pathces in subversion_bootstrap().
96# the process of applying the patch is: 103# the process of applying the patch is:
97# 1. just epatch it, if the patch exists in the path. 104# 1. just epatch it, if the patch exists in the path.
98# 2. scan it under FILESDIR and epatch it, if the patch exists in FILESDIR. 105# 2. scan it under FILESDIR and epatch it, if the patch exists in FILESDIR.
99# 3. die. 106# 3. die.
100# 107#
101[ -z "${ESVN_PATCHES}" ] && ESVN_PATCHES="" 108: ESVN_PATCHES=${ESVN_PATCHES:=}
102 109
103 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
104## -- subversion_svn_fetch() ------------------------------------------------- # 121## -- subversion_fetch() ----------------------------------------------------- #
105 122#
123# @param $1 - a repository URI. default is the ESVN_REPO_URI.
124# @param $2 - a check out path in S.
125#
106function subversion_svn_fetch() { 126function subversion_fetch() {
107 127
108 local ESVN_CO_DIR 128 local repo_uri="$(subversion__get_repository_uri "${1}")"
129 local S_dest="${2}"
109 130
110 # ESVN_REPO_URI is empty.
111 [ -z "${ESVN_REPO_URI}" ] && die "${ESVN}: ESVN_REPO_URI is empty."
112
113 # check for the protocol. 131 # check for the protocol
114 case ${ESVN_REPO_URI%%:*} in 132 local protocol="${repo_uri%%:*}"
133
134 case "${protocol}" in
115 http|https) 135 http|https)
116 if built_with_use dev-util/subversion nowebdav; then 136 if built_with_use dev-util/subversion nowebdav; then
137 echo
117 eerror "In order to emerge this package, you need to" 138 eerror "In order to emerge this package, you need to"
118 eerror "re-emerge subversion with USE=-nowebdav" 139 eerror "re-emerge subversion with USE=-nowebdav"
140 echo
119 die "Please run 'USE=-nowebdav emerge subversion'" 141 die "${ESVN}: please run 'USE=-nowebdav emerge subversion'"
120 fi 142 fi
121 ;; 143 ;;
122 svn) ;; 144 svn|svn+ssh)
145 ;;
123 *) 146 *)
124 die "${ESVN}: fetch from "${ESVN_REPO_URI%:*}" is not yet implemented." 147 die "${ESVN}: fetch from "${protocol}" is not yet implemented."
125 ;; 148 ;;
126 esac 149 esac
127 150
151 # every time
152 addread "/etc/subversion"
153 addwrite "${ESVN_STORE_DIR}"
154
128 if [ ! -d "${ESVN_STORE_DIR}" ]; then 155 if [[ ! -d "${ESVN_STORE_DIR}" ]]; then
129 debug-print "${FUNCNAME}: initial checkout. creating subversion directory" 156 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
130
131 addwrite /
132 mkdir -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}." 157 mkdir -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
133 chmod -f o+rw "${ESVN_STORE_DIR}" || die "${ESVN}: can't chmod ${ESVN_STORE_DIR}."
134 export SANDBOX_WRITE="${SANDBOX_WRITE%%:/}"
135 fi 158 fi
136 159
137 cd -P "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}" 160 cd "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
138 ESVN_STORE_DIR=${PWD}
139 161
140 # every time 162 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
141 addwrite "/etc/subversion"
142 addwrite "${ESVN_STORE_DIR}"
143
144 if ! has userpriv ${FEATURES}; then
145 # -userpriv
146 addwrite "/root/.subversion"
147
148 else
149 # +userpriv
150 ESVN_OPTIONS="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion" 163 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
151 164
152 fi 165 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
153
154 [ -z "${ESVN_REPO_URI##*/}" ] && ESVN_REPO_URI="${ESVN_REPO_URI%/}"
155 ESVN_CO_DIR="${ESVN_PROJECT}/${ESVN_REPO_URI##*/}"
156
157 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\"" 166 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
167 debug-print "${FUNCNAME}: options = \"${options}\""
158 168
159 if [ ! -d "${ESVN_CO_DIR}/.svn" ]; then 169 if [[ ! -d "${wc_path}/.svn" ]]; then
160 # first check out 170 # first check out
161 einfo "subversion check out start -->" 171 einfo "subversion check out start -->"
162 einfo " checkout from: ${ESVN_REPO_URI}" 172 einfo " repository: ${repo_uri}"
163 173
174 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
175
164 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}." 176 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
165 chmod -f o+rw "${ESVN_PROJECT}" || die "${ESVN}: can't chmod ${ESVN_PROJECT}." 177 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
166 cd "${ESVN_PROJECT}" 178 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}."
167 ${ESVN_FETCH_CMD} ${ESVN_OPTIONS} "${ESVN_REPO_URI}" || die "${ESVN}: can't fetch from ${ESVN_REPO_URI}."
168
169 einfo " checkouted in: ${ESVN_STORE_DIR}/${ESVN_CO_DIR}"
170 179
171 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
172 # update working copy 187 # update working copy
173 einfo "subversion update start -->" 188 einfo "subversion update start -->"
174 einfo " update from: ${ESVN_REPO_URI}" 189 einfo " repository: ${repo_uri}"
175 190
176 cd "${ESVN_CO_DIR}" 191 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
192
193 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
177 ${ESVN_UPDATE_CMD} ${ESVN_OPTIONS} || die "${ESVN}: can't update from ${ESVN_REPO_URI}." 194 ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update from ${repo_uri}."
178 195
179 einfo " updated in: ${ESVN_STORE_DIR}/${ESVN_CO_DIR}"
180
181 fi 196 fi
182 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
183 # export to the ${WORKDIR} 205 # export to the ${WORKDIR}
184 # for the time being, we use `cp -R` instead of `svn export` due to
185 # a bug in svn export handling. see http://bugs.gentoo.org/119236 206 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
186 #svn export "${ESVN_STORE_DIR}/${ESVN_CO_DIR}" "${S}" || die "${ESVN}: can't export to ${S}." 207 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
187 cp -pPR "${ESVN_STORE_DIR}/${ESVN_CO_DIR}" "${S}" || die "${ESVN}: can't copy to ${S}." 208 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
188 find "${S}" -name .svn -print0 | xargs -0 rm -rf {} \; 209 fi
189 einfo " exported to: ${S}" 210
190 echo 211 echo
191 212
192} 213}
193 214
194 215
195## -- subversion_bootstrap() ------------------------------------------------ # 216## -- subversion_bootstrap() ------------------------------------------------ #
196 217#
197function subversion_bootstrap() { 218function subversion_bootstrap() {
198 219
199 local patch lpatch 220 if has "export" ${ESVN_RESTRICT}; then
221 return
222 fi
200 223
201 cd "${S}" 224 cd "${S}"
202 225
203 if [ "${ESVN_PATCHES}" ]; then 226 if [[ -n "${ESVN_PATCHES}" ]]; then
204 einfo "apply patches -->" 227 einfo "apply patches -->"
205 228
229 local p=
230
206 for patch in ${ESVN_PATCHES}; do 231 for p in ${ESVN_PATCHES}; do
207 if [ -f "${patch}" ]; then 232 if [[ -f "${p}" ]]; then
208 epatch ${patch} 233 epatch "${p}"
209 234
210 else 235 else
236 local q=
237
211 for lpatch in ${FILESDIR}/${patch}; do 238 for q in ${FILESDIR}/${p}; do
212 if [ -f "${lpatch}" ]; then 239 if [[ -f "${q}" ]]; then
213 epatch ${lpatch} 240 epatch "${q}"
214 241
215 else 242 else
216 die "${ESVN}; ${patch} is not found" 243 die "${ESVN}; ${p} is not found"
217 244
218 fi 245 fi
219 done 246 done
220 fi 247 fi
221 done 248 done
249
222 echo 250 echo
223 fi
224 251
252 fi
253
225 if [ "${ESVN_BOOTSTRAP}" ]; then 254 if [[ -n "${ESVN_BOOTSTRAP}" ]]; then
226 einfo "begin bootstrap -->" 255 einfo "begin bootstrap -->"
227 256
228 if [ -f "${ESVN_BOOTSTRAP}" -a -x "${ESVN_BOOTSTRAP}" ]; then 257 if [[ -f "${ESVN_BOOTSTRAP}" && -x "${ESVN_BOOTSTRAP}" ]]; then
229 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}" 258 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
230 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP." 259 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
231 260
232 else 261 else
233 einfo " bootstrap with commands: ${ESVN_BOOTSTRAP}" 262 einfo " bootstrap with commands: ${ESVN_BOOTSTRAP}"
238 267
239} 268}
240 269
241 270
242## -- subversion_src_unpack() ------------------------------------------------ # 271## -- subversion_src_unpack() ------------------------------------------------ #
243 272#
244function subversion_src_unpack() { 273function subversion_src_unpack() {
245 274
246 if [ -n "${A}" ]; then
247 unpack ${A}
248 fi
249
250 subversion_svn_fetch || die "${ESVN}: unknown problem in subversion_svn_fetch()." 275 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
251 subversion_bootstrap || die "${ESVN}: unknown problem in subversion_bootstrap()." 276 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
252 277
253} 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.27  
changed lines
  Added in v.1.41

  ViewVC Help
Powered by ViewVC 1.1.20