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

Diff of /eclass/subversion.eclass

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

Revision 1.60 Revision 1.75
1# Copyright 1999-2008 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.60 2008/05/27 09:49:09 zlin 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# 9# Arfrever Frehtes Taifersar Arahesis <arfrever@gentoo.org>
10# @AUTHOR:
10# Original Author: Akinori Hattori <hattya@gentoo.org> 11# Original Author: Akinori Hattori <hattya@gentoo.org>
11#
12# @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
13# @DESCRIPTION: 13# @DESCRIPTION:
14# The subversion eclass provides functions to fetch, patch and bootstrap 14# The subversion eclass provides functions to fetch, patch and bootstrap
15# software sources from subversion repositories. 15# software sources from subversion repositories.
16 16
17inherit eutils 17inherit eutils
18 18
19ESVN="${ECLASS}" 19ESVN="${ECLASS}"
20 20
21case "${EAPI:-0}" in
22 0|1)
21EXPORT_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
22 29
23DESCRIPTION="Based on the ${ECLASS} eclass" 30DESCRIPTION="Based on the ${ECLASS} eclass"
24 31
25DEPEND="dev-util/subversion 32SUBVERSION_DEPEND="dev-vcs/subversion
26 net-misc/rsync" 33 net-misc/rsync"
34
35if [[ -z "${ESVN_DISABLE_DEPENDENCIES}" ]]; then
36 DEPEND="${SUBVERSION_DEPEND}"
37fi
27 38
28# @ECLASS-VARIABLE: ESVN_STORE_DIR 39# @ECLASS-VARIABLE: ESVN_STORE_DIR
29# @DESCRIPTION: 40# @DESCRIPTION:
30# 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
31[[ -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"
74# to a specific revision 85# to a specific revision
75# 86#
76# Note: This should never be set in an ebuild! 87# Note: This should never be set in an ebuild!
77ESVN_REVISION="${ESVN_REVISION:-}" 88ESVN_REVISION="${ESVN_REVISION:-}"
78 89
90# @ECLASS-VARIABLE: ESVN_USER
91# @DESCRIPTION:
92# User name
93ESVN_USER="${ESVN_USER:-}"
94
95# @ECLASS-VARIABLE: ESVN_PASSWORD
96# @DESCRIPTION:
97# Password
98ESVN_PASSWORD="${ESVN_PASSWORD:-}"
99
79# @ECLASS-VARIABLE: ESVN_PROJECT 100# @ECLASS-VARIABLE: ESVN_PROJECT
80# @DESCRIPTION: 101# @DESCRIPTION:
81# project name of your ebuild (= name space) 102# project name of your ebuild (= name space)
82# 103#
83# subversion eclass will check out the subversion repository like: 104# subversion eclass will check out the subversion repository like:
120# restrict. 141# restrict.
121# export) 142# export)
122# don't export the working copy to S. 143# don't export the working copy to S.
123ESVN_RESTRICT="${ESVN_RESTRICT:-}" 144ESVN_RESTRICT="${ESVN_RESTRICT:-}"
124 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
125# @ECLASS-VARIABLE: ESVN_OFFLINE 152# @ECLASS-VARIABLE: ESVN_OFFLINE
126# @DESCRIPTION: 153# @DESCRIPTION:
127# 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
128# 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
129# tree by users. 156# tree by users.
130ESVN_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}}"
131 168
132# @ECLASS-VARIABLE: ESVN_UP_FREQ 169# @ECLASS-VARIABLE: ESVN_UP_FREQ
133# @DESCRIPTION: 170# @DESCRIPTION:
134# 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
135# 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
167 # check for the protocol 204 # check for the protocol
168 local protocol="${repo_uri%%:*}" 205 local protocol="${repo_uri%%:*}"
169 206
170 case "${protocol}" in 207 case "${protocol}" in
171 http|https) 208 http|https)
172 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
173 built_with_use --missing false dev-util/subversion nowebdav ; then
174 echo 210 echo
175 eerror "In order to emerge this package, you need to" 211 eerror "In order to emerge this package, you need to"
176 eerror "reinstall Subversion with support for WebDAV." 212 eerror "reinstall Subversion with support for WebDAV."
177 eerror "Subversion requires either Neon or Serf to support WebDAV." 213 eerror "Subversion requires either Neon or Serf to support WebDAV."
178 echo 214 echo
187 esac 223 esac
188 224
189 addread "/etc/subversion" 225 addread "/etc/subversion"
190 addwrite "${ESVN_STORE_DIR}" 226 addwrite "${ESVN_STORE_DIR}"
191 227
228 if [[ -n "${ESVN_UMASK}" ]]; then
229 eumask_push "${ESVN_UMASK}"
230 fi
231
192 if [[ ! -d ${ESVN_STORE_DIR} ]]; then 232 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
193 debug-print "${FUNCNAME}: initial checkout. creating subversion directory" 233 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
194 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}."
195 fi 235 fi
196 236
197 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}"
198 238
199 local wc_path="$(subversion__get_wc_path "${repo_uri}")" 239 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
200 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion" 240 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
201 241
202 [[ -n "${revision}" ]] && options="${options} -r ${revision}" 242 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
204 if [[ "${ESVN_OPTIONS}" = *-r* ]]; then 244 if [[ "${ESVN_OPTIONS}" = *-r* ]]; then
205 ewarn "\${ESVN_OPTIONS} contains -r, this usage is unsupported. Please" 245 ewarn "\${ESVN_OPTIONS} contains -r, this usage is unsupported. Please"
206 ewarn "see \${ESVN_REPO_URI}" 246 ewarn "see \${ESVN_REPO_URI}"
207 fi 247 fi
208 248
249 if has_version ">=dev-vcs/subversion-1.6.0"; then
250 options="${options} --config-option=config:auth:password-stores="
251 fi
252
209 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\"" 253 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
210 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\"" 254 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
211 debug-print "${FUNCNAME}: options = \"${options}\"" 255 debug-print "${FUNCNAME}: options = \"${options}\""
212 256
213 if [[ ! -d ${wc_path}/.svn ]]; then 257 if [[ ! -d ${wc_path}/.svn ]]; then
214 if [[ -n ${ESVN_OFFLINE} ]]; then 258 if [[ -n ${ESVN_OFFLINE} ]]; then
215 ewarn "ESVN_OFFLINE cannot be used when the there is no existing checkout." 259 ewarn "ESVN_OFFLINE cannot be used when there is no existing checkout."
216 fi 260 fi
217 # first check out 261 # first check out
218 einfo "subversion check out start -->" 262 einfo "subversion check out start -->"
219 einfo " repository: ${repo_uri}${revision:+@}${revision}" 263 einfo " repository: ${repo_uri}${revision:+@}${revision}"
220 264
221 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}" 265 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
222 266
223 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}."
224 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}" 268 cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
269 if [[ -n "${ESVN_USER}" ]]; then
270 ${ESVN_FETCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
271 else
225 ${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}."
273 fi
226 274
227 elif [[ -n ${ESVN_OFFLINE} ]]; then 275 elif [[ -n ${ESVN_OFFLINE} ]]; then
276 svn upgrade "${wc_path}" &>/dev/null
277 svn cleanup "${wc_path}" &>/dev/null
228 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."
229 if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then 279 if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then
230 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."
231 fi 281 fi
232 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}."
233 else 283 else
284 svn upgrade "${wc_path}" &>/dev/null
285 svn cleanup "${wc_path}" &>/dev/null
234 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."
235 287
236 local esvn_up_freq= 288 local esvn_up_freq=
237 if [[ -n ${ESVN_UP_FREQ} ]]; then 289 if [[ -n ${ESVN_UP_FREQ} ]]; then
238 if [[ -n ${ESVN_UP_FREQ//[[:digit:]]} ]]; then 290 if [[ -n ${ESVN_UP_FREQ//[[:digit:]]} ]]; then
243 esvn_up_freq=no_update 295 esvn_up_freq=no_update
244 fi 296 fi
245 fi 297 fi
246 298
247 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
248 if [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then 318 elif [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then
249 einfo "subversion switch start -->" 319 einfo "subversion switch start -->"
250 einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}" 320 einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}"
251 einfo " new repository: ${repo_uri}${revision:+@}${revision}" 321 einfo " new repository: ${repo_uri}${revision:+@}${revision}"
252 322
253 debug-print "${FUNCNAME}: ${ESVN_SWITCH_CMD} ${options} ${repo_uri}" 323 debug-print "${FUNCNAME}: ${ESVN_SWITCH_CMD} ${options} ${repo_uri}"
254 324
255 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}" 325 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
326 if [[ -n "${ESVN_USER}" ]]; then
327 ${ESVN_SWITCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" ${repo_uri} || die "${ESVN}: can't update ${wc_path} from ${repo_uri}."
328 else
256 ${ESVN_SWITCH_CMD} ${options} ${repo_uri} || die "${ESVN}: can't update ${wc_path} from ${repo_uri}" 329 ${ESVN_SWITCH_CMD} ${options} ${repo_uri} || die "${ESVN}: can't update ${wc_path} from ${repo_uri}."
330 fi
257 else 331 else
258 # update working copy 332 # update working copy
259 einfo "subversion update start -->" 333 einfo "subversion update start -->"
260 einfo " repository: ${repo_uri}${revision:+@}${revision}" 334 einfo " repository: ${repo_uri}${revision:+@}${revision}"
261 335
262 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}" 336 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
263 337
264 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}" 338 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
339 if [[ -n "${ESVN_USER}" ]]; then
340 ${ESVN_UPDATE_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" || die "${ESVN}: can't update ${wc_path} from ${repo_uri}."
341 else
265 ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update ${wc_path} from ${repo_uri}." 342 ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update ${wc_path} from ${repo_uri}."
343 fi
266 fi 344 fi
267 fi 345 fi
346 fi
347
348 if [[ -n "${ESVN_UMASK}" ]]; then
349 eumask_pop
268 fi 350 fi
269 351
270 einfo " working copy: ${wc_path}" 352 einfo " working copy: ${wc_path}"
271 353
272 if ! has "export" ${ESVN_RESTRICT}; then 354 if ! has "export" ${ESVN_RESTRICT}; then
279 #* "svn export" has a bug. see http://bugs.gentoo.org/119236 361 #* "svn export" has a bug. see http://bugs.gentoo.org/119236
280 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}." 362 #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
281 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}."
282 fi 364 fi
283 365
366 popd > /dev/null
367
284 echo 368 echo
285} 369}
286 370
287# @FUNCTION: subversion_bootstrap 371# @FUNCTION: subversion_bootstrap
288# @DESCRIPTION: 372# @DESCRIPTION:
335 fi 419 fi
336} 420}
337 421
338# @FUNCTION: subversion_src_unpack 422# @FUNCTION: subversion_src_unpack
339# @DESCRIPTION: 423# @DESCRIPTION:
340# default src_unpack. fetch and bootstrap. 424# Default src_unpack. Fetch and, in older EAPIs, bootstrap.
341subversion_src_unpack() { 425subversion_src_unpack() {
342 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() {
343 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap." 436 subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
344} 437}
345 438
346# @FUNCTION: subversion_wc_info 439# @FUNCTION: subversion_wc_info
347# @USAGE: [repo_uri] 440# @USAGE: [repo_uri]
378# 471#
379subversion__svn_info() { 472subversion__svn_info() {
380 local target="${1}" 473 local target="${1}"
381 local key="${2}" 474 local key="${2}"
382 475
476 env LC_ALL=C svn info \
477 ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" \
383 env LC_ALL=C svn info "${target}" | grep -i "^${key}" | cut -d" " -f2- 478 "${target}" | grep -i "^${key}" | cut -d" " -f2-
384} 479}
385 480
386## -- subversion__get_repository_uri() --------------------------------------- # 481## -- subversion__get_repository_uri() --------------------------------------- #
387# 482#
388# param $1 - a repository URI. 483# param $1 - a repository URI.

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

  ViewVC Help
Powered by ViewVC 1.1.20