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

Contents of /eclass/git.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.8 - (show annotations) (download)
Thu Dec 27 01:02:30 2007 UTC (6 years, 6 months ago) by robbat2
Branch: MAIN
Changes since 1.7: +3 -1 lines
Add comment about usage of EGIT_BRANCH and where it should go in relation to "inherit git".

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.7 2007/11/14 20:43:43 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.5"
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 # If set, it must be before 'inherit git', otherwise both EGIT_BRANCH and
117 # EGIT_TREE must be set after 'inherit git'.
118 # Defaults to 'master'
119 #
120 : ${EGIT_BRANCH:=master}
121
122
123 ## -- EGIT_TREE:
124 #
125 # git eclass can checkout any tree.
126 # Defaults to EGIT_BRANCH.
127 #
128 : ${EGIT_TREE:=${EGIT_BRANCH}}
129
130
131 ## - EGIT_REPACK:
132 #
133 # git eclass will repack objects to save disk space. However this can take a
134 # long time with VERY big repositories. If this is your case set:
135 # EGIT_REPACK=false
136 #
137 : ${EGIT_REPACK:=false}
138
139 ## - EGIT_PRUNE:
140 #
141 # git eclass can prune the local clone. This is useful if upstream rewinds and
142 # rebases branches too often. If you don't want this to happen, set:
143 # EGIT_PRUNE=false
144 #
145 : ${EGIT_PRUNE:=false}
146
147
148 ## -- git_fetch() ------------------------------------------------- #
149
150 git_fetch() {
151
152 local EGIT_CLONE_DIR
153
154 # EGIT_REPO_URI is empty.
155 [[ -z ${EGIT_REPO_URI} ]] && die "${EGIT}: EGIT_REPO_URI is empty."
156
157 # check for the protocol or pull from a local repo.
158 if [[ -z ${EGIT_REPO_URI%%:*} ]] ; then
159 case ${EGIT_REPO_URI%%:*} in
160 git*|http|https|rsync|ssh)
161 ;;
162 *)
163 die "${EGIT}: fetch from "${EGIT_REPO_URI%:*}" is not yet implemented."
164 ;;
165 esac
166 fi
167
168 if [[ ! -d ${EGIT_STORE_DIR} ]] ; then
169 debug-print "${FUNCNAME}: initial clone. creating git directory"
170 addwrite /
171 mkdir -p "${EGIT_STORE_DIR}" \
172 || die "${EGIT}: can't mkdir ${EGIT_STORE_DIR}."
173 chmod -f o+rw "${EGIT_STORE_DIR}" \
174 || die "${EGIT}: can't chmod ${EGIT_STORE_DIR}."
175 export SANDBOX_WRITE="${SANDBOX_WRITE%%:/}"
176 fi
177
178 cd -P "${EGIT_STORE_DIR}" || die "${EGIT}: can't chdir to ${EGIT_STORE_DIR}"
179 EGIT_STORE_DIR=${PWD}
180
181 # every time
182 addwrite "${EGIT_STORE_DIR}"
183
184 [[ -z ${EGIT_REPO_URI##*/} ]] && EGIT_REPO_URI="${EGIT_REPO_URI%/}"
185 EGIT_CLONE_DIR="${EGIT_PROJECT}"
186
187 debug-print "${FUNCNAME}: EGIT_OPTIONS = \"${EGIT_OPTIONS}\""
188
189 export GIT_DIR="${EGIT_CLONE_DIR}"
190
191 if [[ ! -d ${EGIT_CLONE_DIR} ]] ; then
192 # first clone
193 einfo "git clone start -->"
194 einfo " repository: ${EGIT_REPO_URI}"
195
196 ${EGIT_FETCH_CMD} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${EGIT_PROJECT} \
197 || die "${EGIT}: can't fetch from ${EGIT_REPO_URI}."
198
199 # We use --bare cloning, so git doesn't do this for us.
200 git config remote.origin.url "${EGIT_REPO_URI}"
201 else
202 # Git urls might change, so unconditionally set it here
203 git config remote.origin.url "${EGIT_REPO_URI}"
204
205 # fetch updates
206 einfo "git update start -->"
207 einfo " repository: ${EGIT_REPO_URI}"
208
209 local oldsha1=$(git rev-parse ${EGIT_BRANCH})
210
211 ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} \
212 || die "${EGIT}: can't update from ${EGIT_REPO_URI}."
213
214 # piping through cat is needed to avoid a stupid Git feature
215 ${EGIT_DIFFSTAT_CMD} ${oldsha1}..${EGIT_BRANCH} | cat
216 fi
217
218 einfo " local clone: ${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}"
219
220 if ${EGIT_REPACK} || ${EGIT_PRUNE} ; then
221 ebegin "Garbage collecting the repository"
222 git gc $(${EGIT_PRUNE} && echo '--prune')
223 eend $?
224 fi
225
226 einfo " committish: ${EGIT_TREE}"
227
228 # export to the ${WORKDIR}
229 mkdir -p "${S}"
230 git archive --format=tar ${EGIT_TREE} | ( cd "${S}" ; tar xf - )
231
232 echo ">>> Unpacked to ${S}"
233
234 }
235
236
237 ## -- git_bootstrap() ------------------------------------------------ #
238
239 git_bootstrap() {
240
241 local patch lpatch
242
243 cd "${S}"
244
245 if [[ -n ${EGIT_PATCHES} ]] ; then
246 einfo "apply patches -->"
247
248 for patch in ${EGIT_PATCHES} ; do
249 if [[ -f ${patch} ]] ; then
250 epatch ${patch}
251 else
252 for lpatch in "${FILESDIR}"/${patch} ; do
253 if [[ -f ${lpatch} ]] ; then
254 epatch ${lpatch}
255 else
256 die "${EGIT}: ${patch} is not found"
257 fi
258 done
259 fi
260 done
261 echo
262 fi
263
264 if [[ -n ${EGIT_BOOTSTRAP} ]] ; then
265 einfo "begin bootstrap -->"
266
267 if [[ -f ${EGIT_BOOTSTRAP} ]] && [[ -x ${EGIT_BOOTSTRAP} ]] ; then
268 einfo " bootstrap with a file: ${EGIT_BOOTSTRAP}"
269 eval "./${EGIT_BOOTSTRAP}" \
270 || die "${EGIT}: can't execute EGIT_BOOTSTRAP."
271 else
272 einfo " bootstrap with commands: ${EGIT_BOOTSTRAP}"
273 eval "${EGIT_BOOTSTRAP}" \
274 || die "${EGIT}: can't eval EGIT_BOOTSTRAP."
275 fi
276 fi
277
278 }
279
280
281 ## -- git_src_unpack() ------------------------------------------------ #
282
283 git_src_unpack() {
284
285 git_fetch || die "${EGIT}: unknown problem in git_fetch()."
286 git_bootstrap || die "${EGIT}: unknown problem in git_bootstrap()."
287
288 }

  ViewVC Help
Powered by ViewVC 1.1.20