Fix incorrect merge of pflag.CommandLine to cmd.Flags()

Fix #443
This commit is contained in:
Albert Nigmatzianov 2017-05-12 20:22:26 +02:00
parent 3454e0e28e
commit 7d22e77cce
3 changed files with 24 additions and 8 deletions

View file

@ -1150,12 +1150,12 @@ func TestGlobalNormFuncPropagation(t *testing.T) {
func TestFlagOnPflagCommandLine(t *testing.T) { func TestFlagOnPflagCommandLine(t *testing.T) {
flagName := "flagOnCommandLine" flagName := "flagOnCommandLine"
pflag.CommandLine.String(flagName, "", "about my flag") pflag.String(flagName, "", "about my flag")
r := fullSetupTest("--help") r := fullSetupTest("--help")
checkResultContains(t, r, flagName) checkResultContains(t, r, flagName)
// reset CommandLine flagset // Reset pflag.CommandLine flagset.
pflag.CommandLine = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError) pflag.CommandLine = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError)
} }

View file

@ -1275,8 +1275,8 @@ func (c *Command) Parent() *Command {
// mergePersistentFlags merges c.PersistentFlags() to c.Flags() // mergePersistentFlags merges c.PersistentFlags() to c.Flags()
// and adds missing persistent flags of all parents. // and adds missing persistent flags of all parents.
func (c *Command) mergePersistentFlags() { func (c *Command) mergePersistentFlags() {
c.Flags().AddFlagSet(c.PersistentFlags())
c.updateParentsPflags() c.updateParentsPflags()
c.Flags().AddFlagSet(c.PersistentFlags())
c.Flags().AddFlagSet(c.parentsPflags) c.Flags().AddFlagSet(c.parentsPflags)
} }

View file

@ -227,7 +227,7 @@ func TestFlagErrorFunc(t *testing.T) {
// TestSortedFlags checks, // TestSortedFlags checks,
// if cmd.LocalFlags() is unsorted when cmd.Flags().SortFlags set to false. // if cmd.LocalFlags() is unsorted when cmd.Flags().SortFlags set to false.
// https://github.com/spf13/cobra/issues/404 // Related to https://github.com/spf13/cobra/issues/404.
func TestSortedFlags(t *testing.T) { func TestSortedFlags(t *testing.T) {
cmd := &Command{} cmd := &Command{}
cmd.Flags().SortFlags = false cmd.Flags().SortFlags = false
@ -263,13 +263,13 @@ func isStringInStringSlice(s string, ss []string) bool {
// TestHelpFlagInHelp checks, // TestHelpFlagInHelp checks,
// if '--help' flag is shown in help for child (executing `parent help child`), // if '--help' flag is shown in help for child (executing `parent help child`),
// that has no other flags. // that has no other flags.
// https://github.com/spf13/cobra/issues/302 // Related to https://github.com/spf13/cobra/issues/302.
func TestHelpFlagInHelp(t *testing.T) { func TestHelpFlagInHelp(t *testing.T) {
output := new(bytes.Buffer) output := new(bytes.Buffer)
parent := &Command{Use: "parent", Long: "long", Run: func(*Command, []string) { return }} parent := &Command{Use: "parent", Run: func(*Command, []string) {}}
parent.SetOutput(output) parent.SetOutput(output)
child := &Command{Use: "child", Long: "long", Run: func(*Command, []string) { return }} child := &Command{Use: "child", Run: func(*Command, []string) {}}
parent.AddCommand(child) parent.AddCommand(child)
parent.SetArgs([]string{"help", "child"}) parent.SetArgs([]string{"help", "child"})
@ -279,6 +279,22 @@ func TestHelpFlagInHelp(t *testing.T) {
} }
if !strings.Contains(output.String(), "[flags]") { if !strings.Contains(output.String(), "[flags]") {
t.Fatalf("\nExpecting to contain: %v\nGot: %v", "[flags]", output.String()) t.Errorf("\nExpecting to contain: %v\nGot: %v", "[flags]", output.String())
} }
} }
// TestMergeCommandLineToFlags checks,
// if pflag.CommandLine is correctly merged to c.Flags() after first call
// of c.mergePersistentFlags.
// Related to https://github.com/spf13/cobra/issues/443.
func TestMergeCommandLineToFlags(t *testing.T) {
pflag.Bool("boolflag", false, "")
c := &Command{Use: "c", Run: func(*Command, []string) {}}
c.mergePersistentFlags()
if c.Flags().Lookup("boolflag") == nil {
t.Fatal("Expecting to have flag from CommandLine in c.Flags()")
}
// Reset pflag.CommandLine flagset.
pflag.CommandLine = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError)
}