Skip to content

Commit be49fe3

Browse files
committed
Ignore local registries for lock file generation
When resolving indirect flake references like `nixpkgs` in `flake.nix` files, Nix will no longer use the system and user flake registries. It will only use the global flake registry and overrides given on the command line via `--override-flake`.
1 parent ab5a9cf commit be49fe3

File tree

6 files changed

+47
-6
lines changed

6 files changed

+47
-6
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
---
2+
synopsis: "Flake lock file generation now ignores local registries"
3+
prs: [12019]
4+
---
5+
6+
When resolving indirect flake references like `nixpkgs` in `flake.nix` files, Nix will no longer use the system and user flake registries. It will only use the global flake registry and overrides given on the command line via `--override-flake`.
7+
8+
This avoids accidents where users have local registry overrides that map `nixpkgs` to a `path:` flake in the local file system, which then end up in committed lock files pushed to other users.
9+
10+
In the future, we may remove the use of the registry during lock file generation altogether. It's better to explicitly specify the URL of a flake input. For example, instead of
11+
```nix
12+
{
13+
outputs = { self, nixpkgs }: { ... };
14+
}
15+
```
16+
write
17+
```nix
18+
{
19+
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
20+
outputs = { self, nixpkgs }: { ... };
21+
}
22+
```

src/libfetchers/registry.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ Registries getRegistries(const Settings & settings, ref<Store> store)
178178

179179
std::pair<Input, Attrs> lookupInRegistries(
180180
ref<Store> store,
181-
const Input & _input)
181+
const Input & _input,
182+
const RegistryFilter & filter)
182183
{
183184
Attrs extraAttrs;
184185
int n = 0;
@@ -190,6 +191,7 @@ std::pair<Input, Attrs> lookupInRegistries(
190191
if (n > 100) throw Error("cycle detected in flake registry for '%s'", input.to_string());
191192

192193
for (auto & registry : getRegistries(*input.settings, store)) {
194+
if (filter && !filter(registry->type)) continue;
193195
// FIXME: O(n)
194196
for (auto & entry : registry->entries) {
195197
if (entry.exact) {

src/libfetchers/registry.hh

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,15 @@ void overrideRegistry(
6565
const Input & to,
6666
const Attrs & extraAttrs);
6767

68+
using RegistryFilter = std::function<bool(Registry::RegistryType)>;
69+
70+
/**
71+
* Rewrite a flakeref using the registries. If `filter` is set, only
72+
* use the registries for which the filter function returns true.
73+
*/
6874
std::pair<Input, Attrs> lookupInRegistries(
6975
ref<Store> store,
70-
const Input & input);
76+
const Input & input,
77+
const RegistryFilter & filter = {});
7178

7279
}

src/libflake/flake/flake.cc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,13 @@ static std::tuple<StorePath, FlakeRef, FlakeRef> fetchOrSubstituteTree(
5454
fetched.emplace(originalRef.fetchTree(state.store));
5555
} else {
5656
if (allowLookup) {
57-
resolvedRef = originalRef.resolve(state.store);
57+
resolvedRef = originalRef.resolve(
58+
state.store,
59+
[](fetchers::Registry::RegistryType type) {
60+
/* Only use the global registry and CLI flags
61+
to resolve indirect flakerefs. */
62+
return type == fetchers::Registry::Flag || type == fetchers::Registry::Global;
63+
});
5864
auto fetchedResolved = lookupInFlakeCache(flakeCache, originalRef);
5965
if (!fetchedResolved) fetchedResolved.emplace(resolvedRef.fetchTree(state.store));
6066
flakeCache.push_back({resolvedRef, *fetchedResolved});

src/libflake/flake/flakeref.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#include "url.hh"
44
#include "url-parts.hh"
55
#include "fetchers.hh"
6-
#include "registry.hh"
76

87
namespace nix {
98

@@ -36,7 +35,9 @@ std::ostream & operator << (std::ostream & str, const FlakeRef & flakeRef)
3635
return str;
3736
}
3837

39-
FlakeRef FlakeRef::resolve(ref<Store> store) const
38+
FlakeRef FlakeRef::resolve(
39+
ref<Store> store,
40+
const fetchers::RegistryFilter & filter) const
4041
{
4142
auto [input2, extraAttrs] = lookupInRegistries(store, input);
4243
return FlakeRef(std::move(input2), fetchers::maybeGetStrAttr(extraAttrs, "dir").value_or(subdir));

src/libflake/flake/flakeref.hh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "types.hh"
77
#include "fetchers.hh"
88
#include "outputs-spec.hh"
9+
#include "registry.hh"
910

1011
namespace nix {
1112

@@ -57,7 +58,9 @@ struct FlakeRef
5758

5859
fetchers::Attrs toAttrs() const;
5960

60-
FlakeRef resolve(ref<Store> store) const;
61+
FlakeRef resolve(
62+
ref<Store> store,
63+
const fetchers::RegistryFilter & filter = {}) const;
6164

6265
static FlakeRef fromAttrs(
6366
const fetchers::Settings & fetchSettings,

0 commit comments

Comments
 (0)