summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkgs/build-support/fetchgit/builder.sh1
-rw-r--r--pkgs/build-support/fetchgit/default.nix3
-rwxr-xr-xpkgs/build-support/fetchgit/nix-prefetch-git8
3 files changed, 10 insertions, 2 deletions
diff --git a/pkgs/build-support/fetchgit/builder.sh b/pkgs/build-support/fetchgit/builder.sh
index 0047a335c76c..c7c7d21709a1 100644
--- a/pkgs/build-support/fetchgit/builder.sh
+++ b/pkgs/build-support/fetchgit/builder.sh
@@ -11,6 +11,7 @@ $SHELL $fetcher --builder --url "$url" --out "$out" --rev "$rev" \
${fetchLFS:+--fetch-lfs} \
${deepClone:+--deepClone} \
${fetchSubmodules:+--fetch-submodules} \
+ ${sparseCheckout:+--sparse-checkout "$sparseCheckout"} \
${branchName:+--branch-name "$branchName"}
runHook postFetch
diff --git a/pkgs/build-support/fetchgit/default.nix b/pkgs/build-support/fetchgit/default.nix
index 3a05008dacb5..1b59668ce4bc 100644
--- a/pkgs/build-support/fetchgit/default.nix
+++ b/pkgs/build-support/fetchgit/default.nix
@@ -15,6 +15,7 @@ in
{ url, rev ? "HEAD", md5 ? "", sha256 ? "", hash ? "", leaveDotGit ? deepClone
, fetchSubmodules ? true, deepClone ? false
, branchName ? null
+, sparseCheckout ? ""
, name ? urlToName url rev
, # Shell code executed after the file has been fetched
# successfully. This can do things like check or transform the file.
@@ -74,7 +75,7 @@ stdenvNoCC.mkDerivation {
else
lib.fakeSha256;
- inherit url rev leaveDotGit fetchLFS fetchSubmodules deepClone branchName postFetch;
+ inherit url rev leaveDotGit fetchLFS fetchSubmodules deepClone branchName sparseCheckout postFetch;
postHook = if netrcPhase == null then null else ''
${netrcPhase}
diff --git a/pkgs/build-support/fetchgit/nix-prefetch-git b/pkgs/build-support/fetchgit/nix-prefetch-git
index be5068c7ad31..4e6f25b8dd7d 100755
--- a/pkgs/build-support/fetchgit/nix-prefetch-git
+++ b/pkgs/build-support/fetchgit/nix-prefetch-git
@@ -48,6 +48,7 @@ Options:
--rev ref Any sha1 or references (such as refs/heads/master)
--hash h Expected hash.
--branch-name Branch name to check out into
+ --sparse-checkout Only fetch and checkout part of the repository.
--deepClone Clone the entire repository.
--no-deepClone Make a shallow clone of just the required ref.
--leave-dotGit Keep the .git directories.
@@ -75,6 +76,7 @@ for arg; do
--hash) argfun=set_hashType;;
--branch-name) argfun=set_branchName;;
--deepClone) deepClone=true;;
+ --sparse-checkout) argfun=set_sparseCheckout;;
--quiet) QUIET=true;;
--no-deepClone) deepClone=;;
--leave-dotGit) leaveDotGit=true;;
@@ -96,7 +98,7 @@ for arg; do
case $argfun in
set_*)
var=${argfun#set_}
- eval $var=$arg
+ eval "$var=$(printf %q "$arg")"
;;
esac
argfun=""
@@ -112,6 +114,10 @@ init_remote(){
local url=$1
clean_git init --initial-branch=master
clean_git remote add origin "$url"
+ if [ -n "$sparseCheckout" ]; then
+ git config remote.origin.partialclonefilter "blob:none"
+ echo "$sparseCheckout" | git sparse-checkout set --stdin
+ fi
( [ -n "$http_proxy" ] && clean_git config http.proxy "$http_proxy" ) || true
}