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

Diff of /eclass/subversion.eclass

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

Revision 1.63 Revision 1.75
1# Copyright 1999-2009 Gentoo Foundation 1# Copyright 1999-2012 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.63 2009/04/26 02:18:09 arfrever Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.75 2012/02/21 18:03:49 jlec Exp $
4 4
5# @ECLASS: subversion.eclass 5# @ECLASS: subversion.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# Akinori Hattori <hattya@gentoo.org> 7# Akinori Hattori <hattya@gentoo.org>
8# Bo ├śrsted Andresen <zlin@gentoo.org> 8# Bo ├śrsted Andresen <zlin@gentoo.org>
9# Arfrever Frehtes Taifersar Arahesis <arfrever@gentoo.org> 9# Arfrever Frehtes Taifersar Arahesis <arfrever@gentoo.org>
10# 10# @AUTHOR:
11# Original Author: Akinori Hattori <hattya@gentoo.org> 11# Original Author: Akinori Hattori <hattya@gentoo.org>
12#
13# @BLURB: The subversion eclass is written to fetch software sources from subversion repositories 12# @BLURB: The subversion eclass is written to fetch software sources from subversion repositories
14# @DESCRIPTION: 13# @DESCRIPTION:
15# The subversion eclass provides functions to fetch, patch and bootstrap 14# The subversion eclass provides functions to fetch, patch and bootstrap
16# software sources from subversion repositories. 15# software sources from subversion repositories.
17 16
18inherit eutils 17inherit eutils
19 18
20ESVN="${ECLASS}" 19ESVN="${ECLASS}"
21 20
21case "${EAPI:-0}" in
22 0|1)
22EXPORT_FUNCTIONS src_unpack pkg_preinst 23 EXPORT_FUNCTIONS src_unpack pkg_preinst
24 ;;
25 *)
26 EXPORT_FUNCTIONS src_unpack src_prepare pkg_preinst
27 ;;
28esac
23 29
24DESCRIPTION="Based on the ${ECLASS} eclass" 30DESCRIPTION="Based on the ${ECLASS} eclass"
25 31
26DEPEND="dev-util/subversion 32SUBVERSION_DEPEND="dev-vcs/subversion
27 net-misc/rsync" 33 net-misc/rsync"
34
35if [[ -z "${ESVN_DISABLE_DEPENDENCIES}" ]]; then
36 DEPEND="${SUBVERSION_DEPEND}"
37fi
28 38
29# @ECLASS-VARIABLE: ESVN_STORE_DIR 39# @ECLASS-VARIABLE: ESVN_STORE_DIR
30# @DESCRIPTION: 40# @DESCRIPTION:
31# subversion sources store directory. Users may override this in /etc/make.conf 41# subversion sources store directory. Users may override this in /etc/make.conf
32[[ -z ${ESVN_STORE_DIR} ]] && ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/svn-src" 42[[ -z ${ESVN_STORE_DIR} ]] && ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/svn-src"
131# restrict. 141# restrict.
132# export) 142# export)
133# don't export the working copy to S. 143# don't export the working copy to S.
134ESVN_RESTRICT="${ESVN_RESTRICT:-}" 144ESVN_RESTRICT="${ESVN_RESTRICT:-}"
135 145
146# @ECLASS-VARIABLE: ESVN_DISABLE_DEPENDENCIES
147# @DESCRIPTION:
148# Set this variable to a non-empty value to disable the automatic inclusion of
149# Subversion in dependencies.
150ESVN_DISABLE_DEPENDENCIES="${ESVN_DISABLE_DEPENDENCIES:-}"
151
136# @ECLASS-VARIABLE: ESVN_OFFLINE 152# @ECLASS-VARIABLE: ESVN_OFFLINE
137# @DESCRIPTION: 153# @DESCRIPTION:
138# Set this variable to a non-empty value to disable the automatic updating of 154# Set this variable to a non-empty value to disable the automatic updating of
139# an svn source tree. This is intended to be set outside the subversion source 155# an svn source tree. This is intended to be set outside the subversion source
140# tree by users. 156# tree by users.
141ESVN_OFFLINE="${ESVN_OFFLINE:-${ESCM_OFFLINE}}" 157ESVN_OFFLINE="${ESVN_OFFLINE:-${ESCM_OFFLINE}}"
158
159# @ECLASS-VARIABLE: ESVN_UMASK
160# @DESCRIPTION:
161# Set this variable to a custom umask. This is intended to be set by users.
162# By setting this to something like 002, it can make life easier for people
163# who do development as non-root (but are in the portage group), and then
164# switch over to building with FEATURES=userpriv. Or vice-versa. Shouldn't
165# be a security issue here as anyone who has portage group write access
166# already can screw the system over in more creative ways.
167ESVN_UMASK="${ESVN_UMASK:-${EVCS_UMASK}}"
142 168
143# @ECLASS-VARIABLE: ESVN_UP_FREQ 169# @ECLASS-VARIABLE: ESVN_UP_FREQ
144# @DESCRIPTION: 170# @DESCRIPTION:
145# Set the minimum number of hours between svn up'ing in any given svn module. This is particularly 171# Set the minimum number of hours between svn up'ing in any given svn module. This is particularly
146# useful for split KDE ebuilds where we want to ensure that all submodules are compiled for the same 172# useful for split KDE ebuilds where we want to ensure that all submodules are compiled for the same
178 # check for the protocol 204 # check for the protocol
179 local protocol="${repo_uri%%:*}" 205 local protocol="${repo_uri%%:*}"
180 206
181 case "${protocol}" in 207 case "${protocol}" in
182 http|https) 208 http|https)
183 if ! built_with_use --missing true -o dev-util/subversion webdav-neon webdav-serf || \ 209 if ! built_with_use -o dev-vcs/subversion webdav-neon webdav-serf; then
184 built_with_use --missing false dev-util/subversion nowebdav; then
185 echo 210 echo
186 eerror "In order to emerge this package, you need to" 211 eerror "In order to emerge this package, you need to"
187 eerror "reinstall Subversion with support for WebDAV." 212 eerror "reinstall Subversion with support for WebDAV."
188 eerror "Subversion requires either Neon or Serf to support WebDAV." 213 eerror "Subversion requires either Neon or Serf to support WebDAV."
189 echo 214 echo
198 esac 223 esac
199 224
200 addread "/etc/subversion" 225 addread "/etc/subversion"
201 addwrite "${ESVN_STORE_DIR}" 226 addwrite "${ESVN_STORE_DIR}"
202 227
228 if [[ -n "${ESVN_UMASK}" ]]; then
229 eumask_push "${ESVN_UMASK}"
230 fi
231
203 if [[ ! -d ${ESVN_STORE_DIR} ]]; then 232 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
204 debug-print "${FUNCNAME}: initial checkout. creating subversion directory" 233 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
205 mkdir -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}." 234 mkdir -m 775 -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
206 fi 235 fi
207 236
208 cd "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}" 237 pushd "${ESVN_STORE_DIR}" > /dev/null || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
209 238
210 local wc_path="$(subversion__get_wc_path "${repo_uri}")" 239 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
211 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion" 240 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
212 241
213 [[ -n "${revision}" ]] && options="${options} -r ${revision}" 242 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
215 if [[ "${ESVN_OPTIONS}" = *-r* ]]; then 244 if [[ "${ESVN_OPTIONS}" = *-r* ]]; then
216 ewarn "\${ESVN_OPTIONS} contains -r, this usage is unsupported. Please" 245 ewarn "\${ESVN_OPTIONS} contains -r, this usage is unsupported. Please"
217 ewarn "see \${ESVN_REPO_URI}" 246 ewarn "see \${ESVN_REPO_URI}"
218 fi 247 fi
219 248
220 if has_version ">=dev-util/subversion-1.6.0"; then 249 if has_version ">=dev-vcs/subversion-1.6.0"; then
221 options="${options} --config-option=config:auth:password-stores=" 250 options="${options} --config-option=config:auth:password-stores="
222 fi 251 fi
223 252
224 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\"" 253 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
225 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\"" 254 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
233 einfo "subversion check out start -->" 262 einfo "subversion check out start -->"
234 einfo " repository: ${repo_uri}${revision:+@}${revision}" 263 einfo " repository: ${repo_uri}${revision:+@}${revision}"
235 264
236 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}" 265 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
237 266
238 mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}." 267 mkdir -m 775 -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
239 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}" 268 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
240 if [[ -n "${ESVN_USER}" ]]; then 269 if [[ -n "${ESVN_USER}" ]]; then
241 ${ESVN_FETCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}." 270 ${ESVN_FETCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
242 else 271 else
243 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}." 272 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
244 fi 273 fi
245 274
246 elif [[ -n ${ESVN_OFFLINE} ]]; then 275 elif [[ -n ${ESVN_OFFLINE} ]]; then
276 svn upgrade "${wc_path}" &>/dev/null
247 svn cleanup "${wc_path}" 277 svn cleanup "${wc_path}" &>/dev/null
248 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy." 278 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
249 if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then 279 if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then
250 die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally." 280 die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally."
251 fi 281 fi
252 einfo "Fetching disabled: Using existing repository copy at revision ${ESVN_WC_REVISION}." 282 einfo "Fetching disabled: Using existing repository copy at revision ${ESVN_WC_REVISION}."
253 else 283 else
284 svn upgrade "${wc_path}" &>/dev/null
254 svn cleanup "${wc_path}" 285 svn cleanup "${wc_path}" &>/dev/null
255 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy." 286 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
256 287
257 local esvn_up_freq= 288 local esvn_up_freq=
258 if [[ -n ${ESVN_UP_FREQ} ]]; then 289 if [[ -n ${ESVN_UP_FREQ} ]]; then
259 if [[ -n ${ESVN_UP_FREQ//[[:digit:]]} ]]; then 290 if [[ -n ${ESVN_UP_FREQ//[[:digit:]]} ]]; then
264 esvn_up_freq=no_update 295 esvn_up_freq=no_update
265 fi 296 fi
266 fi 297 fi
267 298
268 if [[ -z ${esvn_up_freq} ]]; then 299 if [[ -z ${esvn_up_freq} ]]; then
300 if [[ ${ESVN_WC_UUID} != $(subversion__svn_info "${repo_uri}" "Repository UUID") ]]; then
301 # UUID mismatch. Delete working copy and check out it again.
302 einfo "subversion recheck out start -->"
303 einfo " old UUID: ${ESVN_WC_UUID}"
304 einfo " new UUID: $(subversion__svn_info "${repo_uri}" "Repository UUID")"
305 einfo " repository: ${repo_uri}${revision:+@}${revision}"
306
307 rm -fr "${ESVN_PROJECT}" || die
308
309 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
310
311 mkdir -m 775 -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
312 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
313 if [[ -n "${ESVN_USER}" ]]; then
314 ${ESVN_FETCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
315 else
316 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
317 fi
269 if [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then 318 elif [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then
270 einfo "subversion switch start -->" 319 einfo "subversion switch start -->"
271 einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}" 320 einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}"
272 einfo " new repository: ${repo_uri}${revision:+@}${revision}" 321 einfo " new repository: ${repo_uri}${revision:+@}${revision}"
273 322
274 debug-print "${FUNCNAME}: ${ESVN_SWITCH_CMD} ${options} ${repo_uri}" 323 debug-print "${FUNCNAME}: ${ESVN_SWITCH_CMD} ${options} ${repo_uri}"
294 fi 343 fi
295 fi 344 fi
296 fi 345 fi
297 fi 346 fi
298 347
348 if [[ -n "${ESVN_UMASK}" ]]; then
349 eumask_pop
350 fi
351
299 einfo " working copy: ${wc_path}" 352 einfo " working copy: ${wc_path}"
300 353
301 if ! has "export" ${ESVN_RESTRICT}; then 354 if ! has "export" ${ESVN_RESTRICT}; then
302 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}" 355 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
303 356
308 #* "svn export" has a bug. see http://bugs.gentoo.org/119236 361 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
309 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}." 362 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
310 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}." 363 rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
311 fi 364 fi
312 365
366 popd > /dev/null
367
313 echo 368 echo
314} 369}
315 370
316# @FUNCTION: subversion_bootstrap 371# @FUNCTION: subversion_bootstrap
317# @DESCRIPTION: 372# @DESCRIPTION:
364 fi 419 fi
365} 420}
366 421
367# @FUNCTION: subversion_src_unpack 422# @FUNCTION: subversion_src_unpack
368# @DESCRIPTION: 423# @DESCRIPTION:
369# default src_unpack. fetch and bootstrap. 424# Default src_unpack. Fetch and, in older EAPIs, bootstrap.
370subversion_src_unpack() { 425subversion_src_unpack() {
371 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch." 426 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
427 if has "${EAPI:-0}" 0 1; then
428 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
429 fi
430}
431
432# @FUNCTION: subversion_src_prepare
433# @DESCRIPTION:
434# Default src_prepare. Bootstrap.
435subversion_src_prepare() {
372 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap." 436 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
373} 437}
374 438
375# @FUNCTION: subversion_wc_info 439# @FUNCTION: subversion_wc_info
376# @USAGE: [repo_uri] 440# @USAGE: [repo_uri]
407# 471#
408subversion__svn_info() { 472subversion__svn_info() {
409 local target="${1}" 473 local target="${1}"
410 local key="${2}" 474 local key="${2}"
411 475
476 env LC_ALL=C svn info \
477 ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" \
412 env LC_ALL=C svn info "${target}" | grep -i "^${key}" | cut -d" " -f2- 478 "${target}" | grep -i "^${key}" | cut -d" " -f2-
413} 479}
414 480
415## -- subversion__get_repository_uri() --------------------------------------- # 481## -- subversion__get_repository_uri() --------------------------------------- #
416# 482#
417# param $1 - a repository URI. 483# param $1 - a repository URI.

Legend:
Removed from v.1.63  
changed lines
  Added in v.1.75

  ViewVC Help
Powered by ViewVC 1.1.20