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

Contents of /eclass/git.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (show annotations) (download)
Wed Mar 14 15:48:12 2007 UTC (7 years, 5 months ago) by ferdy
Branch: MAIN
Changes since 1.3: +11 -9 lines
Fix for bug #170818. Thanks to Trevor Hardcastle <chizu@osuosl.org>.

1 # Copyright 1999-2006 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.3 2006/12/30 18:21:02 ferdy Exp $
4
5 ## --------------------------------------------------------------------------- #
6 # subversion.eclass author: Akinori Hattori <hattya@gentoo.org>
7 # modified for git by Donnie Berkholz <spyderous@gentoo.org>
8 # improved by Fernando J. Pereda <ferdy@gentoo.org>
9 #
10 # The git eclass is written to fetch the software sources from
11 # git repositories like the subversion eclass.
12 #
13 #
14 # Description:
15 # If you use this eclass, the ${S} is ${WORKDIR}/${P}.
16 # It is necessary to define the EGIT_REPO_URI variable at least.
17 #
18 ## --------------------------------------------------------------------------- #
19
20 inherit eutils
21
22 EGIT="git.eclass"
23
24 EXPORT_FUNCTIONS src_unpack
25
26 HOMEPAGE="http://git.or.cz/"
27 DESCRIPTION="Based on the ${ECLASS} eclass"
28
29
30 ## -- add git in DEPEND
31 #
32 DEPEND=">=dev-util/git-1.4.0"
33
34
35 ## -- EGIT_STORE_DIR: git sources store directory
36 #
37 EGIT_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/git-src"
38
39
40 ## -- EGIT_FETCH_CMD: git clone command
41 #
42 EGIT_FETCH_CMD="git clone --bare"
43
44 ## -- EGIT_UPDATE_CMD: git fetch command
45 #
46 EGIT_UPDATE_CMD="git fetch -f -u"
47
48 ## -- EGIT_DIFFSTAT_CMD: Command to get diffstat output
49 #
50 EGIT_DIFFSTAT_CMD="git diff --stat"
51
52
53 ## -- EGIT_OPTIONS:
54 #
55 # the options passed to clone and fetch
56 #
57 : ${EGIT_OPTIONS:=}
58
59
60 ## -- EGIT_REPO_URI: repository uri
61 #
62 # e.g. http://foo, git://bar
63 #
64 # supported protocols:
65 # http://
66 # https://
67 # git://
68 # git+ssh://
69 # rsync://
70 # ssh://
71 #
72 : ${EGIT_REPO_URI:=}
73
74
75 ## -- EGIT_PROJECT: project name of your ebuild
76 #
77 # git eclass will check out the git repository like:
78 #
79 # ${EGIT_STORE_DIR}/${EGIT_PROJECT}/${EGIT_REPO_URI##*/}
80 #
81 # so if you define EGIT_REPO_URI as http://git.collab.net/repo/git or
82 # http://git.collab.net/repo/git. and PN is subversion-git.
83 # it will check out like:
84 #
85 # ${EGIT_STORE_DIR}/subversion
86 #
87 # default: ${PN/-git}.
88 #
89 : ${EGIT_PROJECT:=${PN/-git}}
90
91
92 ## -- EGIT_BOOTSTRAP:
93 #
94 # bootstrap script or command like autogen.sh or etc..
95 #
96 : ${EGIT_BOOTSTRAP:=}
97
98
99 ## -- EGIT_PATCHES:
100 #
101 # git eclass can apply pathces in git_bootstrap().
102 # you can use regexp in this valiable like *.diff or *.patch or etc.
103 # NOTE: this patches will apply before eval EGIT_BOOTSTRAP.
104 #
105 # the process of applying the patch is:
106 # 1. just epatch it, if the patch exists in the path.
107 # 2. scan it under FILESDIR and epatch it, if the patch exists in FILESDIR.
108 # 3. die.
109 #
110 : ${EGIT_PATCHES:=}
111
112
113 ## -- EGIT_BRANCH:
114 #
115 # git eclass can fetch any branch in git_fetch().
116 # Defaults to 'master'
117 #
118 : ${EGIT_BRANCH:=master}
119
120
121 ## -- EGIT_TREE:
122 #
123 # git eclass can checkout any tree.
124 # Defaults to EGIT_BRANCH.
125 #
126 : ${EGIT_TREE:=${EGIT_BRANCH}}
127
128
129 ## - EGIT_REPACK:
130 #
131 # git eclass will repack objects to save disk space. However this can take a
132 # long time with VERY big repositories. If this is your case set:
133 # EGIT_REPACK=false
134 #
135 : ${EGIT_REPACK:=false}
136
137 ## - EGIT_PRUNE:
138 #
139 # git eclass can prune the local clone. This is useful if upstream rewinds and
140 # rebases branches too often. If you don't want this to happen, set:
141 # EGIT_PRUNE=false
142 #
143 : ${EGIT_PRUNE:=false}
144
145
146 ## -- git_fetch() ------------------------------------------------- #
147
148 git_fetch() {
149
150 local EGIT_CLONE_DIR
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 ;;
160 *)
161 die "${EGIT}: fetch from "${EGIT_REPO_URI%:*}" is not yet implemented."
162 ;;
163 esac
164 fi
165
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 chmod -f o+rw "${EGIT_STORE_DIR}" \
172 || die "${EGIT}: can't chmod ${EGIT_STORE_DIR}."
173 export SANDBOX_WRITE="${SANDBOX_WRITE%%:/}"
174 fi
175
176 cd -P "${EGIT_STORE_DIR}" || die "${EGIT}: can't chdir to ${EGIT_STORE_DIR}"
177 EGIT_STORE_DIR=${PWD}
178
179 # every time
180 addwrite "${EGIT_STORE_DIR}"
181
182 [[ -z ${EGIT_REPO_URI##*/} ]] && EGIT_REPO_URI="${EGIT_REPO_URI%/}"
183 EGIT_CLONE_DIR="${EGIT_PROJECT}"
184
185 debug-print "${FUNCNAME}: EGIT_OPTIONS = \"${EGIT_OPTIONS}\""
186
187 export GIT_DIR="${EGIT_CLONE_DIR}"
188
189 if [[ ! -d ${EGIT_CLONE_DIR} ]] ; then
190 # first clone
191 einfo "git clone start -->"
192 einfo " repository: ${EGIT_REPO_URI}"
193
194 ${EGIT_FETCH_CMD} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${EGIT_PROJECT} \
195 || die "${EGIT}: can't fetch from ${EGIT_REPO_URI}."
196
197 # We use --bare cloning, so git doesn't do this for us.
198 git repo-config remote.origin.url "${EGIT_REPO_URI}"
199 else
200 # fetch updates
201 einfo "git update start -->"
202 einfo " repository: ${EGIT_REPO_URI}"
203
204 local oldsha1=$(git rev-parse ${EGIT_BRANCH})
205
206 ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} \
207 || die "${EGIT}: can't update from ${EGIT_REPO_URI}."
208
209 # piping through cat is needed to avoid a stupid Git feature
210 ${EGIT_DIFFSTAT_CMD} ${oldsha1}..${EGIT_BRANCH} | cat
211 fi
212
213 einfo " local clone: ${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}"
214
215 if ${EGIT_REPACK} ; then
216 ebegin "Repacking objects"
217 # Strangely enough mv asks confirmation
218 yes y | git repack -a -d -f -q > /dev/null
219 eend $?
220 fi
221
222 if ${EGIT_PRUNE} ; then
223 ebegin "Removing unreachable objects"
224 git prune
225 eend $?
226 fi
227
228 einfo " committish: ${EGIT_TREE}"
229
230 # export to the ${WORKDIR}
231 mkdir -p "${S}"
232 git tar-tree ${EGIT_TREE} | ( cd "${S}" ; tar xf - )
233 echo
234
235 }
236
237
238 ## -- git_bootstrap() ------------------------------------------------ #
239
240 git_bootstrap() {
241
242 local patch lpatch
243
244 cd "${S}"
245
246 if [[ -n ${EGIT_PATCHES} ]] ; then
247 einfo "apply patches -->"
248
249 for patch in ${EGIT_PATCHES} ; do
250 if [[ -f ${patch} ]] ; then
251 epatch ${patch}
252 else
253 for lpatch in "${FILESDIR}"/${patch} ; do
254 if [[ -f ${lpatch} ]] ; then
255 epatch ${lpatch}
256 else
257 die "${EGIT}: ${patch} is not found"
258 fi
259 done
260 fi
261 done
262 echo
263 fi
264
265 if [[ -n ${EGIT_BOOTSTRAP} ]] ; then
266 einfo "begin bootstrap -->"
267
268 if [[ -f ${EGIT_BOOTSTRAP} ]] && [[ -x ${EGIT_BOOTSTRAP} ]] ; then
269 einfo " bootstrap with a file: ${EGIT_BOOTSTRAP}"
270 eval "./${EGIT_BOOTSTRAP}" \
271 || die "${EGIT}: can't execute EGIT_BOOTSTRAP."
272 else
273 einfo " bootstrap with commands: ${EGIT_BOOTSTRAP}"
274 eval "${EGIT_BOOTSTRAP}" \
275 || die "${EGIT}: can't eval EGIT_BOOTSTRAP."
276 fi
277 fi
278
279 }
280
281
282 ## -- git_src_unpack() ------------------------------------------------ #
283
284 git_src_unpack() {
285
286 git_fetch || die "${EGIT}: unknown problem in git_fetch()."
287 git_bootstrap || die "${EGIT}: unknown problem in git_bootstrap()."
288
289 }

  ViewVC Help
Powered by ViewVC 1.1.20