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

Diff of /eclass/subversion.eclass

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

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

  ViewVC Help
Powered by ViewVC 1.1.20