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

Contents of /eclass/git.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.10 - (show annotations) (download)
Sun Mar 30 05:52:27 2008 UTC (6 years, 9 months ago) by robbat2
Branch: MAIN
Changes since 1.9: +2 -2 lines
Fix a comment.

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

  ViewVC Help
Powered by ViewVC 1.1.20