Skip to content

Commit

Permalink
Fix flag completion
Browse files Browse the repository at this point in the history
The flag completion functions should be stored on their cmd struct and
not the root cmd. Using the root cmd does not work when you create the
cmd and add flags before you join this cmd struct to your parent command.

Fixes spf13#1437

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
  • Loading branch information
Luap99 committed Jul 2, 2021
1 parent 07861c8 commit c772dd8
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions completions.go
Expand Up @@ -101,14 +101,13 @@ func (c *Command) RegisterFlagCompletionFunc(flagName string, f func(cmd *Comman
return fmt.Errorf("RegisterFlagCompletionFunc: flag '%s' does not exist", flagName)
}

root := c.Root()
if _, exists := root.flagCompletionFunctions[flag]; exists {
if _, exists := c.flagCompletionFunctions[flag]; exists {
return fmt.Errorf("RegisterFlagCompletionFunc: flag '%s' already registered", flagName)
}
if root.flagCompletionFunctions == nil {
root.flagCompletionFunctions = map[*pflag.Flag]func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective){}
if c.flagCompletionFunctions == nil {
c.flagCompletionFunctions = map[*pflag.Flag]func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective){}
}
root.flagCompletionFunctions[flag] = f
c.flagCompletionFunctions[flag] = f
return nil
}

Expand Down Expand Up @@ -402,7 +401,7 @@ func (c *Command) getCompletions(args []string) (*Command, []string, ShellCompDi
// Find the completion function for the flag or command
var completionFn func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective)
if flag != nil && flagCompletion {
completionFn = c.Root().flagCompletionFunctions[flag]
completionFn = finalCmd.flagCompletionFunctions[flag]
} else {
completionFn = finalCmd.ValidArgsFunction
}
Expand Down

0 comments on commit c772dd8

Please sign in to comment.