Skip to content

Commit 7c674d9

Browse files
authored
Merge pull request #313 from euank/swift-as-a-cobra-hidden-as-a-ninja
Display neither hidden nor deprecated flags in bash completion
2 parents f62e98d + 40e19b3 commit 7c674d9

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

bash_completions.go

+13
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,9 @@ func writeFlags(cmd *Command, w io.Writer) error {
421421
localNonPersistentFlags := cmd.LocalNonPersistentFlags()
422422
var visitErr error
423423
cmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) {
424+
if nonCompletableFlag(flag) {
425+
return
426+
}
424427
if err := writeFlag(flag, w); err != nil {
425428
visitErr = err
426429
return
@@ -442,6 +445,9 @@ func writeFlags(cmd *Command, w io.Writer) error {
442445
return visitErr
443446
}
444447
cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) {
448+
if nonCompletableFlag(flag) {
449+
return
450+
}
445451
if err := writeFlag(flag, w); err != nil {
446452
visitErr = err
447453
return
@@ -468,6 +474,9 @@ func writeRequiredFlag(cmd *Command, w io.Writer) error {
468474
flags := cmd.NonInheritedFlags()
469475
var visitErr error
470476
flags.VisitAll(func(flag *pflag.Flag) {
477+
if nonCompletableFlag(flag) {
478+
return
479+
}
471480
for key := range flag.Annotations {
472481
switch key {
473482
case BashCompOneRequiredFlag:
@@ -574,6 +583,10 @@ func (cmd *Command) GenBashCompletion(w io.Writer) error {
574583
return postscript(w, cmd.Name())
575584
}
576585

586+
func nonCompletableFlag(flag *pflag.Flag) bool {
587+
return flag.Hidden || len(flag.Deprecated) > 0
588+
}
589+
577590
func (cmd *Command) GenBashCompletionFile(filename string) error {
578591
outFile, err := os.Create(filename)
579592
if err != nil {

bash_completions_test.go

+40
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,43 @@ func TestBashCompletions(t *testing.T) {
138138
t.Fatalf("shellcheck failed: %v", err)
139139
}
140140
}
141+
142+
func TestBashCompletionHiddenFlag(t *testing.T) {
143+
var cmdTrue = &Command{
144+
Use: "does nothing",
145+
Run: func(cmd *Command, args []string) {},
146+
}
147+
148+
const flagName = "hidden-foo-bar-baz"
149+
150+
var flagValue bool
151+
cmdTrue.Flags().BoolVar(&flagValue, flagName, false, "hidden flag")
152+
cmdTrue.Flags().MarkHidden(flagName)
153+
154+
out := new(bytes.Buffer)
155+
cmdTrue.GenBashCompletion(out)
156+
bashCompletion := out.String()
157+
if strings.Contains(bashCompletion, flagName) {
158+
t.Error("expected completion to not include %q flag: Got %v", flagName, bashCompletion)
159+
}
160+
}
161+
162+
func TestBashCompletionDeprecatedFlag(t *testing.T) {
163+
var cmdTrue = &Command{
164+
Use: "does nothing",
165+
Run: func(cmd *Command, args []string) {},
166+
}
167+
168+
const flagName = "deprecated-foo-bar-baz"
169+
170+
var flagValue bool
171+
cmdTrue.Flags().BoolVar(&flagValue, flagName, false, "hidden flag")
172+
cmdTrue.Flags().MarkDeprecated(flagName, "use --does-not-exist instead")
173+
174+
out := new(bytes.Buffer)
175+
cmdTrue.GenBashCompletion(out)
176+
bashCompletion := out.String()
177+
if strings.Contains(bashCompletion, flagName) {
178+
t.Errorf("expected completion to not include %q flag: Got %v", flagName, bashCompletion)
179+
}
180+
}

0 commit comments

Comments
 (0)