Commit 8cf3dea
committed
Fix argument parsing for
Clap's parsing for variable-length argument lists has precedence rules for what
happens when a potential vararg overlaps with a known flag value (see https://docs.rs/clap/latest/clap/struct.Arg.html#method.allow_hyphen_values):
1. If we are already in a list of variable args, the args take precedence and any
potential flags are ignored (flags are treated as part of the vararg)
2. If we are _not_ already in a list of variable args, then known flags take
precedence and are parsed as such, rather than starting the vararg list
As a result of this precedence, with `volta run` set up to have `args` be
separate from `command`, we could run into parsing issues with commands that have
flags that overlap with Volta's. For example:
```
volta run node -h
```
When parsing this, Clap would see `node` as the `command`, and then it would
parse `-h` as _Volta's_ `-h` (help) flag and print Volta's help. This is because
the variable-length `args` hadn't started yet (we hadn't run into any unknown
positional arguments), so Clap treated `-h` as a known flag with higher
precedence. This is exactly the opposite of what we actually want for `volta run`
Instead, what we want is that everything after the `command` argument should
be treated as part of the arguments to the command; regardless of whether the
flag overlaps with Volta's flags.
To achieve that, we combine `command` and `args` into a _single_ vararg, so that
by virtue of having a command in the first place, the vararg has started parsing
and Clap will treat any flags as more argument values, rather than as flags.volta run to properly handle flags1 parent bd1b4ce commit 8cf3dea
1 file changed
+15
-7
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
52 | | - | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
53 | 55 | | |
54 | 56 | | |
55 | 57 | | |
| |||
59 | 61 | | |
60 | 62 | | |
61 | 63 | | |
62 | | - | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
63 | 71 | | |
64 | 72 | | |
65 | 73 | | |
| |||
0 commit comments