fix!: Include -- in passthrough args (#436)

Given a grammar like this:

```golang
var cli struct {
        Args []string `arg:"" optional:"" passthrough:""`
}
```

If Kong parses `cli foo -- bar`, it will populate `Args` with `[]string{"foo", "--", "bar"}` (including "`--`").
However, if Kong parses `cli -- foo bar`, will populate `Args` with `[]string{"foo", "bar"}` (leaving off `"--"`).

This differs from the behavior of a passthrough Command, where `"--"` is included with the args in both cases.

There are 3 places where `c.endParsing()` is called
1. When `node.Passthrough` is true: https://github.com/alecthomas/kong/blob/5f9c5cc822bdb888a3671c44d4688a6f602ecb90/context.go#L366-L368
2. When `arg.Passthrough` is true: https://github.com/alecthomas/kong/blob/5f9c5cc822bdb888a3671c44d4688a6f602ecb90/context.go#L451-L453
3. When `"--"` is encountered: https://github.com/alecthomas/kong/blob/5f9c5cc822bdb888a3671c44d4688a6f602ecb90/context.go#L384-L387

The first two do not also pop any tokens. The third one does.

This commit makes `c.scan.Pop()` conditional, skipping it when the next positional argument is passthrough.

I believe this will cause Kong to behave a little more consistently — and from my perspective, `--` is relevant for args intended to be passed through! — but it will change the behavior of existing projects that use `arg:"" passthrough:""`.
This commit is contained in:
Bob Lail
2024-09-10 17:51:37 -07:00
committed by GitHub
parent 4ecb53599b
commit 9924ec4461
2 changed files with 13 additions and 3 deletions
+8 -2
View File
@@ -1743,10 +1743,16 @@ func TestPassthroughArgs(t *testing.T) {
[]string{"something"},
},
{
"DashDashBeforeRecognizedFlag",
"DashDashBetweenArgs",
[]string{"foo", "--", "bar"},
"",
[]string{"foo", "--", "bar"},
},
{
"DashDash",
[]string{"--", "--flag", "foobar"},
"",
[]string{"--flag", "foobar"},
[]string{"--", "--flag", "foobar"},
},
{
"UnrecognizedFlagAndArgs",