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

Contents of /eclass/git.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.27 - (show annotations) (download)
Thu May 14 13:52:08 2009 UTC (5 years, 4 months ago) by scarabeus
Branch: MAIN
Changes since 1.26: +3 -2 lines
Allow redefinition of git storage dir. Per jilec request on irc. I cant think of any harm from this, so commiting.

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

  ViewVC Help
Powered by ViewVC 1.1.20