diff --git a/doc/build-helpers/fetchers.chapter.md b/doc/build-helpers/fetchers.chapter.md index 8ff1fdf11a19..bd606ea924f1 100644 --- a/doc/build-helpers/fetchers.chapter.md +++ b/doc/build-helpers/fetchers.chapter.md @@ -827,6 +827,10 @@ Additionally, the following optional arguments can be given: See [git sparse-checkout](https://git-scm.com/docs/git-sparse-checkout) for more information. +*`rootDir`* (String) + +: When not empty, copy only contents of the subdirectory of the repository to the result. Automatically sets `sparseCheckout` and `nonConeMode` to avoid checking out any extra pieces. Incompatible with `leaveDotGit`. + Some additional parameters for niche use-cases can be found listed in the function parameters in the declaration of `fetchgit`: `pkgs/build-support/fetchgit/default.nix`. Future parameters additions might also happen without immediately being documented here. diff --git a/doc/release-notes/rl-2511.section.md b/doc/release-notes/rl-2511.section.md index 2e54b34da408..023650e2664c 100644 --- a/doc/release-notes/rl-2511.section.md +++ b/doc/release-notes/rl-2511.section.md @@ -75,6 +75,7 @@ * `$debug/lib/debug/.build-id/48/3bd7f7229bdb06462222e1e353e4f37e15c293.sourceoverlay` is a symlink to a directory with the same structure as the expanded `$sourceRoot` but containing only a copy of files which were patched during the build * `$debug/lib/debug/.build-id/48/3bd7f7229bdb06462222e1e353e4f37e15c293.debug` is the file containing debug symbols (like before). +- `fetchgit`: Add `rootDir` argument to limit the resulting source to one subdirectory of the whole Git repository. Corresponding `--root-dir` option added to `nix-prefetch-git`. ## Nixpkgs Library {#sec-nixpkgs-release-25.11-lib} diff --git a/pkgs/build-support/fetchgit/builder.sh b/pkgs/build-support/fetchgit/builder.sh index 819b0127a852..393d0a57d163 100644 --- a/pkgs/build-support/fetchgit/builder.sh +++ b/pkgs/build-support/fetchgit/builder.sh @@ -16,6 +16,7 @@ $SHELL $fetcher --builder --url "$url" --out "$out" --rev "$rev" --name "$name" ${fetchTags:+--fetch-tags} \ ${sparseCheckout:+--sparse-checkout "$sparseCheckout"} \ ${nonConeMode:+--non-cone-mode} \ - ${branchName:+--branch-name "$branchName"} + ${branchName:+--branch-name "$branchName"} \ + ${rootDir:+--root-dir "$rootDir"} runHook postFetch diff --git a/pkgs/build-support/fetchgit/default.nix b/pkgs/build-support/fetchgit/default.nix index 374d55b0456c..f6099fddd984 100644 --- a/pkgs/build-support/fetchgit/default.nix +++ b/pkgs/build-support/fetchgit/default.nix @@ -8,12 +8,16 @@ let urlToName = - url: rev: + { + url, + rev, + append, + }: let shortRev = lib.sources.shortRev rev; appendShort = lib.optionalString ((builtins.match "[a-f0-9]*" rev) != null) "-${shortRev}"; in - "${lib.sources.urlToName url}${appendShort}"; + "${lib.sources.urlToName url}${if append == "" then appendShort else append}"; in lib.makeOverridable ( @@ -24,15 +28,20 @@ lib.makeOverridable ( url, tag ? null, rev ? null, - name ? urlToName url (lib.revOrTag rev tag), + name ? urlToName { + inherit url; + rev = lib.revOrTag rev tag; + # when rootDir is specified, avoid invalidating the result when rev changes + append = if rootDir != "" then "-${lib.strings.sanitizeDerivationName rootDir}" else ""; + }, leaveDotGit ? deepClone || fetchTags, outputHash ? lib.fakeHash, outputHashAlgo ? null, fetchSubmodules ? true, deepClone ? false, branchName ? null, - sparseCheckout ? [ ], - nonConeMode ? false, + sparseCheckout ? lib.optional (rootDir != "") rootDir, + nonConeMode ? rootDir != "", nativeBuildInputs ? [ ], # Shell code executed before the file has been fetched. This, in # particular, can do things like set NIX_PREFETCH_GIT_CHECKOUT_HOOK to @@ -53,6 +62,8 @@ lib.makeOverridable ( allowedRequisites ? null, # fetch all tags after tree (useful for git describe) fetchTags ? false, + # make this subdirectory the root of the result + rootDir ? "", }: /* @@ -80,6 +91,7 @@ lib.makeOverridable ( assert nonConeMode -> (sparseCheckout != [ ]); assert fetchTags -> leaveDotGit; + assert rootDir != "" -> !leaveDotGit; let revWithTag = @@ -136,6 +148,7 @@ lib.makeOverridable ( preFetch postFetch fetchTags + rootDir ; rev = revWithTag; diff --git a/pkgs/build-support/fetchgit/tests.nix b/pkgs/build-support/fetchgit/tests.nix index fd6aebc335f7..e3fdd5fb8672 100644 --- a/pkgs/build-support/fetchgit/tests.nix +++ b/pkgs/build-support/fetchgit/tests.nix @@ -97,4 +97,12 @@ rm -rf .git ''; }; + + rootDir = testers.invalidateFetcherByDrvHash fetchgit { + name = "fetchgit-with-rootdir"; + url = "https://github.com/NixOS/nix"; + rev = "9d9dbe6ed05854e03811c361a3380e09183f4f4a"; + rootDir = "misc/systemd"; + sha256 = "sha256-UhxHk4SrXYq7ZDMtXLig5SigpbITrVgkpFTmryuvpcM="; + }; }