libutil/args: warn on unknown settings after parsing all flags
Upstream change: https://github.com/NixOS/nix/pull/10701
Change-Id: Icf271df57ec529dd8c64667d1ef9f6dbf02d33d3
This commit is contained in:
parent
218630a241
commit
031d924116
|
@ -36,6 +36,10 @@ artemist:
|
||||||
display_name: Artemis Tosini
|
display_name: Artemis Tosini
|
||||||
forgejo: artemist
|
forgejo: artemist
|
||||||
|
|
||||||
|
cole-h:
|
||||||
|
display_name: Cole Helbling
|
||||||
|
github: cole-h
|
||||||
|
|
||||||
edolstra:
|
edolstra:
|
||||||
display_name: Eelco Dolstra
|
display_name: Eelco Dolstra
|
||||||
github: edolstra
|
github: edolstra
|
||||||
|
|
30
doc/manual/rl-next/fix-silent-unknown-options.md
Normal file
30
doc/manual/rl-next/fix-silent-unknown-options.md
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
---
|
||||||
|
synopsis: Warn on unknown settings anywhere in the command line
|
||||||
|
prs: 10701
|
||||||
|
credits: [cole-h]
|
||||||
|
category: Improvements
|
||||||
|
---
|
||||||
|
|
||||||
|
All `nix` commands will now properly warn when an unknown option is specified anywhere in the command line.
|
||||||
|
|
||||||
|
Before:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ nix-instantiate --option foobar baz --expr '{}'
|
||||||
|
warning: unknown setting 'foobar'
|
||||||
|
$ nix-instantiate '{}' --option foobar baz --expr
|
||||||
|
$ nix eval --expr '{}' --option foobar baz
|
||||||
|
{ }
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ nix-instantiate --option foobar baz --expr '{}'
|
||||||
|
warning: unknown setting 'foobar'
|
||||||
|
$ nix-instantiate '{}' --option foobar baz --expr
|
||||||
|
warning: unknown setting 'foobar'
|
||||||
|
$ nix eval --expr '{}' --option foobar baz
|
||||||
|
warning: unknown setting 'foobar'
|
||||||
|
{ }
|
||||||
|
```
|
|
@ -93,7 +93,6 @@ void RootArgs::parseCmdline(const Strings & _cmdline)
|
||||||
verbosity = lvlError;
|
verbosity = lvlError;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool argsSeen = false;
|
|
||||||
for (auto pos = cmdline.begin(); pos != cmdline.end(); ) {
|
for (auto pos = cmdline.begin(); pos != cmdline.end(); ) {
|
||||||
|
|
||||||
auto arg = *pos;
|
auto arg = *pos;
|
||||||
|
@ -122,10 +121,6 @@ void RootArgs::parseCmdline(const Strings & _cmdline)
|
||||||
throw UsageError("unrecognised flag '%1%'", arg);
|
throw UsageError("unrecognised flag '%1%'", arg);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!argsSeen) {
|
|
||||||
argsSeen = true;
|
|
||||||
initialFlagsProcessed();
|
|
||||||
}
|
|
||||||
pos = rewriteArgs(cmdline, pos);
|
pos = rewriteArgs(cmdline, pos);
|
||||||
pendingArgs.push_back(*pos++);
|
pendingArgs.push_back(*pos++);
|
||||||
if (processArgs(pendingArgs, false))
|
if (processArgs(pendingArgs, false))
|
||||||
|
@ -135,8 +130,7 @@ void RootArgs::parseCmdline(const Strings & _cmdline)
|
||||||
|
|
||||||
processArgs(pendingArgs, true);
|
processArgs(pendingArgs, true);
|
||||||
|
|
||||||
if (!argsSeen)
|
initialFlagsProcessed();
|
||||||
initialFlagsProcessed();
|
|
||||||
|
|
||||||
/* Now that we are done parsing, make sure that any experimental
|
/* Now that we are done parsing, make sure that any experimental
|
||||||
* feature required by the flags is enabled */
|
* feature required by the flags is enabled */
|
||||||
|
|
|
@ -51,3 +51,7 @@ mkdir -p $TEST_ROOT/xyzzy $TEST_ROOT/foo
|
||||||
ln -sfn ../xyzzy $TEST_ROOT/foo/bar
|
ln -sfn ../xyzzy $TEST_ROOT/foo/bar
|
||||||
printf 123 > $TEST_ROOT/xyzzy/default.nix
|
printf 123 > $TEST_ROOT/xyzzy/default.nix
|
||||||
[[ $(nix eval --impure --expr "import $TEST_ROOT/foo/bar") = 123 ]]
|
[[ $(nix eval --impure --expr "import $TEST_ROOT/foo/bar") = 123 ]]
|
||||||
|
|
||||||
|
# Test that unknown settings are warned about
|
||||||
|
out="$(expectStderr 0 nix eval --option foobar baz --expr '""' --raw)"
|
||||||
|
[[ "$(echo "$out" | grep foobar | wc -l)" = 1 ]]
|
||||||
|
|
|
@ -30,3 +30,12 @@ expectStderr 1 nix-instantiate --eval -E '[]' -A 'x' | grepQuiet "should be a se
|
||||||
expectStderr 1 nix-instantiate --eval -E '{}' -A '1' | grepQuiet "should be a list"
|
expectStderr 1 nix-instantiate --eval -E '{}' -A '1' | grepQuiet "should be a list"
|
||||||
expectStderr 1 nix-instantiate --eval -E '{}' -A '.' | grepQuiet "empty attribute name"
|
expectStderr 1 nix-instantiate --eval -E '{}' -A '.' | grepQuiet "empty attribute name"
|
||||||
expectStderr 1 nix-instantiate --eval -E '[]' -A '1' | grepQuiet "out of range"
|
expectStderr 1 nix-instantiate --eval -E '[]' -A '1' | grepQuiet "out of range"
|
||||||
|
|
||||||
|
# Unknown setting warning
|
||||||
|
# NOTE(cole-h): behavior is different depending on the order, which is why we test an unknown option
|
||||||
|
# before and after the `'{}'`!
|
||||||
|
out="$(expectStderr 0 nix-instantiate --option foobar baz --expr '{}')"
|
||||||
|
[[ "$(echo "$out" | grep foobar | wc -l)" = 1 ]]
|
||||||
|
|
||||||
|
out="$(expectStderr 0 nix-instantiate '{}' --option foobar baz --expr )"
|
||||||
|
[[ "$(echo "$out" | grep foobar | wc -l)" = 1 ]]
|
||||||
|
|
Loading…
Reference in a new issue