aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Ullrich <sebasti@nullri.ch>2022-08-28 11:46:29 +0200
committerSebastian Ullrich <sebasti@nullri.ch>2022-08-28 11:50:25 +0200
commit6f65c117802ef4683eeaf64bc079cc3a8b9608c2 (patch)
tree777f094996081e5b3f2fe81e7e1da78d35971661
parent2b9d38130161116081d24630b99d1a437fa3bdb2 (diff)
Fix overlapping flake follows
-rw-r--r--src/libexpr/flake/lockfile.cc2
-rw-r--r--tests/flakes/follow-paths.sh32
2 files changed, 32 insertions, 2 deletions
diff --git a/src/libexpr/flake/lockfile.cc b/src/libexpr/flake/lockfile.cc
index 60b52d578..384ead05b 100644
--- a/src/libexpr/flake/lockfile.cc
+++ b/src/libexpr/flake/lockfile.cc
@@ -338,7 +338,7 @@ void LockFile::check()
for (auto & [inputPath, input] : inputs) {
if (auto follows = std::get_if<1>(&input)) {
- if (!follows->empty() && !get(inputs, *follows))
+ if (!follows->empty() && !findInput(*follows))
throw Error("input '%s' follows a non-existent input '%s'",
printInputPath(inputPath),
printInputPath(*follows));
diff --git a/tests/flakes/follow-paths.sh b/tests/flakes/follow-paths.sh
index e6751b06e..c12dbe0f6 100644
--- a/tests/flakes/follow-paths.sh
+++ b/tests/flakes/follow-paths.sh
@@ -149,7 +149,7 @@ git -C $flakeFollowsA add flake.nix
nix flake lock $flakeFollowsA 2>&1 | grep "warning: input 'B' has an override for a non-existent input 'invalid'"
nix flake lock $flakeFollowsA 2>&1 | grep "warning: input 'B' has an override for a non-existent input 'invalid2'"
-# Test nested flake overrides
+# Test nested flake overrides: A overrides B/C/D
cat <<EOF > $flakeFollowsD/flake.nix
{ outputs = _: {}; }
@@ -178,3 +178,33 @@ EOF
nix flake lock $flakeFollowsA
[[ $(jq -c .nodes.C.inputs.D $flakeFollowsA/flake.lock) = '["D"]' ]]
+
+# Test overlapping flake follows: B has D follow C/D, while A has B/C follow C
+
+cat <<EOF > $flakeFollowsC/flake.nix
+{
+ inputs.D.url = "path:$flakeFollowsD";
+ outputs = _: {};
+}
+EOF
+cat <<EOF > $flakeFollowsB/flake.nix
+{
+ inputs.C.url = "path:nosuchflake";
+ inputs.D.url = "path:nosuchflake";
+ inputs.D.follows = "C/D";
+ outputs = _: {};
+}
+EOF
+cat <<EOF > $flakeFollowsA/flake.nix
+{
+ inputs.B.url = "path:$flakeFollowsB";
+ inputs.C.url = "path:$flakeFollowsC";
+ inputs.B.inputs.C.follows = "C";
+ outputs = _: {};
+}
+EOF
+
+# bug was not triggered without recreating the lockfile
+nix flake lock $flakeFollowsA --recreate-lock-file
+
+[[ $(jq -c .nodes.B.inputs.D $flakeFollowsA/flake.lock) = '["B","C","D"]' ]]