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

Diff of /eclass/subversion.eclass

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

Revision 1.33 Revision 1.44
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.33 2006/07/22 13:52:38 hattya 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
19 19
20ESVN="subversion.eclass" 20ESVN="subversion.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#
46 45
47## -- ESVN_OPTIONS: 46## -- ESVN_OPTIONS:
48# 47#
49# the options passed to checkout or update. 48# the options passed to checkout or update.
50# 49#
51: ESVN_OPTIONS=${ESVN_OPTIONS:=} 50: ${ESVN_OPTIONS=}
52 51
53 52
54## -- ESVN_REPO_URI: repository uri 53## -- ESVN_REPO_URI: repository uri
55# 54#
56# e.g. http://foo/trunk, svn://bar/trunk 55# e.g. http://foo/trunk, svn://bar/trunk
59# http:// 58# http://
60# https:// 59# https://
61# svn:// 60# svn://
62# svn+ssh:// 61# svn+ssh://
63# 62#
64: ESVN_REPO_URI=${ESVN_REPO_URI:=} 63: ${ESVN_REPO_URI=}
65 64
66 65
67## -- ESVN_PROJECT: project name of your ebuild (= name space) 66## -- ESVN_PROJECT: project name of your ebuild (= name space)
68# 67#
69# subversion eclass will check out the subversion repository like: 68# subversion eclass will check out the subversion repository like:
82# # jakarta commons-loggin 81# # jakarta commons-loggin
83# ESVN_PROJECT=commons/logging 82# ESVN_PROJECT=commons/logging
84# 83#
85# default: ${PN/-svn}. 84# default: ${PN/-svn}.
86# 85#
87: ESVN_PROJECT=${ESVN_PROJECT:=${PN/-svn}} 86: ${ESVN_PROJECT:=${PN/-svn}}
88 87
89 88
90## -- ESVN_BOOTSTRAP: 89## -- ESVN_BOOTSTRAP:
91# 90#
92# bootstrap script or command like autogen.sh or etc.. 91# bootstrap script or command like autogen.sh or etc..
93# 92#
94: ESVN_BOOTSTRAP=${ESVN_BOOTSTRAP:=} 93: ${ESVN_BOOTSTRAP=}
95 94
96 95
97## -- ESVN_PATCHES: 96## -- ESVN_PATCHES:
98# 97#
99# subversion eclass can apply pathces in subversion_bootstrap(). 98# subversion eclass can apply pathces in subversion_bootstrap().
100# 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.
101# NOTE: this patches will apply before eval ESVN_BOOTSTRAP. 100# NOTE: patches will be applied before ESVN_BOOTSTRAP is processed.
102# 101#
103# the process of applying the patch is: 102# Patches are searched both in / and ${FILESDIR}, if not found in both locations,
104# 1. just epatch it, if the patch exists in the path. 103# the installation dies.
105# 2. scan it under FILESDIR and epatch it, if the patch exists in FILESDIR.
106# 3. die.
107# 104#
108: ESVN_PATCHES=${ESVN_PATCHES:=} 105: ${ESVN_PATCHES=}
109 106
110 107
111## -- ESVN_RESTRICT: 108## -- ESVN_RESTRICT:
112# 109#
113# this should be a space delimited list of subversion eclass features to restrict. 110# this should be a space delimited list of subversion eclass features to
111# restrict.
114# export) 112# export)
115# don't export the working copy to S. 113# don't export the working copy to S.
116# 114#
117: ESVN_RESTRICT=${ESVN_RESTRICT:=} 115: ${ESVN_RESTRICT=}
118 116
119 117
120## -- subversion_fetch() ----------------------------------------------------- # 118## -- subversion_fetch() ----------------------------------------------------- #
121 119#
120# @param $1 - a repository URI. default is the ESVN_REPO_URI.
121# @param $2 - a check out path in S.
122#
122function subversion_fetch() { 123function subversion_fetch() {
123 124 local repo_uri="$(subversion__get_repository_uri "${1}")"
124 local repo_uri=${1:-${ESVN_REPO_URI}} 125 local S_dest="${2}"
125
126 if [[ -z "${repo_uri}" ]]; then
127 die "${ESVN}: ESVN_REPO_URI is empty."
128 fi
129
130 # delete trailing slash
131 if [[ -z "${repo_uri##*/}" ]]; then
132 repo_uri=${repo_uri%/}
133 fi
134 126
135 # check for the protocol 127 # check for the protocol
136 local protocol=${repo_uri%%:*} 128 local protocol="${repo_uri%%:*}"
137 129
138 case "${protocol}" in 130 case "${protocol}" in
139 http|https) 131 http|https)
140 if built_with_use dev-util/subversion nowebdav; then 132 if built_with_use dev-util/subversion nowebdav; then
133 echo
141 eerror "In order to emerge this package, you need to" 134 eerror "In order to emerge this package, you need to"
142 eerror "re-emerge subversion with USE=-nowebdav" 135 eerror "re-emerge subversion with USE=-nowebdav"
136 echo
143 die "Please run 'USE=-nowebdav emerge subversion'" 137 die "${ESVN}: please run 'USE=-nowebdav emerge subversion'"
144 fi 138 fi
145 ;; 139 ;;
146 svn|svn+ssh) 140 svn|svn+ssh)
147 ;; 141 ;;
148 *) 142 *)
149 die "${ESVN}: fetch from "${protocol}" is not yet implemented." 143 die "${ESVN}: fetch from "${protocol}" is not yet implemented."
150 ;; 144 ;;
151 esac 145 esac
152 146
147 addread "/etc/subversion"
148 addwrite "${ESVN_STORE_DIR}"
149
153 if [[ ! -d "${ESVN_STORE_DIR}" ]]; then 150 if [[ ! -d "${ESVN_STORE_DIR}" ]]; then
154 debug-print "${FUNCNAME}: initial checkout. creating subversion directory" 151 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
155
156 addwrite /
157 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}."
158 export SANDBOX_WRITE=${SANDBOX_WRITE%%:/}
159 fi 153 fi
160 154
161 cd "${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}"
162 156
163 # every time 157 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
164 addwrite "/etc/subversion"
165 addwrite "${ESVN_STORE_DIR}"
166
167 if ! has userpriv ${FEATURES}; then
168 # -userpriv
169 addwrite "/root/.subversion"
170
171 else
172 # +userpriv
173 ESVN_OPTIONS="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion" 158 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
174 159
175 fi 160 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
176
177 local wc_path=${ESVN_PROJECT}/${repo_uri##*/}
178
179 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\"" 161 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
162 debug-print "${FUNCNAME}: options = \"${options}\""
180 163
181 if [[ ! -d "${wc_path}/.svn" ]]; then 164 if [[ ! -d "${wc_path}/.svn" ]]; then
182 # first check out 165 # first check out
183 einfo "subversion check out start -->" 166 einfo "subversion check out start -->"
184 einfo " repository: ${repo_uri}" 167 einfo " repository: ${repo_uri}"
185 168
169 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
170
186 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}." 171 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
187 cd "${ESVN_PROJECT}" 172 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
188 ${ESVN_FETCH_CMD} ${ESVN_OPTIONS} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}." 173 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}."
189 174
175 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
190 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
191 # update working copy 182 # update working copy
192 einfo "subversion update start -->" 183 einfo "subversion update start -->"
193 einfo " repository: ${repo_uri}" 184 einfo " repository: ${repo_uri}"
194 185
195 cd "${wc_path}" 186 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
187
188 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
196 ${ESVN_UPDATE_CMD} ${ESVN_OPTIONS} || die "${ESVN}: can't update from ${repo_uri}." 189 ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update from ${repo_uri}."
197
198 fi 190 fi
199 191
200 einfo " working copy: ${ESVN_STORE_DIR}/${wc_path}" 192 einfo " working copy: ${wc_path}"
201 193
202 if ! has "export" ${ESVN_RESTRICT}; then 194 if ! has "export" ${ESVN_RESTRICT}; then
203 cd "${ESVN_STORE_DIR}/${wc_path}" 195 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
196
197 local S="${S}/${S_dest}"
204 198
205 # export to the ${WORKDIR} 199 # export to the ${WORKDIR}
206 #* "svn export" has a bug. see http://bugs.gentoo.org/119236 200 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
207 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}." 201 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
208 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}." 202 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
209 fi 203 fi
210 204
211 echo 205 echo
212
213} 206}
214 207
215 208
216## -- subversion_bootstrap() ------------------------------------------------ # 209## -- subversion_bootstrap() ------------------------------------------------ #
217 210#
218function subversion_bootstrap() { 211function subversion_bootstrap() {
219
220 if has "export" ${ESVN_RESTRICT}; then 212 if has "export" ${ESVN_RESTRICT}; then
221 return 213 return
222 fi 214 fi
223 215
224 cd "${S}" 216 cd "${S}"
225 217
226 if [[ -n "${ESVN_PATCHES}" ]]; then 218 if [[ -n "${ESVN_PATCHES}" ]]; then
227 einfo "apply patches -->" 219 einfo "apply patches -->"
228 220
229 local p= 221 local patch fpatch
230
231 for p in ${ESVN_PATCHES}; do 222 for patch in ${ESVN_PATCHES}; do
232 if [[ -f "${p}" ]]; then 223 if [[ -f "${patch}" ]]; then
233 epatch "${p}" 224 epatch "${patch}"
234
235 else 225 else
236 local q=
237
238 for q in ${FILESDIR}/${p}; do 226 for fpatch in ${FILESDIR}/${patch}; do
239 if [[ -f "${q}" ]]; then 227 if [[ -f "${fpatch}" ]]; then
240 epatch "${q}" 228 epatch "${fpatch}"
241
242 else 229 else
243 die "${ESVN}; ${p} is not found" 230 die "${ESVN}: ${patch} not found"
244
245 fi 231 fi
246 done 232 done
247 fi 233 fi
248 done 234 done
249
250 echo 235 echo
251
252 fi 236 fi
253 237
254 if [[ -n "${ESVN_BOOTSTRAP}" ]]; then 238 if [[ -n "${ESVN_BOOTSTRAP}" ]]; then
255 einfo "begin bootstrap -->" 239 einfo "begin bootstrap -->"
256 240
257 if [[ -f "${ESVN_BOOTSTRAP}" && -x "${ESVN_BOOTSTRAP}" ]]; then 241 if [[ -f "${ESVN_BOOTSTRAP}" && -x "${ESVN_BOOTSTRAP}" ]]; then
258 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}" 242 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
259 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP." 243 eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
260
261 else 244 else
262 einfo " bootstrap with commands: ${ESVN_BOOTSTRAP}" 245 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
263 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP." 246 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
264
265 fi 247 fi
266 fi 248 fi
267
268} 249}
269
270 250
271## -- subversion_src_unpack() ------------------------------------------------ # 251## -- subversion_src_unpack() ------------------------------------------------ #
272 252#
273function subversion_src_unpack() { 253function subversion_src_unpack() {
274
275 subversion_fetch || die "${ESVN}: unknown problem in subversion_fetch()." 254 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
276 subversion_bootstrap || die "${ESVN}: unknown problem in subversion_bootstrap()." 255 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
277
278} 256}
279 257
280 258
281## -- subversion_wc_info() --------------------------------------------------- # 259## -- subversion_wc_info() --------------------------------------------------- #
282 260#
261# @param $1 - repository URI. default is ESVN_REPO_URI.
262#
283function subversion_wc_info() { 263function subversion_wc_info() {
264 local repo_uri="$(subversion__get_repository_uri "${1}")"
265 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
284 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() {
285 local repo_uri=${ESVN_REPO_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
286 312
287 # delete trailing slash 313 # delete trailing slash
288 if [[ -z "${repo_uri##*/}" ]]; then 314 if [[ -z "${repo_uri##*/}" ]]; then
289 repo_uri="${repo_uri%/}" 315 repo_uri="${repo_uri%/}"
290 fi 316 fi
291 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
292 local wc_path=${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/} 340 echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
341}
293 342
294 if [[ ! -e "${wc_path}" ]]; then 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."
295 return 1 356 return 1
296 fi 357 fi
297 358
298 local k= 359 local peg_rev="${repo_uri##*@}"
299 360
300 for k in url revision; do 361 case "$(subversion__to_upper_case "${peg_rev}")" in
301 export ESVN_WC_$(echo "${k}" | tr [a-z] [A-Z])=$(env LANG=C svn info "${wc_path}" | grep -i "^${k}" | cut -d" " -f2) 362 [[:digit:]]*)
302 done 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
303 375
376 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
377
378 return 0
304} 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.33  
changed lines
  Added in v.1.44

  ViewVC Help
Powered by ViewVC 1.1.20