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

Contents of /eclass/git.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.39 - (hide annotations) (download)
Mon Jan 25 17:15:18 2010 UTC (4 years, 7 months ago) by scarabeus
Branch: MAIN
Changes since 1.38: +2 -2 lines
Fix non-master master breakage with deleting own branch.

1 scarabeus 1.17 # Copyright 1999-2009 Gentoo Foundation
2 ferdy 1.1 # Distributed under the terms of the GNU General Public License v2
3 scarabeus 1.39 # $Header: /var/cvsroot/gentoo-x86/eclass/git.eclass,v 1.38 2010/01/23 15:46:50 scarabeus Exp $
4 ferdy 1.1
5 scarabeus 1.17 # @ECLASS: git.eclass
6     # @MAINTAINER:
7     # Tomas Chvatal <scarabeus@gentoo.org>
8     # Donnie Berkholz <dberkholz@gentoo.org>
9 scarabeus 1.20 # @BLURB: This eclass provides functions for fetch and unpack git repositories
10 scarabeus 1.17 # @DESCRIPTION:
11     # The eclass is based on subversion eclass.
12     # If you use this eclass, the ${S} is ${WORKDIR}/${P}.
13     # It is necessary to define the EGIT_REPO_URI variable at least.
14     # @THANKS TO:
15     # Fernando J. Pereda <ferdy@gentoo.org>
16 ferdy 1.1
17 scarabeus 1.25 inherit eutils
18 ferdy 1.1
19     EGIT="git.eclass"
20    
21 scarabeus 1.17 EXPORTED_FUNCTIONS="src_unpack"
22     case "${EAPI:-0}" in
23 scarabeus 1.19 2) EXPORTED_FUNCTIONS="${EXPORTED_FUNCTIONS} src_prepare" ;;
24 scarabeus 1.17 0|1) ;;
25     *) die "Unknown EAPI, Bug eclass maintainers." ;;
26     esac
27     EXPORT_FUNCTIONS ${EXPORTED_FUNCTIONS}
28 ferdy 1.1
29 scarabeus 1.17 # define some nice defaults but only if nothing is set already
30     : ${HOMEPAGE:=http://git-scm.com/}
31 ferdy 1.1
32 scarabeus 1.17 # We DEPEND on at least a bit recent git version
33     DEPEND=">=dev-util/git-1.6"
34 ferdy 1.1
35 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_QUIET
36     # @DESCRIPTION:
37     # Enables user specified verbosity for the eclass elog informations.
38     # The user just needs to add EGIT_QUIET="ON" to the /etc/make.conf.
39     : ${EGIT_QUIET:="OFF"}
40 ferdy 1.1
41 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_STORE_DIR
42     # @DESCRIPTION:
43     # Storage directory for git sources.
44 scarabeus 1.27 # Can be redefined.
45     [[ -z ${EGIT_STORE_DIR} ]] && EGIT_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/git-src"
46 ferdy 1.1
47 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_FETCH_CMD
48     # @DESCRIPTION:
49     # Command for cloning the repository.
50 scarabeus 1.32 : ${EGIT_FETCH_CMD:="git clone"}
51 ferdy 1.1
52 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_UPDATE_CMD
53     # @DESCRIPTION:
54     # Git fetch command.
55 scarabeus 1.35 EGIT_UPDATE_CMD="git pull -f -u"
56 ferdy 1.1
57 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_DIFFSTAT_CMD
58     # @DESCRIPTION:
59     # Git command for diffstat.
60 robbat2 1.18 EGIT_DIFFSTAT_CMD="git --no-pager diff --stat"
61 ferdy 1.1
62 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_OPTIONS
63     # @DESCRIPTION:
64     # This variable value is passed to clone and fetch.
65 ferdy 1.1 : ${EGIT_OPTIONS:=}
66    
67 scarabeus 1.38 # @ECLASS-VARIABLE: EGIT_MASTER
68     # @DESCRIPTION:
69     # Variable for specifying master branch.
70     # Usefull when upstream don't have master branch.
71     : ${EGIT_MASTER:=master}
72    
73 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_REPO_URI
74     # @DESCRIPTION:
75     # URI for the repository
76 ferdy 1.1 # e.g. http://foo, git://bar
77 scarabeus 1.17 # Supported protocols:
78 ferdy 1.1 # http://
79     # https://
80     # git://
81     # git+ssh://
82     # rsync://
83     # ssh://
84 scarabeus 1.29 eval X="\$${PN//[-+]/_}_LIVE_REPO"
85 scarabeus 1.28 if [[ ${X} = "" ]]; then
86     EGIT_REPO_URI=${EGIT_REPO_URI:=}
87     else
88     EGIT_REPO_URI="${X}"
89     fi
90 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_PROJECT
91     # @DESCRIPTION:
92     # Project name of your ebuild.
93     # Git eclass will check out the git repository like:
94     # ${EGIT_STORE_DIR}/${EGIT_PROJECT}/${EGIT_REPO_URI##*/}
95 ferdy 1.1 # so if you define EGIT_REPO_URI as http://git.collab.net/repo/git or
96     # http://git.collab.net/repo/git. and PN is subversion-git.
97     # it will check out like:
98 scarabeus 1.17 # ${EGIT_STORE_DIR}/subversion
99 ferdy 1.1 : ${EGIT_PROJECT:=${PN/-git}}
100    
101 scarabeus 1.31 # @ECLASS-VARIABLE: EGIT_BOOTSTRAP
102 scarabeus 1.17 # @DESCRIPTION:
103     # bootstrap script or command like autogen.sh or etc...
104 ferdy 1.1 : ${EGIT_BOOTSTRAP:=}
105    
106 robbat2 1.9 # @ECLASS-VARIABLE: EGIT_OFFLINE
107     # @DESCRIPTION:
108     # Set this variable to a non-empty value to disable the automatic updating of
109 robbat2 1.10 # an GIT source tree. This is intended to be set outside the git source
110 robbat2 1.9 # tree by users.
111     EGIT_OFFLINE="${EGIT_OFFLINE:-${ESCM_OFFLINE}}"
112 ferdy 1.1
113 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_PATCHES
114     # @DESCRIPTION:
115     # Similar to PATCHES array from base.eclass
116     # Only difference is that this patches are applied before bootstrap.
117     # Please take note that this variable should be bash array.
118 ferdy 1.1
119 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_BRANCH
120     # @DESCRIPTION:
121 ferdy 1.1 # git eclass can fetch any branch in git_fetch().
122 scarabeus 1.29 eval X="\$${PN//[-+]/_}_LIVE_BRANCH"
123 scarabeus 1.28 if [[ ${X} = "" ]]; then
124     EGIT_BRANCH=${EGIT_BRANCH:=master}
125     else
126     EGIT_BRANCH="${X}"
127     fi
128 ferdy 1.1
129 scarabeus 1.32 # @ECLASS-VARIABLE: EGIT_COMMIT
130 scarabeus 1.17 # @DESCRIPTION:
131 scarabeus 1.32 # git eclass can checkout any commit.
132     eval X="\$${PN//[-+]/_}_LIVE_COMMIT"
133 scarabeus 1.28 if [[ ${X} = "" ]]; then
134 scarabeus 1.32 : ${EGIT_COMMIT:=${EGIT_BRANCH}}
135 scarabeus 1.28 else
136 scarabeus 1.32 EGIT_COMMIT="${X}"
137 scarabeus 1.28 fi
138 ferdy 1.1
139 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_REPACK
140     # @DESCRIPTION:
141 ferdy 1.1 # git eclass will repack objects to save disk space. However this can take a
142 scarabeus 1.17 # long time with VERY big repositories.
143 ferdy 1.1 : ${EGIT_REPACK:=false}
144    
145 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_PRUNE
146     # @DESCRIPTION:
147 scarabeus 1.32 # git eclass can prune the local clone. This is useful if upstream rewinds and
148 scarabeus 1.17 # rebases branches too often.
149 ferdy 1.1 : ${EGIT_PRUNE:=false}
150    
151 scarabeus 1.32 # @FUNCTION: git_submodules
152     # @DESCRIPTION:
153     # Internal function wrapping the submodule initialisation and update
154 scarabeus 1.37 git_submodules() {
155 scarabeus 1.32 debug-print "git submodule init"
156     git submodule init
157     debug-print "git submodule update"
158     git submodule update
159     }
160    
161 scarabeus 1.36 # @FUNCTION: git_branch
162     # @DESCRIPTION:
163     # Internal function that changes branch for the repo based on EGIT_TREE and
164     # EGIT_BRANCH variables.
165     git_branch() {
166     local branchname=branch-${EGIT_BRANCH} src=origin/${EGIT_BRANCH}
167     if [[ ${EGIT_COMMIT} != ${EGIT_BRANCH} ]]; then
168     branchname=tree-${EGIT_COMMIT}
169     src=${EGIT_COMMIT}
170     fi
171     debug-print "git checkout -b ${branchname} ${src}"
172     git checkout -b ${branchname} ${src} &> /dev/null
173    
174     unset branchname src
175     }
176    
177 scarabeus 1.17 # @FUNCTION: git_fetch
178     # @DESCRIPTION:
179     # Gets repository from EGIT_REPO_URI and store it in specified EGIT_STORE_DIR
180     git_fetch() {
181     debug-print-function ${FUNCNAME} "$@"
182 ferdy 1.1
183 scarabeus 1.32 local GIT_DIR EGIT_CLONE_DIR oldsha1 cursha1
184 ferdy 1.1
185 scarabeus 1.17 # choose if user wants elog or just einfo.
186     if [[ ${EGIT_QUIET} != OFF ]]; then
187     elogcmd="einfo"
188     else
189     elogcmd="elog"
190     fi
191 ferdy 1.1
192 scarabeus 1.17 # If we have same branch and the tree we can do --depth 1 clone
193     # which outputs into really smaller data transfers.
194 scarabeus 1.21 # Sadly we can do shallow copy for now because quite a few packages need .git
195 scarabeus 1.17 # folder.
196 scarabeus 1.32 #[[ ${EGIT_COMMIT} = ${EGIT_BRANCH} ]] && \
197 scarabeus 1.17 # EGIT_FETCH_CMD="${EGIT_FETCH_CMD} --depth 1"
198 scarabeus 1.32 if [[ ! -z ${EGIT_TREE} ]] ; then
199     EGIT_COMMIT=${EGIT_TREE}
200 scarabeus 1.37 ewarn "QA: Usage of deprecated EGIT_TREE variable detected."
201     ewarn "QA: Use EGIT_COMMIT variable instead."
202 scarabeus 1.32 fi
203 ferdy 1.1
204     # EGIT_REPO_URI is empty.
205     [[ -z ${EGIT_REPO_URI} ]] && die "${EGIT}: EGIT_REPO_URI is empty."
206    
207 ferdy 1.4 # check for the protocol or pull from a local repo.
208     if [[ -z ${EGIT_REPO_URI%%:*} ]] ; then
209     case ${EGIT_REPO_URI%%:*} in
210 scarabeus 1.17 git*|http|https|rsync|ssh) ;;
211     *) die "${EGIT}: protocol for fetch from "${EGIT_REPO_URI%:*}" is not yet implemented in eclass." ;;
212 ferdy 1.4 esac
213     fi
214 ferdy 1.1
215 scarabeus 1.17 # initial clone, we have to create master git storage directory and play
216     # nicely with sandbox
217 ferdy 1.1 if [[ ! -d ${EGIT_STORE_DIR} ]] ; then
218     debug-print "${FUNCNAME}: initial clone. creating git directory"
219     addwrite /
220     mkdir -p "${EGIT_STORE_DIR}" \
221     || die "${EGIT}: can't mkdir ${EGIT_STORE_DIR}."
222     export SANDBOX_WRITE="${SANDBOX_WRITE%%:/}"
223     fi
224    
225     cd -P "${EGIT_STORE_DIR}" || die "${EGIT}: can't chdir to ${EGIT_STORE_DIR}"
226     EGIT_STORE_DIR=${PWD}
227    
228 scarabeus 1.17 # allow writing into EGIT_STORE_DIR
229 ferdy 1.1 addwrite "${EGIT_STORE_DIR}"
230    
231     [[ -z ${EGIT_REPO_URI##*/} ]] && EGIT_REPO_URI="${EGIT_REPO_URI%/}"
232     EGIT_CLONE_DIR="${EGIT_PROJECT}"
233    
234     debug-print "${FUNCNAME}: EGIT_OPTIONS = \"${EGIT_OPTIONS}\""
235    
236 scarabeus 1.32 GIT_DIR="${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}"
237 scarabeus 1.21 # we also have to remove all shallow copied repositories
238     # and fetch them again
239 scarabeus 1.32 if [[ -e "${GIT_DIR}/shallow" ]]; then
240     rm -rf "${GIT_DIR}"
241 scarabeus 1.21 einfo "The ${EGIT_CLONE_DIR} was shallow copy. Refetching."
242     fi
243 scarabeus 1.32 # repack from bare copy to normal one
244     if [[ -d ${GIT_DIR} && ! -d "${GIT_DIR}/.git/" ]]; then
245     rm -rf "${GIT_DIR}"
246     einfo "The ${EGIT_CLONE_DIR} was bare copy. Refetching."
247     fi
248 scarabeus 1.21
249 scarabeus 1.32 if [[ ! -d ${GIT_DIR} ]] ; then
250 ferdy 1.1 # first clone
251 scarabeus 1.17 ${elogcmd} "GIT NEW clone -->"
252     ${elogcmd} " repository: ${EGIT_REPO_URI}"
253 ferdy 1.1
254 scarabeus 1.32 debug-print "${EGIT_FETCH_CMD} ${EGIT_OPTIONS} \"${EGIT_REPO_URI}\" ${GIT_DIR}"
255     ${EGIT_FETCH_CMD} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${GIT_DIR} \
256 ferdy 1.1 || die "${EGIT}: can't fetch from ${EGIT_REPO_URI}."
257 scarabeus 1.32
258     pushd "${GIT_DIR}" &> /dev/null
259     cursha1=$(git rev-parse origin/${EGIT_BRANCH})
260     ${elogcmd} " at the commit: ${cursha1}"
261 ferdy 1.1
262 scarabeus 1.37 git_submodules
263 scarabeus 1.32 popd &> /dev/null
264 robbat2 1.9 elif [[ -n ${EGIT_OFFLINE} ]] ; then
265 scarabeus 1.32 pushd "${GIT_DIR}" &> /dev/null
266     cursha1=$(git rev-parse origin/${EGIT_BRANCH})
267 scarabeus 1.17 ${elogcmd} "GIT offline update -->"
268     ${elogcmd} " repository: ${EGIT_REPO_URI}"
269 scarabeus 1.26 ${elogcmd} " at the commit: ${cursha1}"
270 scarabeus 1.32 popd &> /dev/null
271 ferdy 1.1 else
272 scarabeus 1.32 pushd "${GIT_DIR}" &> /dev/null
273 ferdy 1.7 # Git urls might change, so unconditionally set it here
274     git config remote.origin.url "${EGIT_REPO_URI}"
275    
276 ferdy 1.1 # fetch updates
277 scarabeus 1.17 ${elogcmd} "GIT update -->"
278     ${elogcmd} " repository: ${EGIT_REPO_URI}"
279 scarabeus 1.32
280     oldsha1=$(git rev-parse origin/${EGIT_BRANCH})
281 ferdy 1.1
282 scarabeus 1.32 debug-print "${EGIT_UPDATE_CMD} ${EGIT_OPTIONS}"
283 scarabeus 1.37 # fix branching
284 scarabeus 1.38 git checkout ${EGIT_MASTER}
285 scarabeus 1.39 for x in $(git branch |grep -v "* ${EGIT_MASTER}" |tr '\n' ' '); do
286 scarabeus 1.37 git branch -D ${x}
287     done
288 scarabeus 1.32 ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} \
289 ferdy 1.1 || die "${EGIT}: can't update from ${EGIT_REPO_URI}."
290    
291 scarabeus 1.37 git_submodules
292 scarabeus 1.32 cursha1=$(git rev-parse origin/${EGIT_BRANCH})
293 scarabeus 1.17
294     # write out message based on the revisions
295     if [[ ${oldsha1} != ${cursha1} ]]; then
296     ${elogcmd} " updating from commit: ${oldsha1}"
297     ${elogcmd} " to commit: ${cursha1}"
298     else
299     ${elogcmd} " at the commit: ${cursha1}"
300 scarabeus 1.28 # @ECLASS_VARIABLE: LIVE_FAIL_FETCH_IF_REPO_NOT_UPDATED
301     # @DESCRIPTION:
302     # If this variable is set to TRUE in make.conf or somewhere in
303     # enviroment the package will fail if there is no update, thus in
304     # combination with --keep-going it would lead in not-updating
305     # pakcages that are up-to-date.
306     # TODO: this can lead to issues if more projects/packages use same repo
307     [[ ${LIVE_FAIL_FETCH_IF_REPO_NOT_UPDATED} = true ]] && \
308     debug-print "${FUNCNAME}: Repository \"${EGIT_REPO_URI}\" is up-to-date. Skipping." && \
309     die "${EGIT}: Repository \"${EGIT_REPO_URI}\" is up-to-date. Skipping."
310 scarabeus 1.17 fi
311 scarabeus 1.32 ${EGIT_DIFFSTAT_CMD} ${oldsha1}..origin/${EGIT_BRANCH}
312     popd &> /dev/null
313 ferdy 1.1 fi
314 scarabeus 1.32
315     pushd "${GIT_DIR}" &> /dev/null
316 ferdy 1.6 if ${EGIT_REPACK} || ${EGIT_PRUNE} ; then
317     ebegin "Garbage collecting the repository"
318     git gc $(${EGIT_PRUNE} && echo '--prune')
319 ferdy 1.1 eend $?
320     fi
321 scarabeus 1.32 popd &> /dev/null
322 maekke 1.30
323 scarabeus 1.26 # export the git version
324     export EGIT_VERSION="${cursha1}"
325 ferdy 1.1
326 scarabeus 1.37 # log the repo state
327 scarabeus 1.32 [[ ${EGIT_COMMIT} != ${EGIT_BRANCH} ]] && elog " commit: ${EGIT_COMMIT}"
328 scarabeus 1.17 ${elogcmd} " branch: ${EGIT_BRANCH}"
329 scarabeus 1.34 ${elogcmd} " storage directory: \"${GIT_DIR}\""
330    
331 scarabeus 1.37 pushd "${GIT_DIR}" &> /dev/null
332     debug-print "rsync -rlpgo . \"${S}\""
333     time rsync -rlpgo . "${S}"
334     popd &> /dev/null
335    
336     pushd "${S}" &> /dev/null
337     git_branch
338     # submodules always reqire net (thanks to branches changing)
339     [[ -n ${EGIT_OFFLINE} ]] || git_submodules
340 scarabeus 1.34 popd &> /dev/null
341 vapier 1.5
342     echo ">>> Unpacked to ${S}"
343 ferdy 1.1 }
344    
345 scarabeus 1.17 # @FUNCTION: git_bootstrap
346     # @DESCRIPTION:
347     # Runs bootstrap command if EGIT_BOOTSTRAP variable contains some value
348     # Remember that what ever gets to the EGIT_BOOTSTRAP variable gets evaled by bash.
349 ferdy 1.1 git_bootstrap() {
350 scarabeus 1.17 debug-print-function ${FUNCNAME} "$@"
351 ferdy 1.1
352 scarabeus 1.17 if [[ -n ${EGIT_BOOTSTRAP} ]] ; then
353     pushd "${S}" > /dev/null
354     einfo "Starting bootstrap"
355 ferdy 1.1
356 scarabeus 1.17 if [[ -f ${EGIT_BOOTSTRAP} ]]; then
357     # we have file in the repo which we should execute
358     debug-print "$FUNCNAME: bootstraping with file \"${EGIT_BOOTSTRAP}\""
359    
360     if [[ -x ${EGIT_BOOTSTRAP} ]]; then
361     eval "./${EGIT_BOOTSTRAP}" \
362     || die "${EGIT}: bootstrap script failed"
363 ferdy 1.1 else
364 scarabeus 1.17 eerror "\"${EGIT_BOOTSTRAP}\" is not executable."
365     eerror "Report upstream, or bug ebuild maintainer to remove bootstrap command."
366     die "${EGIT}: \"${EGIT_BOOTSTRAP}\" is not executable."
367 ferdy 1.1 fi
368 scarabeus 1.17 else
369     # we execute some system command
370     debug-print "$FUNCNAME: bootstraping with commands \"${EGIT_BOOTSTRAP}\""
371 ferdy 1.1
372 scarabeus 1.17 eval "${EGIT_BOOTSTRAP}" \
373     || die "${EGIT}: bootstrap commands failed."
374 ferdy 1.1
375     fi
376 scarabeus 1.17
377     einfo "Bootstrap finished"
378     popd > /dev/null
379 ferdy 1.1 fi
380 scarabeus 1.17 }
381 ferdy 1.1
382 scarabeus 1.17 # @FUNCTION: git_apply_patches
383     # @DESCRIPTION:
384     # Apply patches from EGIT_PATCHES bash array.
385     # Preffered is using the variable as bash array but for now it allows to write
386     # it also as normal space separated string list. (This part of code should be
387     # removed when all ebuilds get converted on bash array).
388     git_apply_patches() {
389     debug-print-function ${FUNCNAME} "$@"
390    
391     pushd "${S}" > /dev/null
392     if [[ ${#EGIT_PATCHES[@]} -gt 1 ]] ; then
393     for i in "${EGIT_PATCHES[@]}"; do
394     debug-print "$FUNCNAME: git_autopatch: patching from ${i}"
395     epatch "${i}"
396     done
397     elif [[ ${EGIT_PATCHES} != "" ]]; then
398     # no need for loop if space separated string is passed.
399     debug-print "$FUNCNAME: git_autopatch: patching from ${EGIT_PATCHES}"
400     epatch "${EGIT_PATCHES}"
401     fi
402    
403     popd > /dev/null
404 ferdy 1.1 }
405    
406 scarabeus 1.17 # @FUNCTION: git_src_unpack
407     # @DESCRIPTION:
408     # src_upack function, calls src_prepare one if EAPI!=2.
409     git_src_unpack() {
410     debug-print-function ${FUNCNAME} "$@"
411 ferdy 1.1
412 scarabeus 1.17 git_fetch || die "${EGIT}: unknown problem in git_fetch()."
413 ferdy 1.1
414 scarabeus 1.17 has src_prepare ${EXPORTED_FUNCTIONS} || git_src_prepare
415     }
416 ferdy 1.1
417 scarabeus 1.17 # @FUNCTION: git_src_prepare
418     # @DESCRIPTION:
419     # src_prepare function for git stuff. Patches, bootstrap...
420     git_src_prepare() {
421     debug-print-function ${FUNCNAME} "$@"
422 maekke 1.30
423 scarabeus 1.17 git_apply_patches
424     git_bootstrap
425 ferdy 1.1 }

  ViewVC Help
Powered by ViewVC 1.1.20