diff --git a/bash_completions.go b/bash_completions.go index 236dee67..3b01324c 100644 --- a/bash_completions.go +++ b/bash_completions.go @@ -421,6 +421,9 @@ func writeFlags(cmd *Command, w io.Writer) error { localNonPersistentFlags := cmd.LocalNonPersistentFlags() var visitErr error cmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) { + if flag.Hidden { + return + } if err := writeFlag(flag, w); err != nil { visitErr = err return @@ -442,6 +445,9 @@ func writeFlags(cmd *Command, w io.Writer) error { return visitErr } cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) { + if flag.Hidden { + return + } if err := writeFlag(flag, w); err != nil { visitErr = err return @@ -468,6 +474,9 @@ func writeRequiredFlag(cmd *Command, w io.Writer) error { flags := cmd.NonInheritedFlags() var visitErr error flags.VisitAll(func(flag *pflag.Flag) { + if flag.Hidden { + return + } for key := range flag.Annotations { switch key { case BashCompOneRequiredFlag: diff --git a/bash_completions_test.go b/bash_completions_test.go index 6957f8bd..be0d2095 100644 --- a/bash_completions_test.go +++ b/bash_completions_test.go @@ -138,3 +138,23 @@ func TestBashCompletions(t *testing.T) { t.Fatalf("shellcheck failed: %v", err) } } + +func TestBashCompletionHiddenFlag(t *testing.T) { + var cmdTrue = &Command{ + Use: "does nothing", + Run: func(cmd *Command, args []string) {}, + } + + const flagName = "hidden-foo-bar-baz" + + var flagValue bool + cmdTrue.Flags().BoolVar(&flagValue, flagName, false, "hidden flag") + cmdTrue.Flags().MarkHidden(flagName) + + out := new(bytes.Buffer) + cmdTrue.GenBashCompletion(out) + bashCompletion := out.String() + if strings.Contains(bashCompletion, flagName) { + t.Error("expected completion to not include %q flag: Got %v", flagName, bashCompletion) + } +}