diff options
author | Michał Górny <mgorny@gentoo.org> | 2017-11-18 00:19:33 +0100 |
---|---|---|
committer | Michał Górny <mgorny@gentoo.org> | 2017-11-28 10:14:16 +0100 |
commit | 539d635ed929d982cc1ab32ec685403c2d2694e3 (patch) | |
tree | 4f3763311c882de4b45740d1b3156b5bc58ebe07 /eclass | |
parent | dev-python/docutils-glep: Bump to 1.1 (diff) | |
download | gentoo-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.
Diffstat (limited to 'eclass')
-rw-r--r-- | eclass/git-r3.eclass | 20 |
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)" |