/[gentoo-x86]/eclass/git-2.eclass
Gentoo

Diff of /eclass/git-2.eclass

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

Revision 1.18 Revision 1.35
1# Copyright 1999-2011 Gentoo Foundation 1# Copyright 1999-2014 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/git-2.eclass,v 1.18 2011/09/23 13:57:28 mgorny Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/git-2.eclass,v 1.35 2014/11/20 15:32:09 mgorny Exp $
4 4
5# @ECLASS: git-2.eclass 5# @ECLASS: git-2.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# Michał Górny <mgorny@gentoo.org>
7# Donnie Berkholz <dberkholz@gentoo.org> 8# Donnie Berkholz <dberkholz@gentoo.org>
8# @BLURB: Eclass for fetching and unpacking git repositories. 9# @BLURB: Eclass for fetching and unpacking git repositories.
9# @DESCRIPTION: 10# @DESCRIPTION:
10# Eclass for easing maitenance of live ebuilds using git as remote repository. 11# Eclass for easing maitenance of live ebuilds using git as remote repository.
11# Eclass support working with git submodules and branching. 12# Eclass support working with git submodules and branching.
13#
14# This eclass is DEPRECATED. Please use git-r3 instead.
12 15
13# This eclass support all EAPIs 16# This eclass support all EAPIs
14EXPORT_FUNCTIONS src_unpack 17EXPORT_FUNCTIONS src_unpack
15 18
16DEPEND="dev-vcs/git" 19DEPEND="dev-vcs/git"
66# @DEFAULT_UNSET 69# @DEFAULT_UNSET
67# @DESCRIPTION: 70# @DESCRIPTION:
68# URI for the repository 71# URI for the repository
69# e.g. http://foo, git://bar 72# e.g. http://foo, git://bar
70# 73#
74# It can be overriden via env using packagename_LIVE_REPO
75# variable.
76#
71# Support multiple values: 77# Support multiple values:
72# EGIT_REPO_URI="git://a/b.git http://c/d.git" 78# EGIT_REPO_URI="git://a/b.git http://c/d.git"
73 79
74# @ECLASS-VARIABLE: EVCS_OFFLINE 80# @ECLASS-VARIABLE: EVCS_OFFLINE
75# @DEFAULT_UNSET 81# @DEFAULT_UNSET
118# @DESCRIPTION: 124# @DESCRIPTION:
119# If non-empty this variable bans unpacking of ${A} content into the srcdir. 125# If non-empty this variable bans unpacking of ${A} content into the srcdir.
120# Default behaviour is to unpack ${A} content. 126# Default behaviour is to unpack ${A} content.
121 127
122# @FUNCTION: git-2_init_variables 128# @FUNCTION: git-2_init_variables
129# @INTERNAL
123# @DESCRIPTION: 130# @DESCRIPTION:
124# Internal function initializing all git variables. 131# Internal function initializing all git variables.
125# We define it in function scope so user can define 132# We define it in function scope so user can define
126# all the variables before and after inherit. 133# all the variables before and after inherit.
127git-2_init_variables() { 134git-2_init_variables() {
158 165
159 : ${EGIT_PRUNE:=} 166 : ${EGIT_PRUNE:=}
160} 167}
161 168
162# @FUNCTION: git-2_submodules 169# @FUNCTION: git-2_submodules
170# @INTERNAL
163# @DESCRIPTION: 171# @DESCRIPTION:
164# Internal function wrapping the submodule initialisation and update. 172# Internal function wrapping the submodule initialisation and update.
165git-2_submodules() { 173git-2_submodules() {
166 debug-print-function ${FUNCNAME} "$@" 174 debug-print-function ${FUNCNAME} "$@"
167 if [[ ${EGIT_HAS_SUBMODULES} ]]; then 175 if [[ ${EGIT_HAS_SUBMODULES} ]]; then
184 popd > /dev/null 192 popd > /dev/null
185 fi 193 fi
186} 194}
187 195
188# @FUNCTION: git-2_branch 196# @FUNCTION: git-2_branch
197# @INTERNAL
189# @DESCRIPTION: 198# @DESCRIPTION:
190# Internal function that changes branch for the repo based on EGIT_COMMIT and 199# Internal function that changes branch for the repo based on EGIT_COMMIT and
191# EGIT_BRANCH variables. 200# EGIT_BRANCH variables.
192git-2_branch() { 201git-2_branch() {
193 debug-print-function ${FUNCNAME} "$@" 202 debug-print-function ${FUNCNAME} "$@"
208 217
209 popd > /dev/null 218 popd > /dev/null
210} 219}
211 220
212# @FUNCTION: git-2_gc 221# @FUNCTION: git-2_gc
222# @INTERNAL
213# @DESCRIPTION: 223# @DESCRIPTION:
214# Internal function running garbage collector on checked out tree. 224# Internal function running garbage collector on checked out tree.
215git-2_gc() { 225git-2_gc() {
216 debug-print-function ${FUNCNAME} "$@" 226 debug-print-function ${FUNCNAME} "$@"
217 227
218 local args 228 local args
219 229
220 pushd "${EGIT_DIR}" > /dev/null
221 if [[ ${EGIT_REPACK} || ${EGIT_PRUNE} ]]; then 230 if [[ ${EGIT_REPACK} || ${EGIT_PRUNE} ]]; then
231 pushd "${EGIT_DIR}" > /dev/null
222 ebegin "Garbage collecting the repository" 232 ebegin "Garbage collecting the repository"
223 [[ ${EGIT_PRUNE} ]] && args='--prune' 233 [[ ${EGIT_PRUNE} ]] && args='--prune'
224 debug-print "${FUNCNAME}: git gc ${args}" 234 debug-print "${FUNCNAME}: git gc ${args}"
225 git gc ${args} 235 git gc ${args}
226 eend $? 236 eend $?
227 fi
228 popd > /dev/null 237 popd > /dev/null
238 fi
229} 239}
230 240
231# @FUNCTION: git-2_prepare_storedir 241# @FUNCTION: git-2_prepare_storedir
242# @INTERNAL
232# @DESCRIPTION: 243# @DESCRIPTION:
233# Internal function preparing directory where we are going to store SCM 244# Internal function preparing directory where we are going to store SCM
234# repository. 245# repository.
235git-2_prepare_storedir() { 246git-2_prepare_storedir() {
236 debug-print-function ${FUNCNAME} "$@" 247 debug-print-function ${FUNCNAME} "$@"
240 # initial clone, we have to create master git storage directory and play 251 # initial clone, we have to create master git storage directory and play
241 # nicely with sandbox 252 # nicely with sandbox
242 if [[ ! -d ${EGIT_STORE_DIR} ]]; then 253 if [[ ! -d ${EGIT_STORE_DIR} ]]; then
243 debug-print "${FUNCNAME}: Creating git main storage directory" 254 debug-print "${FUNCNAME}: Creating git main storage directory"
244 addwrite / 255 addwrite /
245 mkdir -p "${EGIT_STORE_DIR}" \ 256 mkdir -m 775 -p "${EGIT_STORE_DIR}" \
246 || die "${FUNCNAME}: can't mkdir \"${EGIT_STORE_DIR}\"" 257 || die "${FUNCNAME}: can't mkdir \"${EGIT_STORE_DIR}\""
247 fi 258 fi
248 259
249 # allow writing into EGIT_STORE_DIR 260 # allow writing into EGIT_STORE_DIR
250 addwrite "${EGIT_STORE_DIR}" 261 addwrite "${EGIT_STORE_DIR}"
262
263 # calculate git.eclass store dir for data
264 # We will try to clone the old repository,
265 # and we will remove it if we don't need it anymore.
266 EGIT_OLD_CLONE=
267 if [[ ${EGIT_STORE_DIR} == */egit-src ]]; then
268 local old_store_dir=${EGIT_STORE_DIR/%egit-src/git-src}
269 local old_location=${old_store_dir}/${EGIT_PROJECT:-${PN}}
270
271 if [[ -d ${old_location} ]]; then
272 EGIT_OLD_CLONE=${old_location}
273 # required to remove the old clone
274 addwrite "${old_store_dir}"
275 fi
276 fi
277
251 # calculate the proper store dir for data 278 # calculate the proper store dir for data
252 # If user didn't specify the EGIT_DIR, we check if he did specify 279 # If user didn't specify the EGIT_DIR, we check if he did specify
253 # the EGIT_PROJECT or get the folder name from EGIT_REPO_URI. 280 # the EGIT_PROJECT or get the folder name from EGIT_REPO_URI.
254 EGIT_REPO_URI=${EGIT_REPO_URI%/} 281 EGIT_REPO_URI=${EGIT_REPO_URI%/}
255 if [[ ! ${EGIT_DIR} ]]; then 282 if [[ ! ${EGIT_DIR} ]]; then
256 if [[ ${EGIT_PROJECT} ]]; then 283 if [[ ${EGIT_PROJECT} ]]; then
257 clone_dir=${EGIT_PROJECT} 284 clone_dir=${EGIT_PROJECT}
258 else 285 else
259 clone_dir=${EGIT_REPO_URI##*/} 286 local strippeduri=${EGIT_REPO_URI%/.git}
287 clone_dir=${strippeduri##*/}
260 fi 288 fi
261 EGIT_DIR=${EGIT_STORE_DIR}/${clone_dir} 289 EGIT_DIR=${EGIT_STORE_DIR}/${clone_dir}
290
291 if [[ ${EGIT_OLD_CLONE} && ! -d ${EGIT_DIR} ]]; then
292 elog "${FUNCNAME}: ${CATEGORY}/${PF} will be cloned from old location."
293 elog "It will be necessary to rebuild the package to fetch updates."
294 EGIT_REPO_URI="${EGIT_OLD_CLONE} ${EGIT_REPO_URI}"
295 fi
262 fi 296 fi
263 export EGIT_DIR=${EGIT_DIR} 297 export EGIT_DIR=${EGIT_DIR}
264 debug-print "${FUNCNAME}: Storing the repo into \"${EGIT_DIR}\"." 298 debug-print "${FUNCNAME}: Storing the repo into \"${EGIT_DIR}\"."
265} 299}
266 300
267# @FUNCTION: git-2_move_source 301# @FUNCTION: git-2_move_source
302# @INTERNAL
268# @DESCRIPTION: 303# @DESCRIPTION:
269# Internal function moving sources from the EGIT_DIR to EGIT_SOURCEDIR dir. 304# Internal function moving sources from the EGIT_DIR to EGIT_SOURCEDIR dir.
270git-2_move_source() { 305git-2_move_source() {
271 debug-print-function ${FUNCNAME} "$@" 306 debug-print-function ${FUNCNAME} "$@"
272 307
278 || die "${FUNCNAME}: sync to \"${EGIT_SOURCEDIR}\" failed" 313 || die "${FUNCNAME}: sync to \"${EGIT_SOURCEDIR}\" failed"
279 popd > /dev/null 314 popd > /dev/null
280} 315}
281 316
282# @FUNCTION: git-2_initial_clone 317# @FUNCTION: git-2_initial_clone
318# @INTERNAL
283# @DESCRIPTION: 319# @DESCRIPTION:
284# Internal function running initial clone on specified repo_uri. 320# Internal function running initial clone on specified repo_uri.
285git-2_initial_clone() { 321git-2_initial_clone() {
286 debug-print-function ${FUNCNAME} "$@" 322 debug-print-function ${FUNCNAME} "$@"
287 323
301 [[ ${EGIT_REPO_URI_SELECTED} ]] \ 337 [[ ${EGIT_REPO_URI_SELECTED} ]] \
302 || die "${FUNCNAME}: can't fetch from ${EGIT_REPO_URI}" 338 || die "${FUNCNAME}: can't fetch from ${EGIT_REPO_URI}"
303} 339}
304 340
305# @FUNCTION: git-2_update_repo 341# @FUNCTION: git-2_update_repo
342# @INTERNAL
306# @DESCRIPTION: 343# @DESCRIPTION:
307# Internal function running update command on specified repo_uri. 344# Internal function running update command on specified repo_uri.
308git-2_update_repo() { 345git-2_update_repo() {
309 debug-print-function ${FUNCNAME} "$@" 346 debug-print-function ${FUNCNAME} "$@"
310 347
336 [[ ${EGIT_REPO_URI_SELECTED} ]] \ 373 [[ ${EGIT_REPO_URI_SELECTED} ]] \
337 || die "${FUNCNAME}: can't update from ${EGIT_REPO_URI}" 374 || die "${FUNCNAME}: can't update from ${EGIT_REPO_URI}"
338} 375}
339 376
340# @FUNCTION: git-2_fetch 377# @FUNCTION: git-2_fetch
378# @INTERNAL
341# @DESCRIPTION: 379# @DESCRIPTION:
342# Internal function fetching repository from EGIT_REPO_URI and storing it in 380# Internal function fetching repository from EGIT_REPO_URI and storing it in
343# specified EGIT_STORE_DIR. 381# specified EGIT_STORE_DIR.
344git-2_fetch() { 382git-2_fetch() {
345 debug-print-function ${FUNCNAME} "$@" 383 debug-print-function ${FUNCNAME} "$@"
391 [[ ${EGIT_COMMIT} != ${EGIT_BRANCH} ]] \ 429 [[ ${EGIT_COMMIT} != ${EGIT_BRANCH} ]] \
392 && echo " commit: ${EGIT_COMMIT}" 430 && echo " commit: ${EGIT_COMMIT}"
393 echo " branch: ${EGIT_BRANCH}" 431 echo " branch: ${EGIT_BRANCH}"
394 echo " storage directory: \"${EGIT_DIR}\"" 432 echo " storage directory: \"${EGIT_DIR}\""
395 echo " checkout type: ${repo_type}" 433 echo " checkout type: ${repo_type}"
434
435 # Cleanup after git.eclass
436 if [[ ${EGIT_OLD_CLONE} ]]; then
437 einfo "${FUNCNAME}: removing old clone in ${EGIT_OLD_CLONE}."
438 rm -rf "${EGIT_OLD_CLONE}"
439 fi
396} 440}
397 441
398# @FUNCTION: git_bootstrap 442# @FUNCTION: git_bootstrap
443# @INTERNAL
399# @DESCRIPTION: 444# @DESCRIPTION:
400# Internal function that runs bootstrap command on unpacked source. 445# Internal function that runs bootstrap command on unpacked source.
401git-2_bootstrap() { 446git-2_bootstrap() {
402 debug-print-function ${FUNCNAME} "$@" 447 debug-print-function ${FUNCNAME} "$@"
403 448
436 popd > /dev/null 481 popd > /dev/null
437 fi 482 fi
438} 483}
439 484
440# @FUNCTION: git-2_migrate_repository 485# @FUNCTION: git-2_migrate_repository
486# @INTERNAL
441# @DESCRIPTION: 487# @DESCRIPTION:
442# Internal function migrating between bare and normal checkout repository. 488# Internal function migrating between bare and normal checkout repository.
443# This is based on usage of EGIT_SUBMODULES, at least until they 489# This is based on usage of EGIT_SUBMODULES, at least until they
444# start to work with bare checkouts sanely. 490# start to work with bare checkouts sanely.
445# This function also set some global variables that differ between 491# This function also set some global variables that differ between
446# bare and non-bare checkout. 492# bare and non-bare checkout.
447git-2_migrate_repository() { 493git-2_migrate_repository() {
448 debug-print-function ${FUNCNAME} "$@" 494 debug-print-function ${FUNCNAME} "$@"
449 495
450 local target returnstate 496 local bare returnstate
451 497
452 # first find out if we have submodules 498 # first find out if we have submodules
499 # or user explicitly wants us to use non-bare clones
453 if [[ ! ${EGIT_HAS_SUBMODULES} ]]; then 500 if ! [[ ${EGIT_HAS_SUBMODULES} || ${EGIT_NONBARE} ]]; then
454 target="bare" 501 bare=1
455 else
456 target="full"
457 fi
458 # check if user didn't specify that we want non-bare repo
459 if [[ ${EGIT_NONBARE} ]]; then
460 target="full"
461 EGIT_LOCAL_NONBARE="true"
462 fi 502 fi
463 503
464 # test if we already have some repo and if so find out if we have 504 # test if we already have some repo and if so find out if we have
465 # to migrate the data 505 # to migrate the data
466 if [[ -d ${EGIT_DIR} ]]; then 506 if [[ -d ${EGIT_DIR} ]]; then
467 if [[ ${target} == bare && -d ${EGIT_DIR}/.git ]]; then 507 if [[ ${bare} && -d ${EGIT_DIR}/.git ]]; then
468 debug-print "${FUNCNAME}: converting \"${EGIT_DIR}\" to bare copy" 508 debug-print "${FUNCNAME}: converting \"${EGIT_DIR}\" to bare copy"
469 509
470 ebegin "Converting \"${EGIT_DIR}\" from non-bare to bare copy" 510 ebegin "Converting \"${EGIT_DIR}\" from non-bare to bare copy"
471 mv "${EGIT_DIR}/.git" "${EGIT_DIR}.bare" 511 mv "${EGIT_DIR}/.git" "${EGIT_DIR}.bare"
472 export GIT_DIR="${EGIT_DIR}.bare" 512 export GIT_DIR="${EGIT_DIR}.bare"
474 returnstate=$? 514 returnstate=$?
475 unset GIT_DIR 515 unset GIT_DIR
476 rm -rf "${EGIT_DIR}" 516 rm -rf "${EGIT_DIR}"
477 mv "${EGIT_DIR}.bare" "${EGIT_DIR}" 517 mv "${EGIT_DIR}.bare" "${EGIT_DIR}"
478 eend ${returnstate} 518 eend ${returnstate}
479 fi
480 if [[ ${target} == full && ! -d ${EGIT_DIR}/.git ]]; then 519 elif [[ ! ${bare} && ! -d ${EGIT_DIR}/.git ]]; then
481 debug-print "${FUNCNAME}: converting \"${EGIT_DIR}\" to non-bare copy" 520 debug-print "${FUNCNAME}: converting \"${EGIT_DIR}\" to non-bare copy"
482 521
483 ebegin "Converting \"${EGIT_DIR}\" from bare to non-bare copy" 522 ebegin "Converting \"${EGIT_DIR}\" from bare to non-bare copy"
484 git clone -l "${EGIT_DIR}" "${EGIT_DIR}.nonbare" > /dev/null 523 git clone -l "${EGIT_DIR}" "${EGIT_DIR}.nonbare" > /dev/null
485 returnstate=$? 524 returnstate=$?
495 einfo "Migration failed, removing \"${EGIT_DIR}\" to start from scratch." 534 einfo "Migration failed, removing \"${EGIT_DIR}\" to start from scratch."
496 rm -rf "${EGIT_DIR}" 535 rm -rf "${EGIT_DIR}"
497 fi 536 fi
498 537
499 # set various options to work with both targets 538 # set various options to work with both targets
500 if [[ ${target} == bare ]]; then 539 if [[ ${bare} ]]; then
501 debug-print "${FUNCNAME}: working in bare repository for \"${EGIT_DIR}\"" 540 debug-print "${FUNCNAME}: working in bare repository for \"${EGIT_DIR}\""
502 EGIT_LOCAL_OPTIONS+="${EGIT_OPTIONS} --bare" 541 EGIT_LOCAL_OPTIONS+="${EGIT_OPTIONS} --bare"
503 MOVE_COMMAND="git clone -l -s -n ${EGIT_DIR// /\\ }" 542 MOVE_COMMAND="git clone -l -s -n ${EGIT_DIR// /\\ }"
504 EGIT_UPDATE_CMD="git fetch -t -f -u origin ${EGIT_BRANCH}:${EGIT_BRANCH}" 543 EGIT_UPDATE_CMD="git fetch -t -f -u origin ${EGIT_BRANCH}:${EGIT_BRANCH}"
505 UPSTREAM_BRANCH="${EGIT_BRANCH}" 544 UPSTREAM_BRANCH="${EGIT_BRANCH}"
545 EGIT_LOCAL_NONBARE=
506 else 546 else
507 debug-print "${FUNCNAME}: working in bare repository for non-bare \"${EGIT_DIR}\"" 547 debug-print "${FUNCNAME}: working in bare repository for non-bare \"${EGIT_DIR}\""
508 MOVE_COMMAND="cp -pPR ." 548 MOVE_COMMAND="cp -pPR ."
509 EGIT_LOCAL_OPTIONS="${EGIT_OPTIONS}" 549 EGIT_LOCAL_OPTIONS="${EGIT_OPTIONS}"
510 EGIT_UPDATE_CMD="git pull -f -u ${EGIT_OPTIONS}" 550 EGIT_UPDATE_CMD="git pull -f -u ${EGIT_OPTIONS}"
512 EGIT_LOCAL_NONBARE="true" 552 EGIT_LOCAL_NONBARE="true"
513 fi 553 fi
514} 554}
515 555
516# @FUNCTION: git-2_cleanup 556# @FUNCTION: git-2_cleanup
557# @INTERNAL
517# @DESCRIPTION: 558# @DESCRIPTION:
518# Internal function cleaning up all the global variables 559# Internal function cleaning up all the global variables
519# that are not required after the unpack has been done. 560# that are not required after the unpack has been done.
520git-2_cleanup() { 561git-2_cleanup() {
521 debug-print-function ${FUNCNAME} "$@" 562 debug-print-function ${FUNCNAME} "$@"

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.35

  ViewVC Help
Powered by ViewVC 1.1.20