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

Diff of /eclass/subversion.eclass

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

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

Legend:
Removed from v.1.21  
changed lines
  Added in v.1.44

  ViewVC Help
Powered by ViewVC 1.1.20