summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Górny <mgorny@gentoo.org>2017-11-18 00:19:33 +0100
committerMichał Górny <mgorny@gentoo.org>2017-11-28 10:14:16 +0100
commit539d635ed929d982cc1ab32ec685403c2d2694e3 (patch)
tree4f3763311c882de4b45740d1b3156b5bc58ebe07
parentdev-python/docutils-glep: Bump to 1.1 (diff)
downloadgentoo-539d635ed929d982cc1ab32ec685403c2d2694e3.tar.gz
gentoo-539d635ed929d982cc1ab32ec685403c2d2694e3.tar.bz2
gentoo-539d635ed929d982cc1ab32ec685403c2d2694e3.zip
git-r3.eclass: Support checking out specific subdirectories
Support limiting the git checkout to specific subdirectories of the git tree, using 'git checkout ... -- <paths>...' The main use case for this is doing partial checkouts of very large repositories where only a small subset of files is necessary. Doing partial checkouts can save both time and disk space which can be important in large intertwined projects such as LLVM+Clang.
-rw-r--r--eclass/git-r3.eclass20
1 files changed, 17 insertions, 3 deletions
diff --git a/eclass/git-r3.eclass b/eclass/git-r3.eclass
index c9d2731a64fe..caf4e8d003e0 100644
--- a/eclass/git-r3.eclass
+++ b/eclass/git-r3.eclass
@@ -803,7 +803,7 @@ git-r3_fetch() {
}
# @FUNCTION: git-r3_checkout
-# @USAGE: [<repo-uri> [<checkout-path> [<local-id>]]]
+# @USAGE: [<repo-uri> [<checkout-path> [<local-id> [<checkout-paths>...]]]]
# @DESCRIPTION:
# Check the previously fetched tree to the working copy.
#
@@ -819,6 +819,12 @@ git-r3_fetch() {
# <local-id> needs to specify the local identifier that was used
# for respective git-r3_fetch.
#
+# If <checkout-paths> are specified, then the specified paths are passed
+# to 'git checkout' to effect a partial checkout. Please note that such
+# checkout will not cause the repository to switch branches,
+# and submodules will be skipped at the moment. The submodules matching
+# those paths might be checked out in a future version of the eclass.
+#
# The checkout operation will write to the working copy, and export
# the repository state into the environment. If the repository contains
# submodules, they will be checked out recursively.
@@ -836,6 +842,7 @@ git-r3_checkout() {
local out_dir=${2:-${EGIT_CHECKOUT_DIR:-${WORKDIR}/${P}}}
local local_id=${3:-${CATEGORY}/${PN}/${SLOT%/*}}
+ local checkout_paths=( "${@:4}" )
local -x GIT_DIR
_git-r3_set_gitdir "${repos[0]}"
@@ -883,6 +890,9 @@ git-r3_checkout() {
else
set -- "${@}" "${new_commit_id}"
fi
+ if [[ ${checkout_paths[@]} ]]; then
+ set -- "${@}" -- "${checkout_paths[@]}"
+ fi
echo "${@}" >&2
"${@}" || die "git checkout ${remote_ref:-${new_commit_id}} failed"
}
@@ -905,8 +915,12 @@ git-r3_checkout() {
echo " updating from commit: ${old_commit_id}"
echo " to commit: ${new_commit_id}"
- git --no-pager diff --stat \
+ set -- git --no-pager diff --stat \
${old_commit_id}..${new_commit_id}
+ if [[ ${checkout_paths[@]} ]]; then
+ set -- "${@}" -- "${checkout_paths[@]}"
+ fi
+ "${@}"
else
echo " at the commit: ${new_commit_id}"
fi
@@ -914,7 +928,7 @@ git-r3_checkout() {
git update-ref --no-deref refs/git-r3/"${local_id}"/{__old__,__main__} || die
# recursively checkout submodules
- if [[ -f ${out_dir}/.gitmodules ]]; then
+ if [[ -f ${out_dir}/.gitmodules && ! ${checkout_paths} ]]; then
local submodules
_git-r3_set_submodules \
"$(<"${out_dir}"/.gitmodules)"