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

Contents of /eclass/git.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.25 - (hide annotations) (download)
Tue Apr 14 21:46:45 2009 UTC (5 years, 6 months ago) by scarabeus
Branch: MAIN
Changes since 1.24: +2 -2 lines
Remove sliped inherit base from the previous fixing breakage :[

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.25 # $Header: /var/cvsroot/gentoo-x86/eclass/git.eclass,v 1.24 2009/04/13 15:35:58 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 ferdy 1.1 EGIT_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/git-src"
45    
46 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_FETCH_CMD
47     # @DESCRIPTION:
48     # Command for cloning the repository.
49 scarabeus 1.21 : ${EGIT_FETCH_CMD:="git clone --bare"}
50 ferdy 1.1
51 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_UPDATE_CMD
52     # @DESCRIPTION:
53     # Git fetch command.
54 ferdy 1.1 EGIT_UPDATE_CMD="git fetch -f -u"
55    
56 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_DIFFSTAT_CMD
57     # @DESCRIPTION:
58     # Git command for diffstat.
59 robbat2 1.18 EGIT_DIFFSTAT_CMD="git --no-pager diff --stat"
60 ferdy 1.1
61 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_OPTIONS
62     # @DESCRIPTION:
63     # This variable value is passed to clone and fetch.
64 ferdy 1.1 : ${EGIT_OPTIONS:=}
65    
66 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_REPO_URI
67     # @DESCRIPTION:
68     # URI for the repository
69 ferdy 1.1 # e.g. http://foo, git://bar
70 scarabeus 1.17 # Supported protocols:
71 ferdy 1.1 # http://
72     # https://
73     # git://
74     # git+ssh://
75     # rsync://
76     # ssh://
77     : ${EGIT_REPO_URI:=}
78    
79 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_PROJECT
80     # @DESCRIPTION:
81     # Project name of your ebuild.
82     # Git eclass will check out the git repository like:
83     # ${EGIT_STORE_DIR}/${EGIT_PROJECT}/${EGIT_REPO_URI##*/}
84 ferdy 1.1 # so if you define EGIT_REPO_URI as http://git.collab.net/repo/git or
85     # http://git.collab.net/repo/git. and PN is subversion-git.
86     # it will check out like:
87 scarabeus 1.17 # ${EGIT_STORE_DIR}/subversion
88 ferdy 1.1 : ${EGIT_PROJECT:=${PN/-git}}
89    
90 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_BOOSTRAP
91     # @DESCRIPTION:
92     # bootstrap script or command like autogen.sh or etc...
93 ferdy 1.1 : ${EGIT_BOOTSTRAP:=}
94    
95 robbat2 1.9 # @ECLASS-VARIABLE: EGIT_OFFLINE
96     # @DESCRIPTION:
97     # Set this variable to a non-empty value to disable the automatic updating of
98 robbat2 1.10 # an GIT source tree. This is intended to be set outside the git source
99 robbat2 1.9 # tree by users.
100     EGIT_OFFLINE="${EGIT_OFFLINE:-${ESCM_OFFLINE}}"
101 ferdy 1.1
102 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_PATCHES
103     # @DESCRIPTION:
104     # Similar to PATCHES array from base.eclass
105     # Only difference is that this patches are applied before bootstrap.
106     # Please take note that this variable should be bash array.
107 ferdy 1.1
108 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_BRANCH
109     # @DESCRIPTION:
110 ferdy 1.1 # git eclass can fetch any branch in git_fetch().
111     : ${EGIT_BRANCH:=master}
112    
113 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_TREE
114     # @DESCRIPTION:
115 scarabeus 1.23 # git eclass can checkout any tree (commit).
116 ferdy 1.1 : ${EGIT_TREE:=${EGIT_BRANCH}}
117    
118 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_REPACK
119     # @DESCRIPTION:
120 ferdy 1.1 # git eclass will repack objects to save disk space. However this can take a
121 scarabeus 1.17 # long time with VERY big repositories.
122 ferdy 1.1 : ${EGIT_REPACK:=false}
123    
124 scarabeus 1.17 # @ECLASS-VARIABLE: EGIT_PRUNE
125     # @DESCRIPTION:
126     # git.eclass can prune the local clone. This is useful if upstream rewinds and
127     # rebases branches too often.
128 ferdy 1.1 : ${EGIT_PRUNE:=false}
129    
130 scarabeus 1.17 # @FUNCTION: git_fetch
131     # @DESCRIPTION:
132     # Gets repository from EGIT_REPO_URI and store it in specified EGIT_STORE_DIR
133     git_fetch() {
134     debug-print-function ${FUNCNAME} "$@"
135 ferdy 1.1
136 scarabeus 1.17 local EGIT_CLONE_DIR oldsha1 cursha1
137 ferdy 1.1
138 scarabeus 1.17 # choose if user wants elog or just einfo.
139     if [[ ${EGIT_QUIET} != OFF ]]; then
140     elogcmd="einfo"
141     else
142     elogcmd="elog"
143     fi
144 ferdy 1.1
145 scarabeus 1.17 # If we have same branch and the tree we can do --depth 1 clone
146     # which outputs into really smaller data transfers.
147 scarabeus 1.21 # Sadly we can do shallow copy for now because quite a few packages need .git
148 scarabeus 1.17 # folder.
149     #[[ ${EGIT_TREE} = ${EGIT_BRANCH} ]] && \
150     # EGIT_FETCH_CMD="${EGIT_FETCH_CMD} --depth 1"
151 ferdy 1.1
152     # EGIT_REPO_URI is empty.
153     [[ -z ${EGIT_REPO_URI} ]] && die "${EGIT}: EGIT_REPO_URI is empty."
154    
155 ferdy 1.4 # check for the protocol or pull from a local repo.
156     if [[ -z ${EGIT_REPO_URI%%:*} ]] ; then
157     case ${EGIT_REPO_URI%%:*} in
158 scarabeus 1.17 git*|http|https|rsync|ssh) ;;
159     *) die "${EGIT}: protocol for fetch from "${EGIT_REPO_URI%:*}" is not yet implemented in eclass." ;;
160 ferdy 1.4 esac
161     fi
162 ferdy 1.1
163 scarabeus 1.17 # initial clone, we have to create master git storage directory and play
164     # nicely with sandbox
165 ferdy 1.1 if [[ ! -d ${EGIT_STORE_DIR} ]] ; then
166     debug-print "${FUNCNAME}: initial clone. creating git directory"
167     addwrite /
168     mkdir -p "${EGIT_STORE_DIR}" \
169     || die "${EGIT}: can't mkdir ${EGIT_STORE_DIR}."
170     export SANDBOX_WRITE="${SANDBOX_WRITE%%:/}"
171     fi
172    
173     cd -P "${EGIT_STORE_DIR}" || die "${EGIT}: can't chdir to ${EGIT_STORE_DIR}"
174     EGIT_STORE_DIR=${PWD}
175    
176 scarabeus 1.17 # allow writing into EGIT_STORE_DIR
177 ferdy 1.1 addwrite "${EGIT_STORE_DIR}"
178    
179     [[ -z ${EGIT_REPO_URI##*/} ]] && EGIT_REPO_URI="${EGIT_REPO_URI%/}"
180     EGIT_CLONE_DIR="${EGIT_PROJECT}"
181    
182     debug-print "${FUNCNAME}: EGIT_OPTIONS = \"${EGIT_OPTIONS}\""
183    
184 zlin 1.12 export GIT_DIR="${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}"
185 ferdy 1.1
186 scarabeus 1.21 # we also have to remove all shallow copied repositories
187     # and fetch them again
188     if [[ -e "${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}/shallow" ]]; then
189     rm -rf "${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}"
190     einfo "The ${EGIT_CLONE_DIR} was shallow copy. Refetching."
191     fi
192    
193 ferdy 1.1 if [[ ! -d ${EGIT_CLONE_DIR} ]] ; then
194     # first clone
195 scarabeus 1.17 ${elogcmd} "GIT NEW clone -->"
196     ${elogcmd} " repository: ${EGIT_REPO_URI}"
197 ferdy 1.1
198 scarabeus 1.17 ${EGIT_FETCH_CMD} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${EGIT_PROJECT} \
199 ferdy 1.1 || die "${EGIT}: can't fetch from ${EGIT_REPO_URI}."
200    
201 scarabeus 1.17 oldsha1=$(git rev-parse ${EGIT_BRANCH})
202     ${elogcmd} " at the commit: ${oldsha1}"
203    
204 ferdy 1.1 # We use --bare cloning, so git doesn't do this for us.
205 ferdy 1.7 git config remote.origin.url "${EGIT_REPO_URI}"
206 robbat2 1.9 elif [[ -n ${EGIT_OFFLINE} ]] ; then
207 scarabeus 1.17 oldsha1=$(git rev-parse ${EGIT_BRANCH})
208     ${elogcmd} "GIT offline update -->"
209     ${elogcmd} " repository: ${EGIT_REPO_URI}"
210     ${elogcmd} " at the commit: ${oldsha1}"
211 ferdy 1.1 else
212 ferdy 1.7 # Git urls might change, so unconditionally set it here
213     git config remote.origin.url "${EGIT_REPO_URI}"
214    
215 ferdy 1.1 # fetch updates
216 scarabeus 1.17 ${elogcmd} "GIT update -->"
217     ${elogcmd} " repository: ${EGIT_REPO_URI}"
218 ferdy 1.1
219 scarabeus 1.17 oldsha1=$(git rev-parse ${EGIT_BRANCH})
220 ferdy 1.1
221     ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} \
222     || die "${EGIT}: can't update from ${EGIT_REPO_URI}."
223    
224 scarabeus 1.17 cursha1=$(git rev-parse ${EGIT_BRANCH})
225    
226     # write out message based on the revisions
227     if [[ ${oldsha1} != ${cursha1} ]]; then
228     ${elogcmd} " updating from commit: ${oldsha1}"
229     ${elogcmd} " to commit: ${cursha1}"
230     else
231     ${elogcmd} " at the commit: ${cursha1}"
232     fi
233 robbat2 1.18 ${EGIT_DIFFSTAT_CMD} ${oldsha1}..${EGIT_BRANCH}
234 ferdy 1.1 fi
235    
236 ferdy 1.6 if ${EGIT_REPACK} || ${EGIT_PRUNE} ; then
237     ebegin "Garbage collecting the repository"
238     git gc $(${EGIT_PRUNE} && echo '--prune')
239 ferdy 1.1 eend $?
240     fi
241    
242 scarabeus 1.17 [[ ${EGIT_TREE} != ${EGIT_BRANCH} ]] && elog " tree: ${EGIT_TREE}"
243     ${elogcmd} " branch: ${EGIT_BRANCH}"
244     ${elogcmd} " storage directory: \"${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}\""
245 ferdy 1.1
246 scarabeus 1.23 # unpack to the ${S}
247     unset GIT_DIR
248     debug-print "git clone -l -s -n \"${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}\" \"${S}\""
249     git clone -l -s -n "${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}" "${S}"
250    
251     # set correct branch and the tree ebuild specified
252 scarabeus 1.17 pushd "${S}" > /dev/null
253 scarabeus 1.23 local branchname=branch-${EGIT_BRANCH} src=origin/${EGIT_BRANCH}
254     if [[ ${EGIT_TREE} != ${EGIT_BRANCH} ]]; then
255     branchname=tree-${EGIT_TREE}
256     src=${EGIT_TREE}
257     fi
258     debug-print "git checkout -b ${branchname} ${src}"
259     git checkout -b ${branchname} ${src} 2>&1 > /dev/null
260 scarabeus 1.17 popd > /dev/null
261    
262 scarabeus 1.23 unset branchname src
263 vapier 1.5
264     echo ">>> Unpacked to ${S}"
265 ferdy 1.1 }
266    
267 scarabeus 1.17 # @FUNCTION: git_bootstrap
268     # @DESCRIPTION:
269     # Runs bootstrap command if EGIT_BOOTSTRAP variable contains some value
270     # Remember that what ever gets to the EGIT_BOOTSTRAP variable gets evaled by bash.
271 ferdy 1.1 git_bootstrap() {
272 scarabeus 1.17 debug-print-function ${FUNCNAME} "$@"
273 ferdy 1.1
274 scarabeus 1.17 if [[ -n ${EGIT_BOOTSTRAP} ]] ; then
275     pushd "${S}" > /dev/null
276     einfo "Starting bootstrap"
277 ferdy 1.1
278 scarabeus 1.17 if [[ -f ${EGIT_BOOTSTRAP} ]]; then
279     # we have file in the repo which we should execute
280     debug-print "$FUNCNAME: bootstraping with file \"${EGIT_BOOTSTRAP}\""
281    
282     if [[ -x ${EGIT_BOOTSTRAP} ]]; then
283     eval "./${EGIT_BOOTSTRAP}" \
284     || die "${EGIT}: bootstrap script failed"
285 ferdy 1.1 else
286 scarabeus 1.17 eerror "\"${EGIT_BOOTSTRAP}\" is not executable."
287     eerror "Report upstream, or bug ebuild maintainer to remove bootstrap command."
288     die "${EGIT}: \"${EGIT_BOOTSTRAP}\" is not executable."
289 ferdy 1.1 fi
290 scarabeus 1.17 else
291     # we execute some system command
292     debug-print "$FUNCNAME: bootstraping with commands \"${EGIT_BOOTSTRAP}\""
293 ferdy 1.1
294 scarabeus 1.17 eval "${EGIT_BOOTSTRAP}" \
295     || die "${EGIT}: bootstrap commands failed."
296 ferdy 1.1
297     fi
298 scarabeus 1.17
299     einfo "Bootstrap finished"
300     popd > /dev/null
301 ferdy 1.1 fi
302 scarabeus 1.17 }
303 ferdy 1.1
304 scarabeus 1.17 # @FUNCTION: git_apply_patches
305     # @DESCRIPTION:
306     # Apply patches from EGIT_PATCHES bash array.
307     # Preffered is using the variable as bash array but for now it allows to write
308     # it also as normal space separated string list. (This part of code should be
309     # removed when all ebuilds get converted on bash array).
310     git_apply_patches() {
311     debug-print-function ${FUNCNAME} "$@"
312    
313     pushd "${S}" > /dev/null
314     if [[ ${#EGIT_PATCHES[@]} -gt 1 ]] ; then
315     for i in "${EGIT_PATCHES[@]}"; do
316     debug-print "$FUNCNAME: git_autopatch: patching from ${i}"
317     epatch "${i}"
318     done
319     elif [[ ${EGIT_PATCHES} != "" ]]; then
320     # no need for loop if space separated string is passed.
321     debug-print "$FUNCNAME: git_autopatch: patching from ${EGIT_PATCHES}"
322     epatch "${EGIT_PATCHES}"
323     fi
324    
325     popd > /dev/null
326 ferdy 1.1 }
327    
328 scarabeus 1.17 # @FUNCTION: git_src_unpack
329     # @DESCRIPTION:
330     # src_upack function, calls src_prepare one if EAPI!=2.
331     git_src_unpack() {
332     debug-print-function ${FUNCNAME} "$@"
333 ferdy 1.1
334 scarabeus 1.17 git_fetch || die "${EGIT}: unknown problem in git_fetch()."
335 ferdy 1.1
336 scarabeus 1.17 has src_prepare ${EXPORTED_FUNCTIONS} || git_src_prepare
337     }
338 ferdy 1.1
339 scarabeus 1.17 # @FUNCTION: git_src_prepare
340     # @DESCRIPTION:
341     # src_prepare function for git stuff. Patches, bootstrap...
342     git_src_prepare() {
343     debug-print-function ${FUNCNAME} "$@"
344 scarabeus 1.22
345 scarabeus 1.17 git_apply_patches
346     git_bootstrap
347 ferdy 1.1 }

  ViewVC Help
Powered by ViewVC 1.1.20