Commit Graph

279 Commits

Author SHA1 Message Date
Philip Taron
754ee2fc40 fetchgit: Add rootDir argument (#427165) 2025-08-10 17:38:43 -07:00
Yuriy Taraday
34612851db fetchgit: Add rootDir argument
With this argument fetchgit will make a subdirectory of the Git
repository a root of the resulting store path. This is helpful for
dealing with monorepos where many projects are in separate directories
and don't need a new source hash every time the monorepo is updated.

Commit hash is removed from the name of the derivation to prevent it
from changing the store path when nothing in the subdirectory changes.
2025-08-08 16:20:05 +02:00
Yuriy Taraday
3985afc65c nix-prefetch-git: Add --root-dir argument
With this argument nix-prefetch-git will make a subdirectory of the Git
repository a root of the resulting store path. This is helpful for
dealing with monorepos where many projects are in separate directories
and don't need a new source hash every time the monorepo is updated.

The corresponding fetchgit change follows.
2025-08-08 16:20:05 +02:00
Philip Taron
0ca32f3372 tor: add tor.proxyHook (#426763) 2025-07-25 15:16:39 -07:00
Ryan Hendrickson
a3947d986f tor: add tor.proxyHook
tor.proxyHook is a setup hook intended for use with HTTP-based fetchers,
enabling them to download from .onion addresses using Tor as a proxy.
2025-07-24 13:25:04 -04:00
Wolfgang Walther
5a0711127c treewide: run nixfmt 1.0.0 2025-07-24 13:55:40 +02:00
Jared Baur
5cd869caa4 fetchgit: pass --checkout when fetching submodules
For projects that have `submodule.$name.update` set to something other
than the default value of "checkout", this change will ensure those
submodules are fetched as well.
2025-07-16 22:13:22 -07:00
lassulus
78f051e8af lib, treewide: introduce repoRevToName and use it to cleanup most fetch* functions (#316668) 2025-06-10 22:49:23 +02:00
Philip Taron
7ee611b07f tests.fetchgit.fetchTags: fix flaky test by removing .git directory after getting tags
Closes #412967
2025-06-02 10:51:02 -07:00
Jan Malakhovski
7c8a4efb68 lib, treewide: introduce repoRevToName, use it in most fetch* functions
This patch adds `lib.repoRevToName` function that generalizes away most of the
code used for derivation name generation by `fetch*` functions (`fetchzip`,
`fetchFromGitHub`, etc, except those which are delayed until latter commits
for mass-rebuild reasons).

It's first argument controls how the resulting name will look (see below).

Since `lib` has no equivalent of Nixpkgs' `config`, this patch adds
`config.fetchedSourceNameDefault` option to Nixpkgs and then re-exposes
`lib.repoRevToName config.fetchedSourceNameDefault` expression as
`pkgs.repoRevToNameMaybe` which is then used in `fetch*` derivations.

The result is that different values of `config.fetchedSourceNameDefault` now
control how the `src` derivations produced by `fetch*` functions are to be
named, e.g.:

- `fetchedSourceNameDefault = "source"` (the default):

  ```
  $ nix-instantiate -A fuse.src
  /nix/store/<hash>-source.drv
  ```

- `fetchedSourceNameDefault = "versioned"`:

  ```
  $ nix-instantiate -A fuse.src
  /nix/store/<hash>-libfuse-2.9.9-source.drv
  ```

- `fetchedSourceNameDefault = "full"`:

  ```
  $ nix-instantiate -A fuse.src
  /nix/store/<hash>-libfuse-2.9.9-github-source.drv
  ```

See the documentation of `config.fetchedSourceNameDefault` for more info.
2025-05-31 10:01:21 +00:00
Tim Black
1247031689 pkgs/build-support/fetchgit: add fetchTags parameter
Added fetchTags feature to fetchgit, explicit and clear support for
fetching all tags after the source tree fetch completes. Doing this at
build-time in the fetcher is required for packages that invoke commands
like 'git describe' which require tags, and since the nix store is
read-only by design, it is not possible to git fetch --tags at
activation- or run-time. This feature may have been possible by
specifying a postFetch option including calling git fetch --tags,
however doing so obfuscates the solution to this very real problem.
Explicit support for fetching tags should be a first class citizen just
like fetching other refs.
2025-05-28 16:47:34 -07:00
Adam Dinwoodie
d95d3724d8 fetchgit: add preFetch hook
This allows running code to change the environment before the
nix-prefetch-git script is run.  In particular, it allows setting things
like NIX_PREFETCH_GIT_CHECKOUT_HOOK, which allows additional code to be
run before deleting the .git directory.

This also means there's potentially value in performing a deep clone
then removing the .git directory, so remove the assertion that prevents
doing so.
2025-05-06 14:14:26 +01:00
Valentin Gagarin
c59a777a97 nix-prefetch-git: add --name parameter
This allows tools like `npins` to avoid re-downloading pre-fetched sources at evaluation time,
by setting the same symbolic store path name as `builtins.fetchGit` does,
and would make hacks such as [0] obsolete.

Historical note: `builtins.fetchGit` was introduced in 2016 [1] and
released in 2018 [2]. Before that, there was only the Nixpkgs `fetchgit`,
and the convention for using constant store path names [3] was not established yet [4].

While arguably in retrospect store path names were a mistake, we cannot
undo it here even partially by setting them to a constant, as it would invalidate
countless fixed-output derivations and thus incur an increase in
resource consumption and potentially a large number of build failures.

[0]: f0449d090c
[1]: 38539b943a
[2]: https://github.com/NixOS/nix/releases/tag/2.0
[3]: db00265e81/source/guides/best-practices.md (L263-L264)
[4]: a8603605aa
2025-04-15 12:10:00 +02:00
Silvan Mosberger
e52d633a63 Merge remote-tracking branch 'upstream/staging-next' into staging 2025-04-02 18:30:54 +02:00
Silvan Mosberger
374e6bcc40 treewide: Format all Nix files
Format all Nix files using the officially approved formatter,
making the CI check introduced in the previous commit succeed:

  nix-build ci -A fmt.check

This is the next step of the of the [implementation](https://github.com/NixOS/nixfmt/issues/153)
of the accepted [RFC 166](https://github.com/NixOS/rfcs/pull/166).

This commit will lead to merge conflicts for a number of PRs,
up to an estimated ~1100 (~33%) among the PRs with activity in the past 2
months, but that should be lower than what it would be without the previous
[partial treewide format](https://github.com/NixOS/nixpkgs/pull/322537).

Merge conflicts caused by this commit can now automatically be resolved while rebasing using the
[auto-rebase script](8616af08d9/maintainers/scripts/auto-rebase).

If you run into any problems regarding any of this, please reach out to the
[formatting team](https://nixos.org/community/teams/formatting/) by
pinging @NixOS/nix-formatting.
2025-04-01 20:10:43 +02:00
Adam Dinwoodie
eee9a856bf git: use zlib-ng rather than zlib
Git v2.49.0 added support for using the faster zlib-ng library, and
benchmarks by GitLab show it's notably faster, so use it for our builds
too.

The different zlib implementation does change the contents of the .git
directory, which means the hashes for fetchgit tests that leave the .git
directory in place are expected to change.

https://about.gitlab.com/blog/2025/03/14/whats-new-in-git-2-49-0/#introduction-of-zlib-ng
2025-03-16 15:05:24 +00:00
Adam Dinwoodie
003998bcb5 tests.fetchgit: test deep clone without .git
The deepClone argument to fetchgit implies leaveDotGit.  Make the
"submodule-deep" fetchgit test more useful by having it remove the .git
directory, as recommended in the fetchgit documentation, so it is
distinguished from the "submodule-leave-git-deep" test.
2025-03-16 14:57:01 +00:00
Alex
1f05c38ab8 fetchgit: now accepts nativeBuildInputs, similar to e.g. fetchzip, fetchpatch 2025-02-25 17:08:26 -08:00
Adam Dinwoodie
5a847c0878 git: 2.47.2 -> 2.48.1
This version change includes a change to the contents of the .git
directory, which results in changes to hashes for any fetchgit
invocations that set leaveDotGit to true.  Per the fetchgit
documentation and discussions in #372784, the contents of the .git directory are not stable, so
anyone using that should either only be using it for temporary testing
purposes, or should be removing the .git directory in fetchgit's
postFetch phase, so before the hash is calculated.  That means there's
no need to do any other handling here to avoid compatibility problems,
and can just update the relevant hashes in the fetchgit tests.

There's still a chance this will break some other builds because of the
change to the contents of the .git directory.  If so, whoever's
responsible for those other derivations should either stop using
leaveDotGit, or should follow the documented advice to remove the .git
directory in the postFetch phase.
2025-02-11 20:00:01 +00:00
github-actions[bot]
4eff25d266 Merge staging-next into staging 2025-01-02 00:14:42 +00:00
Peder Bergebakken Sundt
1f50def18f fetchgit: passthru tag 2024-12-30 23:08:07 +01:00
Wolfgang Walther
cf127c9dc3 treewide: load structured attributes in all bash builders consistently
It's hard to put the sourcing of ./.attrs.sh into all builder
consistently - mistakes will happen. Thus, load structured attrs once in
make-derivation and then source the remaining builder on top.

This should fix quite a few builders with structured attributes in
principle. Most importantly it helps substitute / substituteAll, which
are required for bootstrap on some platforms.
2024-12-29 18:36:47 +01:00
Jörg Thalheim
3dc8ff155b build-support: fix nix-prefetch-* on macOS (#358685) 2024-12-13 14:23:56 +01:00
Atemu
e9a31f5146 fetchgit{,hub}: assert illegal tag + rev combinations
It's quite a bit more complex due to this but this was asked for during review
2024-12-05 16:29:11 +01:00
Jonathan del Strother
6cb8c5ec01 build-support: Simplify tmpdir creation with coreutils
macOS 10.12 doesn't have a usable --tmpdir flag on the builtin mktemp, but we can
make use of coreutil's mktemp instead.
2024-11-25 09:41:02 +00:00
Jonathan del Strother
0c3d16a7d5 build-support: fix nix-prefetch-* on macOS
Since nix 2.20, `nix-store --add-fixed` doesn't accept paths where the
parent directory is a symlink. On macOS, /tmp is a symlink to
/private/tmp, which causes a "'/tmp' is a symlink" error:

```
$ nix run github:nixos/nixpkgs/24.11-beta#nix-prefetch-git -- --url https://github.com/IFTTT/polo.git --rev 316aa2ac210a45a7fc400ab921831493d5dd21b8 --hash sha256
Initialized empty Git repository in /private/tmp/git-checkout-tmp-1Bf9bIv7/polo-316aa2a/.git/
remote: Enumerating objects: 51, done.
remote: Counting objects: 100% (51/51), done.
remote: Compressing objects: 100% (42/42), done.
remote: Total 51 (delta 8), reused 19 (delta 5), pack-reused 0 (from 0)
Unpacking objects: 100% (51/51), 19.57 KiB | 541.00 KiB/s, done.
From https://github.com/IFTTT/polo
 * branch            HEAD       -> FETCH_HEAD
Switched to a new branch 'fetchgit'
removing `.git'...
error: path '/tmp' is a symlink
```

Avoid this by resolving /tmp to a real directory in all the prefetch scripts
2024-11-25 09:32:14 +00:00
Atemu
cb9f9a1e5a fetchgit{,hub}: add tag argument
It's become a common pattern to use `rev = "refs/tags/${version}"` rather than
just `rev = version` to ensure that the tag gets fetched rather than a branch
that has the same name. This has so far been done using boilerplate though, so
let's add a simple abstraction to fetch a tag instead.
2024-11-18 08:20:00 +01:00
Atemu
ee97de3be9 fetchgit: nudge to update the manual when modifying parameters
Many parameters added over the past many years were not documented in the
manual. People likely simple didn't think to do that, so let's nudge them.
2024-11-14 23:50:13 +01:00
thomasjm
4f13c7cc7b nix-prefetch-git: fix error in home folder cleanup 2024-10-23 03:24:02 -07:00
nicoo
0518f4d245 fetchgit: factor-out the hash logic to lib.fetchers.withNormalizedHash 2024-09-17 08:31:36 +00:00
Tim Cuthbertson
911aa1440f treewide: support NIX_SSL_CERT_FILE as an impureEnvVar
This envvar is also added to lib.proxyImpureEnvVars since it's
typically required for https proxies.

This change also updates fetchgit and go module fetching to use this
envvar. NIX_GIT_SSL_CAINFO is still supported for backwards
compatibility in fetchgit.
2024-08-23 21:34:22 +10:00
Scott Worley
697bba9892 fetchgit: Support fetching signed tags over dumb http transport 2024-04-22 02:16:02 +02:00
linsui
1ed37ac9f3 fetchgit: set http.proxy globally for submodules
git config in the repo doesn't work for submodules
2024-03-21 19:14:00 +08:00
Weijia Wang
74d102ce50 Merge branch 'master' into staging-next 2023-11-12 19:45:20 +01:00
SharzyL
b186e2d76e nix-prefetch-git: make it quiet
Some programs (e.g. nvfetcher) parse the output of nix-prefetch-git as
JSON. However, there is a pushd/popd command in nix-prefetch-git that
outputs the directory name, breaking the structure of the result JSON.
We suppressed it with `>/dev/null`.

Passingly fixes a mixuse of tab and spaces.
2023-11-12 15:20:16 +01:00
github-actions[bot]
33248a2caf Merge master into staging-next 2023-11-12 00:02:14 +00:00
Elliot Cameron
3a99d1b642 nix-prefetch-git: respect NETRC
This script needs to support being run both as part of a `fetchgit`
derivation and as a standalone, command-line tool.

The use of `$NIX_BUILD_TOP` only works when used in `fetchgit` but not when
invoked as a standalone tool. Instead we try to respect `$NETRC` so that
the command-line invocation behaves more like standard tools and the
`fetchgit` derivation can explicitly set `$NETRC` when `netrcPhase` is used
to avoid all ambiguity.
2023-11-11 19:34:54 +01:00
github-actions[bot]
4aad65bfdb Merge master into staging-next 2023-11-09 06:01:11 +00:00
Shogo Takata
d6e1c7cae6 fetchgit: shallow clone for submodules (#254172) 2023-11-09 04:32:13 +02:00
Weijia Wang
32da89a1a1 Merge branch 'master' into staging-next 2023-11-06 14:33:18 +01:00
K900
fa40d6457a nix-prefetch-git: download submodules with --progress 2023-11-05 20:49:03 +03:00
github-actions[bot]
de49fc16bc Merge staging-next into staging 2023-10-16 12:01:54 +00:00
Domen Kožar
3c6cf39435 Merge pull request #249733 from Aleksanaa/nix-prefetch-git
nix-prefetch-git: fix make_deterministic_repo in submodules
2023-10-16 11:12:11 +01:00
github-actions[bot]
81871f4c87 Merge staging-next into staging 2023-10-08 12:01:52 +00:00
Sandro Jäckel
d09cd1d7d1 fetchgit: use $NIX_BUILD_TOP instead of hardcoding /build/
Co-authored-by: Bjørn Forsman <133602+bjornfor@users.noreply.github.com>
2023-10-08 00:10:59 +02:00
github-actions[bot]
2c70ec4a27 Merge staging-next into staging 2023-10-05 18:01:34 +00:00
Sandro Jäckel
025a028c47 fetchgit: fix private fetching via netrc
This fixes a regression introduced in https://github.com/NixOS/nixpkgs/pull/256628
which broke fetching with private = true through a netrc file.
Tested locally with a really special github enterprise.
2023-10-05 13:54:00 +00:00
Maximilian Bosch
8bc5104a6e treewide: refactor .attrs.sh detection
When specifying the `builder` attribute in `stdenv.mkDerivation`, this
will be effectively transformed into

    builtins.derivation {
      builder = stdenv.shell;
      args = [ "-e" builder ];
    }

This also means that `default-builder.sh` is never sourced and as a
result it's not guaranteed that `$NIX_ATTRS_SH_FILE` is set to a correct
location[1].

Also, we need to source `.attrs.sh` to source `$stdenv`. So, the
following is done now:

* If `$NIX_ATTRS_SH_FILE` points to a correct location, then use it.
  Directly using `.attrs.sh` is problematic for `nix-shell(1)` usage
  (see previous commit for more context), so prefer the environment
  variable if possible.

* Otherwise, if `.attrs.sh` exists, then use it. See [1] for when this
  can happen.

* If neither applies, it can be assumed that `__structuredAttrs` is
  turned off and thus nothing needs to be done.

[1] It's possible that it doesn't exist at all - in case of Nix 2.3 or
    it can point to a wrong location on older Nix versions with a bug in
    `__structuredAttrs`.
2023-10-04 18:36:57 +02:00
Alyssa Ross
7d40fbbc04 nix-prefetch-git: ignore global and user git config
nix-prefetch-git is either run as part of a build, usually sandboxed,
or outside a build, unsandboxed, to prefetch something that will later
be used in a build.  It's important that the latter use produces
hashes that can be reproduced by the former.

One way that they can differ is if the user's git config does
something that changes the result of git clone.  I ran into this,
because my global git config automatically enables git-lfs, whereas
nix-prefetch-git otherwise only uses git-lfs if specifically
requested.  This led to very confusing hash mismatches.
2023-09-22 06:59:40 +00:00
Silvan Mosberger
7cbc8215fd Merge pull request #252865 from emily-is-my-username/fix/fetchgit-deepclone
`fetchgit`: don't shallow clone if `deepClone` is requested
2023-09-06 14:08:06 +02:00