aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMaximilian Bosch <maximilian@mbosch.me>2022-06-13 20:39:09 +0200
committerMaximilian Bosch <maximilian@mbosch.me>2022-07-12 10:18:38 +0200
commitc1c37f32002e2e2ad167bcac2e5d76a3a3ad6a35 (patch)
tree56308eb385627248159035f5092ab6713372362d /tests
parentf071eb3702c7aa86fc1885321d73a3707ed702b6 (diff)
flakes: throw an error if `follows`-declaration for an input is invalid
I recently got fairly confused why the following expression didn't have any effect { description = "Foobar"; inputs.sops-nix = { url = github:mic92/sops-nix; inputs.nixpkgs_22_05.follows = "nixpkgs"; }; } until I found out that the input was called `nixpkgs-22_05` (please note the dash vs. underscore). IMHO it's not a good idea to not throw an error in that case and probably leave end-users rather confused, so I implemented a small check for that which basically checks whether `follows`-declaration from overrides actually have corresponding inputs in the transitive flake. In fact this was done by accident already in our own test-suite where the removal of a `follows` was apparently forgotten[1]. Since the key of the `std::map` that holds the `overrides` is a vector and we have to find the last element of each vector (i.e. the override) this has to be done with a for loop in O(n) complexity with `n` being the total amount of overrides (which shouldn't be that large though). Please note that this doesn't work with nested expressions, i.e. inputs.fenix.inputs.nixpkgs.follows = "..."; which is a known problem[2]. For the expression demonstrated above, an error like this will be thrown: error: sops-nix has a `follows'-declaration for a non-existant input nixpkgs_22_05! [1] 2664a216e57169ec57d7f51be1b8383c1be83fd5 [2] https://github.com/NixOS/nix/issues/5790
Diffstat (limited to 'tests')
-rw-r--r--tests/flakes.sh21
1 files changed, 20 insertions, 1 deletions
diff --git a/tests/flakes.sh b/tests/flakes.sh
index 35cf4d8e7..868c410f4 100644
--- a/tests/flakes.sh
+++ b/tests/flakes.sh
@@ -801,6 +801,8 @@ nix flake metadata $flakeFollowsA
nix flake update $flakeFollowsA
+nix flake lock $flakeFollowsA
+
oldLock="$(cat "$flakeFollowsA/flake.lock")"
# Ensure that locking twice doesn't change anything
@@ -823,7 +825,6 @@ cat > $flakeFollowsA/flake.nix <<EOF
inputs = {
B = {
url = "path:./flakeB";
- inputs.nonFlake.follows = "D";
};
D.url = "path:./flakeD";
};
@@ -859,3 +860,21 @@ nix store delete $(nix store add-path $badFlakeDir)
[[ $(nix path-info $(nix store add-path $flake1Dir)) =~ flake1 ]]
[[ $(nix path-info path:$(nix store add-path $flake1Dir)) =~ simple ]]
+
+# Non-existant follows causes an error
+
+cat >$flakeFollowsA/flake.nix <<EOF
+{
+ description = "Flake A";
+ inputs.B = {
+ url = "path:./flakeB";
+ inputs.invalid.follows = "D";
+ };
+ inputs.D.url = "path:./flakeD";
+ outputs = { ... }: {};
+}
+EOF
+
+git -C $flakeFollowsA add flake.nix
+
+nix flake lock $flakeFollowsA 2>&1 | grep "error: B has a \`follows'-declaration for a non-existant input invalid!"