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

Diff of /eclass/subversion.eclass

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

Revision 1.9 Revision 1.44
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.9 2004/04/11 05:46:09 mr_bones_ 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:
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 18inherit eutils
19 19
20ECLASS="subversion"
21INHERITED="${INHERITED} ${ECLASS}"
22ESVN="subversion.eclass" 20ESVN="subversion.eclass"
23 21
24EXPORT_FUNCTIONS src_unpack 22EXPORT_FUNCTIONS src_unpack
25 23
26HOMEPAGE="http://subversion.tigris.org/"
27DESCRIPTION="Based on the ${ECLASS} eclass" 24DESCRIPTION="Based on the ${ECLASS} eclass"
28 25
29 26
30## -- add subversion in DEPEND 27## -- add subversion in DEPEND
31# 28#
32DEPEND="dev-util/subversion" 29DEPEND="dev-util/subversion"
33 30
34 31
35## -- ESVN_STORE_DIR: subversion sources store directory 32## -- ESVN_STORE_DIR: subversion sources store directory
36# 33#
37ESVN_STORE_DIR="${DISTDIR}/svn-src" 34ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/svn-src"
38 35
39 36
40## -- ESVN_FETCH_CMD: subversion fetch command 37## -- ESVN_FETCH_CMD: subversion fetch command
41# 38#
42# default: svn checkout 39ESVN_FETCH_CMD="svn checkout"
43#
44[ -z "${ESVN_FETCH_CMD}" ] && ESVN_FETCH_CMD="svn checkout"
45 40
46## -- ESVN_UPDATE_CMD: subversion update command 41## -- ESVN_UPDATE_CMD: subversion update command
47# 42#
48# default: svn update 43ESVN_UPDATE_CMD="svn update"
44
45
46## -- ESVN_OPTIONS:
49# 47#
50[ -z "${ESVN_UPDATE_CMD}" ] && ESVN_UPDATE_CMD="svn update" 48# the options passed to checkout or update.
49#
50: ${ESVN_OPTIONS=}
51 51
52 52
53## -- ESVN_REPO_URI: repository uri 53## -- ESVN_REPO_URI: repository uri
54# 54#
55# e.g. http://foo/trunk, svn://bar/trunk 55# e.g. http://foo/trunk, svn://bar/trunk
56# but currentry support http and https only.
57# 56#
58[ -z "${ESVN_REPO_URI}" ] && ESVN_REPO_URI="" 57# supported protocols:
58# http://
59# https://
60# svn://
61# svn+ssh://
62#
63: ${ESVN_REPO_URI=}
59 64
60 65
61## -- ESVN_PROJECT: project name of your ebuild 66## -- ESVN_PROJECT: project name of your ebuild (= name space)
62# 67#
63# subversion eclass will check out the subversion repository like: 68# subversion eclass will check out the subversion repository like:
64# 69#
65# ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/} 70# ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/}
66# 71#
68# 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.
69# it will check out like: 74# it will check out like:
70# 75#
71# ${ESVN_STORE_DIR}/subversion/trunk 76# ${ESVN_STORE_DIR}/subversion/trunk
72# 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#
73# default: ${PN/-svn}. 84# default: ${PN/-svn}.
74# 85#
75[ -z "${ESVN_PROJECT}" ] && ESVN_PROJECT="${PN/-svn}" 86: ${ESVN_PROJECT:=${PN/-svn}}
76 87
77 88
78## -- ESVN_BOOTSTRAP: 89## -- ESVN_BOOTSTRAP:
79# 90#
80# bootstrap script or command like autogen.sh or etc.. 91# bootstrap script or command like autogen.sh or etc..
81# 92#
82[ -z "${ESVN_BOOTSTRAP}" ] && ESVN_BOOTSTRAP="" 93: ${ESVN_BOOTSTRAP=}
83 94
84 95
85## -- ESVN_PATCHES: 96## -- ESVN_PATCHES:
86# 97#
87# subversion eclass can apply pathces in subversion_bootstrap(). 98# subversion eclass can apply pathces in subversion_bootstrap().
88# 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.
89# NOTE: this patches will apply before eval ESVN_BOOTSTRAP. 100# NOTE: patches will be applied before ESVN_BOOTSTRAP is processed.
90# 101#
91# the process of applying the patch is: 102# Patches are searched both in / and ${FILESDIR}, if not found in both locations,
92# 1. just epatch it, if the patch exists in the path. 103# the installation dies.
93# 2. scan it under FILESDIR and epatch it, if the patch exists in FILESDIR.
94# 3. die.
95# 104#
96[ -z "${ESVN_PATCHES}" ] && ESVN_PATCHES="" 105: ${ESVN_PATCHES=}
97 106
98 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
99## -- subversion_svn_fetch() ------------------------------------------------- # 118## -- subversion_fetch() ----------------------------------------------------- #
100 119#
120# @param $1 - a repository URI. default is the ESVN_REPO_URI.
121# @param $2 - a check out path in S.
122#
101subversion_svn_fetch() { 123function subversion_fetch() {
124 local repo_uri="$(subversion__get_repository_uri "${1}")"
125 local S_dest="${2}"
102 126
103 # ESVN_REPO_URI is empty. 127 # check for the protocol
104 [ -z "${ESVN_REPO_URI}" ] && die "${ESVN}: ESVN_REPO_URI is empty." 128 local protocol="${repo_uri%%:*}"
105 129
106 # http and https only... 130 case "${protocol}" in
107 case ${ESVN_REPO_URI%%:*} in 131 http|https)
108 http) ;; 132 if built_with_use dev-util/subversion nowebdav; then
109 https) ;; 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 ;;
110 *) 142 *)
111 die "${ESVN}: fetch from "${ESVN_REPO_URI%:*}" is not yet implemented." 143 die "${ESVN}: fetch from "${protocol}" is not yet implemented."
112 ;; 144 ;;
113 esac 145 esac
114 146
115 # every time 147 addread "/etc/subversion"
116 addwrite "${ESVN_STORE_DIR}" 148 addwrite "${ESVN_STORE_DIR}"
117 addwrite "/etc/subversion"
118 149
119 # -userpriv
120 ! has userpriv ${FEATURE} && addwrite "/root/.subversion"
121
122 if [ ! -d "${ESVN_STORE_DIR}" ]; then 150 if [[ ! -d "${ESVN_STORE_DIR}" ]]; then
151 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
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}."
153 fi
154
124 chmod -f o+rw "${ESVN_STORE_DIR}" || die "${ESVN}: can't chmod ${ESVN_STORE_DIR}." 155 cd "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
125 einfo "created store directory: ${ESVN_STORE_DIR}"
126 einfo
127 fi
128 156
129 cd "${ESVN_STORE_DIR}" 157 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
158 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
130 159
131 if [ -z ${ESVN_REPO_URI##*/} ]; then 160 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
132 ESVN_REPO_FIX="${ESVN_REPO_URI%/}" 161 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
133 else 162 debug-print "${FUNCNAME}: options = \"${options}\""
134 ESVN_REPO_FIX="${ESVN_REPO_URI}"
135 fi
136 163
137 ESVN_CO_DIR="${ESVN_PROJECT}/${ESVN_REPO_FIX##*/}"
138
139 if [ ! -d "${ESVN_CO_DIR}/.svn" ]; then 164 if [[ ! -d "${wc_path}/.svn" ]]; then
140 # first check out 165 # first check out
141 einfo "subversion check out start -->" 166 einfo "subversion check out start -->"
142 einfo " checkout from: ${ESVN_REPO_URI}" 167 einfo " repository: ${repo_uri}"
168
169 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
143 170
144 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}." 171 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
145 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}"
146 cd "${ESVN_PROJECT}" 173 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}."
147 ${ESVN_FETCH_CMD} "${ESVN_REPO_URI}" || die "${ESVN}: can't fetch from ${ESVN_REPO_URI}."
148 einfo " checkouted in: ${ESVN_STORE_DIR}/${ESVN_CO_DIR}"
149 174
175 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
150 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
151 # update working copy 182 # update working copy
152 einfo "subversion update start -->" 183 einfo "subversion update start -->"
153 einfo " update from: ${ESVN_REPO_URI}" 184 einfo " repository: ${repo_uri}"
154 cd "${ESVN_CO_DIR}"
155 185
156 local NOW=$(date +%s) UPDATE=$(date -r .svn/entries +%s) INTERVAL=3600 186 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
157 if expr ${NOW} - ${UPDATE} \> ${INTERVAL} >/dev/null; then 187
188 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
158 ${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}."
159 else
160 echo "Skip updating..."
161 fi 190 fi
162 191
163 einfo " updated in: ${ESVN_STORE_DIR}/${ESVN_CO_DIR}" 192 einfo " working copy: ${wc_path}"
164 193
165 fi 194 if ! has "export" ${ESVN_RESTRICT}; then
195 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
166 196
167 # permission fix for NFS (root_squash) with -userpriv 197 local S="${S}/${S_dest}"
168 find ! -perm -o+rw -exec chmod o+rw {} \; 2>/dev/null
169 198
170 # copy to the ${WORKDIR} 199 # export to the ${WORKDIR}
171 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
172 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
173 echo 205 echo
174
175} 206}
176 207
177 208
178## -- subversion_bootstrap() ------------------------------------------------ # 209## -- subversion_bootstrap() ------------------------------------------------ #
179 210#
180subversion_bootstrap() { 211function subversion_bootstrap() {
212 if has "export" ${ESVN_RESTRICT}; then
213 return
214 fi
181 215
182 cd "${S}" 216 cd "${S}"
183 217
184 if [ "${ESVN_PATCHES}" ]; then 218 if [[ -n "${ESVN_PATCHES}" ]]; then
185 einfo "apply paches -->" 219 einfo "apply patches -->"
220
221 local patch fpatch
186 for PATCH in ${ESVN_PATCHES}; do 222 for patch in ${ESVN_PATCHES}; do
187 if [ -f "${PATCH}" ]; then 223 if [[ -f "${patch}" ]]; then
188 epatch ${PATCH} 224 epatch "${patch}"
189
190 else 225 else
191 for fPATCH in ${FILESDIR}/${PATCH}; do 226 for fpatch in ${FILESDIR}/${patch}; do
192 if [ -f "${fPATCH}" ]; then 227 if [[ -f "${fpatch}" ]]; then
193 epatch ${fPATCH} 228 epatch "${fpatch}"
194
195 else 229 else
196 die "${ESVN}; ${PATCH} is not found" 230 die "${ESVN}: ${patch} not found"
197
198 fi 231 fi
199 done 232 done
200 fi 233 fi
201 done 234 done
202 echo 235 echo
203 fi 236 fi
204 237
205 if [ "${ESVN_BOOTSTRAP}" ]; then 238 if [[ -n "${ESVN_BOOTSTRAP}" ]]; then
206 einfo "begin bootstrap -->" 239 einfo "begin bootstrap -->"
240
207 if [ -f "${ESVN_BOOTSTRAP}" -a -x "${ESVN_BOOTSTRAP}" ]; then 241 if [[ -f "${ESVN_BOOTSTRAP}" && -x "${ESVN_BOOTSTRAP}" ]]; then
208 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}" 242 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
209 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP." 243 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
210
211 else 244 else
212 einfo " bootstrap with command: ESVN_BOOTSTRAP" 245 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
213 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP." 246 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
214
215 fi 247 fi
216 fi 248 fi
217
218} 249}
219
220 250
221## -- subversion_src_unpack() ------------------------------------------------ # 251## -- subversion_src_unpack() ------------------------------------------------ #
222 252#
223subversion_src_unpack() { 253function subversion_src_unpack() {
224
225 subversion_svn_fetch || die "${ESVN}: unknown problem in subversion_svn_fetch()." 254 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
226 subversion_bootstrap || die "${ESVN}: unknown problem in subversion_bootstrap()." 255 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
227
228} 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.9  
changed lines
  Added in v.1.44

  ViewVC Help
Powered by ViewVC 1.1.20