From 6dcf2e3c36f6a1da8fb12739bebd428e70ec8aff Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Sun, 2 Jun 2024 14:11:46 -0400 Subject: [PATCH 1/3] Fix:(issue_1916) Add additional check for -- --- command.go | 4 ++++ completion_test.go | 8 ++++++++ help.go | 5 +++++ parse.go | 2 +- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/command.go b/command.go index 04b3474cb4..6d14d0f385 100644 --- a/command.go +++ b/command.go @@ -151,6 +151,8 @@ type Command struct { didSetupDefaults bool // whether in shell completion mode shellCompletion bool + // run args + runArgs []string } // FullName returns the full name of the command. @@ -184,6 +186,8 @@ func (cmd *Command) setupDefaults(osArgs []string) { cmd.didSetupDefaults = true + cmd.runArgs = osArgs + isRoot := cmd.parent == nil tracef("isRoot? %[1]v (cmd=%[2]q)", isRoot, cmd.Name) diff --git a/completion_test.go b/completion_test.go index b0248169c0..570d59efdb 100644 --- a/completion_test.go +++ b/completion_test.go @@ -96,6 +96,14 @@ func TestCompletionSubcommand(t *testing.T) { out.String(), "-g", "Expected output to contain flag %[1]q", "-g", ) + + out.Reset() + + r.NoError(cmd.Run(buildTestContext(t), []string{"foo", "bar", "xyz", "--", "--generate-shell-completion"})) + r.Containsf( + out.String(), "-g", + "Expected output to contain flag %[1]q", "-g", + ) } func TestCompletionInvalidShell(t *testing.T) { diff --git a/help.go b/help.go index 7384eb1139..ea9bc292c6 100644 --- a/help.go +++ b/help.go @@ -237,6 +237,11 @@ func DefaultCompleteWithFlags(ctx context.Context, cmd *Command) { lastArg = args[argsLen-1] } + if len(cmd.runArgs) > 1 && cmd.runArgs[len(cmd.runArgs)-1] == "-" { + tracef("using last arg from cmd.runArgs [%v]", cmd.runArgs) + lastArg = "-" + } + if strings.HasPrefix(lastArg, "-") { tracef("printing flag suggestion for flag[%v] on command %[1]q", lastArg, cmd.Name) printFlagSuggestions(lastArg, cmd.Flags, cmd.Root().Writer) diff --git a/parse.go b/parse.go index 8056343900..b84bdda266 100644 --- a/parse.go +++ b/parse.go @@ -23,7 +23,7 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComple err := set.Parse(args) if !ip.useShortOptionHandling() || err == nil { if shellComplete { - tracef("returning nil due to shellComplete=true") + tracef("returning nil due to shellComplete=true err=%v", err) return nil } From 569a891207469cec263893cc9a6af9c820c1ba70 Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Sun, 25 Aug 2024 20:16:00 -0400 Subject: [PATCH 2/3] Change test --- completion_test.go | 4 ++-- help.go | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/completion_test.go b/completion_test.go index 570d59efdb..d7738031d7 100644 --- a/completion_test.go +++ b/completion_test.go @@ -100,9 +100,9 @@ func TestCompletionSubcommand(t *testing.T) { out.Reset() r.NoError(cmd.Run(buildTestContext(t), []string{"foo", "bar", "xyz", "--", "--generate-shell-completion"})) - r.Containsf( + r.NotContainsf( out.String(), "-g", - "Expected output to contain flag %[1]q", "-g", + "Expected output to not contain flag %[1]q", "-g", ) } diff --git a/help.go b/help.go index 81fc1101fc..84c8c9a59f 100644 --- a/help.go +++ b/help.go @@ -468,6 +468,9 @@ func checkShellCompleteFlag(c *Command, arguments []string) (bool, []string) { // because after "--" only positional arguments are accepted. // https://unix.stackexchange.com/a/11382 if arg == "--" { + if lastArg == "--generate-shell-completion" { + return false, arguments[:pos-2] + } return false, arguments } } From b78bda71e3c9781de90046b08e99efc85c867888 Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Sun, 25 Aug 2024 20:17:10 -0400 Subject: [PATCH 3/3] Revert paarse.go changes --- parse.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parse.go b/parse.go index 633c269467..212be2d2f3 100644 --- a/parse.go +++ b/parse.go @@ -23,7 +23,7 @@ func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComple err := set.Parse(args) if !ip.useShortOptionHandling() || err == nil { if shellComplete { - tracef("returning nil due to shellComplete=true err=%v", err) + tracef("returning nil due to shellComplete=true") return nil }