mirror of
https://github.com/NixOS/nix.git
synced 2025-11-09 12:06:01 +01:00
nix flake check: improve error message if overlay is not a lambda (#8582)
* nix flake check: improve error message if overlay is not a lambda
Suppose you have an overlay like this
{
inputs = { /* ... */ };
outputs = { flake-utils, ... }: flake-utils.lib.eachDefaultSystem
(system: {
overlays.default = final: prev: {
};
});
}
then `nix flake check` (correctly) fails because `overlays` are supposed
to have the structure `overlays.<name> = final: prev: exp`. However, the
error-message is a little bit counter-intuitive:
error: overlay does not take an argument named 'final'
While one might guess where the error actually comes from because the
trace above says `… while checking the overlay 'overlays.x86_64-linux'`
this is still pretty confusing because it complains about an argument
not being named `final` even though that's evidently the case.
With this change, the error-message actually makes it clear what's
wrong:
[ma27@carsten:~/Projects/nix/tmp]$ nix flake check --extra-experimental-features 'nix-command flakes' path:$(pwd)
error:
… while checking flake output 'overlays'
at /nix/store/clgblnxx003hyrq8qkz5ab6kgqkck6qc-source/flake.nix:4:5:
3| outputs = { ... }: {
4| overlays.x86_64-linux.snens = final: prev: {
| ^
5| kek = throw "snens";
… while checking the overlay 'overlays.x86_64-linux'
at /nix/store/clgblnxx003hyrq8qkz5ab6kgqkck6qc-source/flake.nix:4:5:
3| outputs = { ... }: {
4| overlays.x86_64-linux.snens = final: prev: {
| ^
5| kek = throw "snens";
error: overlay is not a lambda, but a set instead
This commit is contained in:
parent
8e770dac9f
commit
559fd7ffe7
2 changed files with 16 additions and 2 deletions
|
|
@ -386,8 +386,10 @@ struct CmdFlakeCheck : FlakeCommand
|
||||||
auto checkOverlay = [&](const std::string & attrPath, Value & v, const PosIdx pos) {
|
auto checkOverlay = [&](const std::string & attrPath, Value & v, const PosIdx pos) {
|
||||||
try {
|
try {
|
||||||
state->forceValue(v, pos);
|
state->forceValue(v, pos);
|
||||||
if (!v.isLambda()
|
if (!v.isLambda()) {
|
||||||
|| v.lambda.fun->hasFormals()
|
throw Error("overlay is not a function, but %s instead", showType(v));
|
||||||
|
}
|
||||||
|
if (v.lambda.fun->hasFormals()
|
||||||
|| !argHasName(v.lambda.fun->arg, "final"))
|
|| !argHasName(v.lambda.fun->arg, "final"))
|
||||||
throw Error("overlay does not take an argument named 'final'");
|
throw Error("overlay does not take an argument named 'final'");
|
||||||
auto body = dynamic_cast<ExprLambda *>(v.lambda.fun->body);
|
auto body = dynamic_cast<ExprLambda *>(v.lambda.fun->body);
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,18 @@ EOF
|
||||||
|
|
||||||
(! nix flake check $flakeDir)
|
(! nix flake check $flakeDir)
|
||||||
|
|
||||||
|
cat > $flakeDir/flake.nix <<EOF
|
||||||
|
{
|
||||||
|
outputs = { self, ... }: {
|
||||||
|
overlays.x86_64-linux.foo = final: prev: {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
checkRes=$(nix flake check $flakeDir 2>&1 && fail "nix flake check --all-systems should have failed" || true)
|
||||||
|
echo "$checkRes" | grepQuiet "error: overlay is not a function, but a set instead"
|
||||||
|
|
||||||
cat > $flakeDir/flake.nix <<EOF
|
cat > $flakeDir/flake.nix <<EOF
|
||||||
{
|
{
|
||||||
outputs = { self }: {
|
outputs = { self }: {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue