Skip to content

Commit 9924ec4

Browse files
authored
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:""`.
1 parent 4ecb535 commit 9924ec4

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

context.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -383,9 +383,13 @@ func (c *Context) trace(node *Node) (err error) { //nolint: gocyclo
383383

384384
// Indicates end of parsing. All remaining arguments are treated as positional arguments only.
385385
case v == "--":
386-
c.scan.Pop()
387386
c.endParsing()
388387

388+
// Pop the -- token unless the next positional argument accepts passthrough arguments.
389+
if !(positional < len(node.Positional) && node.Positional[positional].Passthrough) {
390+
c.scan.Pop()
391+
}
392+
389393
// Long flag.
390394
case strings.HasPrefix(v, "--"):
391395
c.scan.Pop()

kong_test.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -1743,10 +1743,16 @@ func TestPassthroughArgs(t *testing.T) {
17431743
[]string{"something"},
17441744
},
17451745
{
1746-
"DashDashBeforeRecognizedFlag",
1746+
"DashDashBetweenArgs",
1747+
[]string{"foo", "--", "bar"},
1748+
"",
1749+
[]string{"foo", "--", "bar"},
1750+
},
1751+
{
1752+
"DashDash",
17471753
[]string{"--", "--flag", "foobar"},
17481754
"",
1749-
[]string{"--flag", "foobar"},
1755+
[]string{"--", "--flag", "foobar"},
17501756
},
17511757
{
17521758
"UnrecognizedFlagAndArgs",

0 commit comments

Comments
 (0)