| 1 | # Copyright 1999-2009 Gentoo Foundation |
1 | # Copyright 1999-2009 Gentoo Foundation |
| 2 | # Distributed under the terms of the GNU General Public License v2 |
2 | # Distributed under the terms of the GNU General Public License v2 |
| 3 | # $Header: /var/cvsroot/gentoo-x86/eclass/git.eclass,v 1.25 2009/04/14 21:46:45 scarabeus Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/git.eclass,v 1.28 2009/08/24 21:48:58 scarabeus Exp $ |
| 4 | |
4 | |
| 5 | # @ECLASS: git.eclass |
5 | # @ECLASS: git.eclass |
| 6 | # @MAINTAINER: |
6 | # @MAINTAINER: |
| 7 | # Tomas Chvatal <scarabeus@gentoo.org> |
7 | # Tomas Chvatal <scarabeus@gentoo.org> |
| 8 | # Donnie Berkholz <dberkholz@gentoo.org> |
8 | # Donnie Berkholz <dberkholz@gentoo.org> |
| … | |
… | |
| 39 | : ${EGIT_QUIET:="OFF"} |
39 | : ${EGIT_QUIET:="OFF"} |
| 40 | |
40 | |
| 41 | # @ECLASS-VARIABLE: EGIT_STORE_DIR |
41 | # @ECLASS-VARIABLE: EGIT_STORE_DIR |
| 42 | # @DESCRIPTION: |
42 | # @DESCRIPTION: |
| 43 | # Storage directory for git sources. |
43 | # Storage directory for git sources. |
|
|
44 | # Can be redefined. |
| 44 | EGIT_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/git-src" |
45 | [[ -z ${EGIT_STORE_DIR} ]] && EGIT_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/git-src" |
| 45 | |
46 | |
| 46 | # @ECLASS-VARIABLE: EGIT_FETCH_CMD |
47 | # @ECLASS-VARIABLE: EGIT_FETCH_CMD |
| 47 | # @DESCRIPTION: |
48 | # @DESCRIPTION: |
| 48 | # Command for cloning the repository. |
49 | # Command for cloning the repository. |
| 49 | : ${EGIT_FETCH_CMD:="git clone --bare"} |
50 | : ${EGIT_FETCH_CMD:="git clone --bare"} |
| … | |
… | |
| 72 | # https:// |
73 | # https:// |
| 73 | # git:// |
74 | # git:// |
| 74 | # git+ssh:// |
75 | # git+ssh:// |
| 75 | # rsync:// |
76 | # rsync:// |
| 76 | # ssh:// |
77 | # ssh:// |
| 77 | : ${EGIT_REPO_URI:=} |
78 | eval X="\$${PN//-/_}_LIVE_REPO" |
| 78 | |
79 | if [[ ${X} = "" ]]; then |
|
|
80 | EGIT_REPO_URI=${EGIT_REPO_URI:=} |
|
|
81 | else |
|
|
82 | EGIT_REPO_URI="${X}" |
|
|
83 | fi |
| 79 | # @ECLASS-VARIABLE: EGIT_PROJECT |
84 | # @ECLASS-VARIABLE: EGIT_PROJECT |
| 80 | # @DESCRIPTION: |
85 | # @DESCRIPTION: |
| 81 | # Project name of your ebuild. |
86 | # Project name of your ebuild. |
| 82 | # Git eclass will check out the git repository like: |
87 | # Git eclass will check out the git repository like: |
| 83 | # ${EGIT_STORE_DIR}/${EGIT_PROJECT}/${EGIT_REPO_URI##*/} |
88 | # ${EGIT_STORE_DIR}/${EGIT_PROJECT}/${EGIT_REPO_URI##*/} |
| … | |
… | |
| 106 | # Please take note that this variable should be bash array. |
111 | # Please take note that this variable should be bash array. |
| 107 | |
112 | |
| 108 | # @ECLASS-VARIABLE: EGIT_BRANCH |
113 | # @ECLASS-VARIABLE: EGIT_BRANCH |
| 109 | # @DESCRIPTION: |
114 | # @DESCRIPTION: |
| 110 | # git eclass can fetch any branch in git_fetch(). |
115 | # git eclass can fetch any branch in git_fetch(). |
| 111 | : ${EGIT_BRANCH:=master} |
116 | eval X="\$${PN//-/_}_LIVE_BRANCH" |
|
|
117 | if [[ ${X} = "" ]]; then |
|
|
118 | EGIT_BRANCH=${EGIT_BRANCH:=master} |
|
|
119 | else |
|
|
120 | EGIT_BRANCH="${X}" |
|
|
121 | fi |
| 112 | |
122 | |
| 113 | # @ECLASS-VARIABLE: EGIT_TREE |
123 | # @ECLASS-VARIABLE: EGIT_TREE |
| 114 | # @DESCRIPTION: |
124 | # @DESCRIPTION: |
| 115 | # git eclass can checkout any tree (commit). |
125 | # git eclass can checkout any tree (commit). |
|
|
126 | eval X="\$${PN//-/_}_LIVE_TREE" |
|
|
127 | if [[ ${X} = "" ]]; then |
| 116 | : ${EGIT_TREE:=${EGIT_BRANCH}} |
128 | : ${EGIT_TREE:=${EGIT_BRANCH}} |
|
|
129 | else |
|
|
130 | EGIT_TREE="${X}" |
|
|
131 | fi |
| 117 | |
132 | |
| 118 | # @ECLASS-VARIABLE: EGIT_REPACK |
133 | # @ECLASS-VARIABLE: EGIT_REPACK |
| 119 | # @DESCRIPTION: |
134 | # @DESCRIPTION: |
| 120 | # git eclass will repack objects to save disk space. However this can take a |
135 | # git eclass will repack objects to save disk space. However this can take a |
| 121 | # long time with VERY big repositories. |
136 | # long time with VERY big repositories. |
| … | |
… | |
| 196 | ${elogcmd} " repository: ${EGIT_REPO_URI}" |
211 | ${elogcmd} " repository: ${EGIT_REPO_URI}" |
| 197 | |
212 | |
| 198 | ${EGIT_FETCH_CMD} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${EGIT_PROJECT} \ |
213 | ${EGIT_FETCH_CMD} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${EGIT_PROJECT} \ |
| 199 | || die "${EGIT}: can't fetch from ${EGIT_REPO_URI}." |
214 | || die "${EGIT}: can't fetch from ${EGIT_REPO_URI}." |
| 200 | |
215 | |
| 201 | oldsha1=$(git rev-parse ${EGIT_BRANCH}) |
216 | cursha1=$(git rev-parse ${EGIT_BRANCH}) |
| 202 | ${elogcmd} " at the commit: ${oldsha1}" |
217 | ${elogcmd} " at the commit: ${cursha1}" |
| 203 | |
|
|
| 204 | # We use --bare cloning, so git doesn't do this for us. |
218 | # We use --bare cloning, so git doesn't do this for us. |
| 205 | git config remote.origin.url "${EGIT_REPO_URI}" |
219 | git config remote.origin.url "${EGIT_REPO_URI}" |
| 206 | elif [[ -n ${EGIT_OFFLINE} ]] ; then |
220 | elif [[ -n ${EGIT_OFFLINE} ]] ; then |
| 207 | oldsha1=$(git rev-parse ${EGIT_BRANCH}) |
221 | cursha1=$(git rev-parse ${EGIT_BRANCH}) |
| 208 | ${elogcmd} "GIT offline update -->" |
222 | ${elogcmd} "GIT offline update -->" |
| 209 | ${elogcmd} " repository: ${EGIT_REPO_URI}" |
223 | ${elogcmd} " repository: ${EGIT_REPO_URI}" |
| 210 | ${elogcmd} " at the commit: ${oldsha1}" |
224 | ${elogcmd} " at the commit: ${cursha1}" |
| 211 | else |
225 | else |
| 212 | # Git urls might change, so unconditionally set it here |
226 | # Git urls might change, so unconditionally set it here |
| 213 | git config remote.origin.url "${EGIT_REPO_URI}" |
227 | git config remote.origin.url "${EGIT_REPO_URI}" |
| 214 | |
228 | |
| 215 | # fetch updates |
229 | # fetch updates |
| 216 | ${elogcmd} "GIT update -->" |
230 | ${elogcmd} "GIT update -->" |
| 217 | ${elogcmd} " repository: ${EGIT_REPO_URI}" |
231 | ${elogcmd} " repository: ${EGIT_REPO_URI}" |
| 218 | |
232 | |
| 219 | oldsha1=$(git rev-parse ${EGIT_BRANCH}) |
233 | oldsha1=$(git rev-parse ${EGIT_BRANCH}) |
| 220 | |
234 | |
|
|
235 | ${elogcmd} ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} |
| 221 | ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} \ |
236 | ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} \ |
| 222 | || die "${EGIT}: can't update from ${EGIT_REPO_URI}." |
237 | || die "${EGIT}: can't update from ${EGIT_REPO_URI}." |
| 223 | |
238 | |
| 224 | cursha1=$(git rev-parse ${EGIT_BRANCH}) |
239 | cursha1=$(git rev-parse ${EGIT_BRANCH}) |
| 225 | |
240 | |
| … | |
… | |
| 227 | if [[ ${oldsha1} != ${cursha1} ]]; then |
242 | if [[ ${oldsha1} != ${cursha1} ]]; then |
| 228 | ${elogcmd} " updating from commit: ${oldsha1}" |
243 | ${elogcmd} " updating from commit: ${oldsha1}" |
| 229 | ${elogcmd} " to commit: ${cursha1}" |
244 | ${elogcmd} " to commit: ${cursha1}" |
| 230 | else |
245 | else |
| 231 | ${elogcmd} " at the commit: ${cursha1}" |
246 | ${elogcmd} " at the commit: ${cursha1}" |
|
|
247 | # @ECLASS_VARIABLE: LIVE_FAIL_FETCH_IF_REPO_NOT_UPDATED |
|
|
248 | # @DESCRIPTION: |
|
|
249 | # If this variable is set to TRUE in make.conf or somewhere in |
|
|
250 | # enviroment the package will fail if there is no update, thus in |
|
|
251 | # combination with --keep-going it would lead in not-updating |
|
|
252 | # pakcages that are up-to-date. |
|
|
253 | # TODO: this can lead to issues if more projects/packages use same repo |
|
|
254 | [[ ${LIVE_FAIL_FETCH_IF_REPO_NOT_UPDATED} = true ]] && \ |
|
|
255 | debug-print "${FUNCNAME}: Repository \"${EGIT_REPO_URI}\" is up-to-date. Skipping." && \ |
|
|
256 | die "${EGIT}: Repository \"${EGIT_REPO_URI}\" is up-to-date. Skipping." |
| 232 | fi |
257 | fi |
| 233 | ${EGIT_DIFFSTAT_CMD} ${oldsha1}..${EGIT_BRANCH} |
258 | ${EGIT_DIFFSTAT_CMD} ${oldsha1}..${EGIT_BRANCH} |
| 234 | fi |
259 | fi |
| 235 | |
260 | |
| 236 | if ${EGIT_REPACK} || ${EGIT_PRUNE} ; then |
261 | if ${EGIT_REPACK} || ${EGIT_PRUNE} ; then |
| 237 | ebegin "Garbage collecting the repository" |
262 | ebegin "Garbage collecting the repository" |
| 238 | git gc $(${EGIT_PRUNE} && echo '--prune') |
263 | git gc $(${EGIT_PRUNE} && echo '--prune') |
| 239 | eend $? |
264 | eend $? |
| 240 | fi |
265 | fi |
|
|
266 | |
|
|
267 | # export the git version |
|
|
268 | export EGIT_VERSION="${cursha1}" |
| 241 | |
269 | |
| 242 | [[ ${EGIT_TREE} != ${EGIT_BRANCH} ]] && elog " tree: ${EGIT_TREE}" |
270 | [[ ${EGIT_TREE} != ${EGIT_BRANCH} ]] && elog " tree: ${EGIT_TREE}" |
| 243 | ${elogcmd} " branch: ${EGIT_BRANCH}" |
271 | ${elogcmd} " branch: ${EGIT_BRANCH}" |
| 244 | ${elogcmd} " storage directory: \"${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}\"" |
272 | ${elogcmd} " storage directory: \"${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}\"" |
| 245 | |
273 | |
| … | |
… | |
| 255 | branchname=tree-${EGIT_TREE} |
283 | branchname=tree-${EGIT_TREE} |
| 256 | src=${EGIT_TREE} |
284 | src=${EGIT_TREE} |
| 257 | fi |
285 | fi |
| 258 | debug-print "git checkout -b ${branchname} ${src}" |
286 | debug-print "git checkout -b ${branchname} ${src}" |
| 259 | git checkout -b ${branchname} ${src} 2>&1 > /dev/null |
287 | git checkout -b ${branchname} ${src} 2>&1 > /dev/null |
|
|
288 | debug-print "git submodule init" |
|
|
289 | git submodule init 2>&1 > /dev/null |
|
|
290 | debug-print "git submodule update" |
|
|
291 | git submodule update 2>&1 > /dev/null |
| 260 | popd > /dev/null |
292 | popd > /dev/null |
| 261 | |
293 | |
| 262 | unset branchname src |
294 | unset branchname src |
| 263 | |
295 | |
| 264 | echo ">>> Unpacked to ${S}" |
296 | echo ">>> Unpacked to ${S}" |