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

Contents of /eclass/git.eclass

Parent Directory Parent Directory | Revision Log Revision Log


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

1 # Copyright 1999-2009 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/git.eclass,v 1.24 2009/04/13 15:35:58 scarabeus Exp $
4
5 # @ECLASS: git.eclass
6 # @MAINTAINER:
7 # Tomas Chvatal <scarabeus@gentoo.org>
8 # Donnie Berkholz <dberkholz@gentoo.org>
9 # @BLURB: This eclass provides functions for fetch and unpack git repositories
10 # @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
17 inherit eutils
18
19 EGIT="git.eclass"
20
21 EXPORTED_FUNCTIONS="src_unpack"
22 case "${EAPI:-0}" in
23 2) EXPORTED_FUNCTIONS="${EXPORTED_FUNCTIONS} src_prepare" ;;
24 0|1) ;;
25 *) die "Unknown EAPI, Bug eclass maintainers." ;;
26 esac
27 EXPORT_FUNCTIONS ${EXPORTED_FUNCTIONS}
28
29 # define some nice defaults but only if nothing is set already
30 : ${HOMEPAGE:=http://git-scm.com/}
31
32 # We DEPEND on at least a bit recent git version
33 DEPEND=">=dev-util/git-1.6"
34
35 # @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
41 # @ECLASS-VARIABLE: EGIT_STORE_DIR
42 # @DESCRIPTION:
43 # Storage directory for git sources.
44 EGIT_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/git-src"
45
46 # @ECLASS-VARIABLE: EGIT_FETCH_CMD
47 # @DESCRIPTION:
48 # Command for cloning the repository.
49 : ${EGIT_FETCH_CMD:="git clone --bare"}
50
51 # @ECLASS-VARIABLE: EGIT_UPDATE_CMD
52 # @DESCRIPTION:
53 # Git fetch command.
54 EGIT_UPDATE_CMD="git fetch -f -u"
55
56 # @ECLASS-VARIABLE: EGIT_DIFFSTAT_CMD
57 # @DESCRIPTION:
58 # Git command for diffstat.
59 EGIT_DIFFSTAT_CMD="git --no-pager diff --stat"
60
61 # @ECLASS-VARIABLE: EGIT_OPTIONS
62 # @DESCRIPTION:
63 # This variable value is passed to clone and fetch.
64 : ${EGIT_OPTIONS:=}
65
66 # @ECLASS-VARIABLE: EGIT_REPO_URI
67 # @DESCRIPTION:
68 # URI for the repository
69 # e.g. http://foo, git://bar
70 # Supported protocols:
71 # http://
72 # https://
73 # git://
74 # git+ssh://
75 # rsync://
76 # ssh://
77 : ${EGIT_REPO_URI:=}
78
79 # @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 # 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 # ${EGIT_STORE_DIR}/subversion
88 : ${EGIT_PROJECT:=${PN/-git}}
89
90 # @ECLASS-VARIABLE: EGIT_BOOSTRAP
91 # @DESCRIPTION:
92 # bootstrap script or command like autogen.sh or etc...
93 : ${EGIT_BOOTSTRAP:=}
94
95 # @ECLASS-VARIABLE: EGIT_OFFLINE
96 # @DESCRIPTION:
97 # Set this variable to a non-empty value to disable the automatic updating of
98 # an GIT source tree. This is intended to be set outside the git source
99 # tree by users.
100 EGIT_OFFLINE="${EGIT_OFFLINE:-${ESCM_OFFLINE}}"
101
102 # @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
108 # @ECLASS-VARIABLE: EGIT_BRANCH
109 # @DESCRIPTION:
110 # git eclass can fetch any branch in git_fetch().
111 : ${EGIT_BRANCH:=master}
112
113 # @ECLASS-VARIABLE: EGIT_TREE
114 # @DESCRIPTION:
115 # git eclass can checkout any tree (commit).
116 : ${EGIT_TREE:=${EGIT_BRANCH}}
117
118 # @ECLASS-VARIABLE: EGIT_REPACK
119 # @DESCRIPTION:
120 # git eclass will repack objects to save disk space. However this can take a
121 # long time with VERY big repositories.
122 : ${EGIT_REPACK:=false}
123
124 # @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 : ${EGIT_PRUNE:=false}
129
130 # @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
136 local EGIT_CLONE_DIR oldsha1 cursha1
137
138 # 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
145 # If we have same branch and the tree we can do --depth 1 clone
146 # which outputs into really smaller data transfers.
147 # Sadly we can do shallow copy for now because quite a few packages need .git
148 # folder.
149 #[[ ${EGIT_TREE} = ${EGIT_BRANCH} ]] && \
150 # EGIT_FETCH_CMD="${EGIT_FETCH_CMD} --depth 1"
151
152 # EGIT_REPO_URI is empty.
153 [[ -z ${EGIT_REPO_URI} ]] && die "${EGIT}: EGIT_REPO_URI is empty."
154
155 # check for the protocol or pull from a local repo.
156 if [[ -z ${EGIT_REPO_URI%%:*} ]] ; then
157 case ${EGIT_REPO_URI%%:*} in
158 git*|http|https|rsync|ssh) ;;
159 *) die "${EGIT}: protocol for fetch from "${EGIT_REPO_URI%:*}" is not yet implemented in eclass." ;;
160 esac
161 fi
162
163 # initial clone, we have to create master git storage directory and play
164 # nicely with sandbox
165 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 # allow writing into EGIT_STORE_DIR
177 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 export GIT_DIR="${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}"
185
186 # 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 if [[ ! -d ${EGIT_CLONE_DIR} ]] ; then
194 # first clone
195 ${elogcmd} "GIT NEW clone -->"
196 ${elogcmd} " repository: ${EGIT_REPO_URI}"
197
198 ${EGIT_FETCH_CMD} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${EGIT_PROJECT} \
199 || die "${EGIT}: can't fetch from ${EGIT_REPO_URI}."
200
201 oldsha1=$(git rev-parse ${EGIT_BRANCH})
202 ${elogcmd} " at the commit: ${oldsha1}"
203
204 # We use --bare cloning, so git doesn't do this for us.
205 git config remote.origin.url "${EGIT_REPO_URI}"
206 elif [[ -n ${EGIT_OFFLINE} ]] ; then
207 oldsha1=$(git rev-parse ${EGIT_BRANCH})
208 ${elogcmd} "GIT offline update -->"
209 ${elogcmd} " repository: ${EGIT_REPO_URI}"
210 ${elogcmd} " at the commit: ${oldsha1}"
211 else
212 # Git urls might change, so unconditionally set it here
213 git config remote.origin.url "${EGIT_REPO_URI}"
214
215 # fetch updates
216 ${elogcmd} "GIT update -->"
217 ${elogcmd} " repository: ${EGIT_REPO_URI}"
218
219 oldsha1=$(git rev-parse ${EGIT_BRANCH})
220
221 ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} \
222 || die "${EGIT}: can't update from ${EGIT_REPO_URI}."
223
224 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 ${EGIT_DIFFSTAT_CMD} ${oldsha1}..${EGIT_BRANCH}
234 fi
235
236 if ${EGIT_REPACK} || ${EGIT_PRUNE} ; then
237 ebegin "Garbage collecting the repository"
238 git gc $(${EGIT_PRUNE} && echo '--prune')
239 eend $?
240 fi
241
242 [[ ${EGIT_TREE} != ${EGIT_BRANCH} ]] && elog " tree: ${EGIT_TREE}"
243 ${elogcmd} " branch: ${EGIT_BRANCH}"
244 ${elogcmd} " storage directory: \"${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}\""
245
246 # 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 pushd "${S}" > /dev/null
253 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 popd > /dev/null
261
262 unset branchname src
263
264 echo ">>> Unpacked to ${S}"
265 }
266
267 # @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 git_bootstrap() {
272 debug-print-function ${FUNCNAME} "$@"
273
274 if [[ -n ${EGIT_BOOTSTRAP} ]] ; then
275 pushd "${S}" > /dev/null
276 einfo "Starting bootstrap"
277
278 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 else
286 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 fi
290 else
291 # we execute some system command
292 debug-print "$FUNCNAME: bootstraping with commands \"${EGIT_BOOTSTRAP}\""
293
294 eval "${EGIT_BOOTSTRAP}" \
295 || die "${EGIT}: bootstrap commands failed."
296
297 fi
298
299 einfo "Bootstrap finished"
300 popd > /dev/null
301 fi
302 }
303
304 # @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 }
327
328 # @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
334 git_fetch || die "${EGIT}: unknown problem in git_fetch()."
335
336 has src_prepare ${EXPORTED_FUNCTIONS} || git_src_prepare
337 }
338
339 # @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
345 git_apply_patches
346 git_bootstrap
347 }

  ViewVC Help
Powered by ViewVC 1.1.20