Merge pull request #313 from euank/swift-as-a-cobra-hidden-as-a-ninja
Display neither hidden nor deprecated flags in bash completion
This commit is contained in:
		@ -421,6 +421,9 @@ func writeFlags(cmd *Command, w io.Writer) error {
 | 
				
			|||||||
	localNonPersistentFlags := cmd.LocalNonPersistentFlags()
 | 
						localNonPersistentFlags := cmd.LocalNonPersistentFlags()
 | 
				
			||||||
	var visitErr error
 | 
						var visitErr error
 | 
				
			||||||
	cmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) {
 | 
						cmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) {
 | 
				
			||||||
 | 
							if nonCompletableFlag(flag) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if err := writeFlag(flag, w); err != nil {
 | 
							if err := writeFlag(flag, w); err != nil {
 | 
				
			||||||
			visitErr = err
 | 
								visitErr = err
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
@ -442,6 +445,9 @@ func writeFlags(cmd *Command, w io.Writer) error {
 | 
				
			|||||||
		return visitErr
 | 
							return visitErr
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) {
 | 
						cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) {
 | 
				
			||||||
 | 
							if nonCompletableFlag(flag) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if err := writeFlag(flag, w); err != nil {
 | 
							if err := writeFlag(flag, w); err != nil {
 | 
				
			||||||
			visitErr = err
 | 
								visitErr = err
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
@ -468,6 +474,9 @@ func writeRequiredFlag(cmd *Command, w io.Writer) error {
 | 
				
			|||||||
	flags := cmd.NonInheritedFlags()
 | 
						flags := cmd.NonInheritedFlags()
 | 
				
			||||||
	var visitErr error
 | 
						var visitErr error
 | 
				
			||||||
	flags.VisitAll(func(flag *pflag.Flag) {
 | 
						flags.VisitAll(func(flag *pflag.Flag) {
 | 
				
			||||||
 | 
							if nonCompletableFlag(flag) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		for key := range flag.Annotations {
 | 
							for key := range flag.Annotations {
 | 
				
			||||||
			switch key {
 | 
								switch key {
 | 
				
			||||||
			case BashCompOneRequiredFlag:
 | 
								case BashCompOneRequiredFlag:
 | 
				
			||||||
@ -574,6 +583,10 @@ func (cmd *Command) GenBashCompletion(w io.Writer) error {
 | 
				
			|||||||
	return postscript(w, cmd.Name())
 | 
						return postscript(w, cmd.Name())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func nonCompletableFlag(flag *pflag.Flag) bool {
 | 
				
			||||||
 | 
						return flag.Hidden || len(flag.Deprecated) > 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (cmd *Command) GenBashCompletionFile(filename string) error {
 | 
					func (cmd *Command) GenBashCompletionFile(filename string) error {
 | 
				
			||||||
	outFile, err := os.Create(filename)
 | 
						outFile, err := os.Create(filename)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 | 
				
			|||||||
@ -138,3 +138,43 @@ func TestBashCompletions(t *testing.T) {
 | 
				
			|||||||
		t.Fatalf("shellcheck failed: %v", err)
 | 
							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)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestBashCompletionDeprecatedFlag(t *testing.T) {
 | 
				
			||||||
 | 
						var cmdTrue = &Command{
 | 
				
			||||||
 | 
							Use: "does nothing",
 | 
				
			||||||
 | 
							Run: func(cmd *Command, args []string) {},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const flagName = "deprecated-foo-bar-baz"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var flagValue bool
 | 
				
			||||||
 | 
						cmdTrue.Flags().BoolVar(&flagValue, flagName, false, "hidden flag")
 | 
				
			||||||
 | 
						cmdTrue.Flags().MarkDeprecated(flagName, "use --does-not-exist instead")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out := new(bytes.Buffer)
 | 
				
			||||||
 | 
						cmdTrue.GenBashCompletion(out)
 | 
				
			||||||
 | 
						bashCompletion := out.String()
 | 
				
			||||||
 | 
						if strings.Contains(bashCompletion, flagName) {
 | 
				
			||||||
 | 
							t.Errorf("expected completion to not include %q flag: Got %v", flagName, bashCompletion)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user