libutil/args: warn on unknown settings after parsing all flags

This commit is contained in:
Cole Helbling 2024-05-14 12:13:40 -07:00
parent 06e13465c5
commit 39a269657e
2 changed files with 29 additions and 8 deletions

View file

@ -0,0 +1,28 @@
---
synopsis: Warn on unknown settings anywhere in the command line
prs: 10701
---
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'
{ }
```

View file

@ -268,8 +268,6 @@ void RootArgs::parseCmdline(const Strings & _cmdline, bool allowShebang)
verbosity = lvlError; verbosity = lvlError;
} }
bool argsSeen = false;
// Heuristic to see if we're invoked as a shebang script, namely, // Heuristic to see if we're invoked as a shebang script, namely,
// if we have at least one argument, it's the name of an // if we have at least one argument, it's the name of an
// executable file, and it starts with "#!". // executable file, and it starts with "#!".
@ -336,10 +334,6 @@ void RootArgs::parseCmdline(const Strings & _cmdline, bool allowShebang)
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))
@ -349,8 +343,7 @@ void RootArgs::parseCmdline(const Strings & _cmdline, bool allowShebang)
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 */