From 99b5d838ca16c25cc4944e323684f8415e8b10ba Mon Sep 17 00:00:00 2001 From: Albert Nigmatzianov Date: Tue, 13 Jun 2017 10:33:50 +0200 Subject: [PATCH] Show messages if deprecated flags are used Fix #463 --- command.go | 13 ++++++++++--- command_test.go | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/command.go b/command.go index e85bf51..2cd6ee8 100644 --- a/command.go +++ b/command.go @@ -1249,13 +1249,20 @@ func (c *Command) persistentFlag(name string) (flag *flag.Flag) { } // ParseFlags parses persistent flag tree and local flags. -func (c *Command) ParseFlags(args []string) (err error) { +func (c *Command) ParseFlags(args []string) error { if c.DisableFlagParsing { return nil } + + beforeErrorBufLen := c.flagErrorBuf.Len() c.mergePersistentFlags() - err = c.Flags().Parse(args) - return + err := c.Flags().Parse(args) + // Print warnings if they occurred (e.g. deprecated flag messages). + if c.flagErrorBuf.Len()-beforeErrorBufLen > 0 && err == nil { + c.Print(c.flagErrorBuf.String()) + } + + return err } // Parent returns a commands parent command. diff --git a/command_test.go b/command_test.go index 978bacc..f4fe146 100644 --- a/command_test.go +++ b/command_test.go @@ -298,3 +298,23 @@ func TestMergeCommandLineToFlags(t *testing.T) { // Reset pflag.CommandLine flagset. pflag.CommandLine = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError) } + +// TestUseDeprecatedFlags checks, +// if cobra.Execute() prints a message, if a deprecated flag is used. +// Related to https://github.com/spf13/cobra/issues/463. +func TestUseDeprecatedFlags(t *testing.T) { + c := &Command{Use: "c", Run: func(*Command, []string) {}} + output := new(bytes.Buffer) + c.SetOutput(output) + c.Flags().BoolP("deprecated", "d", false, "deprecated flag") + c.Flags().MarkDeprecated("deprecated", "This flag is deprecated") + + c.SetArgs([]string{"c", "-d"}) + if err := c.Execute(); err != nil { + t.Error("Unexpected error:", err) + } + if !strings.Contains(output.String(), "This flag is deprecated") { + t.Errorf("Expected to contain deprecated message, but got %q", output.String()) + } + +}