Merge pull request #169 from apriendeau/silence-errors
[silence-errors]: adds a way for errors to silenced down the stack
This commit is contained in:
		@ -217,6 +217,13 @@ func fullSetupTest(input string) resulter {
 | 
			
		||||
	return fullTester(c, input)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func noRRSetupTestSilenced(input string) resulter {
 | 
			
		||||
	c := initialize()
 | 
			
		||||
	c.SilenceErrors = true
 | 
			
		||||
	c.SilenceUsage = true
 | 
			
		||||
	return fullTester(c, input)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func noRRSetupTest(input string) resulter {
 | 
			
		||||
	c := initialize()
 | 
			
		||||
 | 
			
		||||
@ -488,8 +495,8 @@ func TestChildCommandFlags(t *testing.T) {
 | 
			
		||||
		t.Errorf("invalid flag should generate error")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !strings.Contains(r.Output, "unknown shorthand") {
 | 
			
		||||
		t.Errorf("Wrong error message displayed, \n %s", r.Output)
 | 
			
		||||
	if !strings.Contains(r.Error.Error(), "unknown shorthand") {
 | 
			
		||||
		t.Errorf("Wrong error message displayed, \n %s", r.Error)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if flagi2 != 99 {
 | 
			
		||||
@ -506,9 +513,8 @@ func TestChildCommandFlags(t *testing.T) {
 | 
			
		||||
	if r.Error == nil {
 | 
			
		||||
		t.Errorf("invalid flag should generate error")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !strings.Contains(r.Output, "unknown shorthand flag") {
 | 
			
		||||
		t.Errorf("Wrong error message displayed, \n %s", r.Output)
 | 
			
		||||
	if !strings.Contains(r.Error.Error(), "unknown shorthand flag") {
 | 
			
		||||
		t.Errorf("Wrong error message displayed, \n %s", r.Error)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Testing with persistent flag overwritten by child
 | 
			
		||||
@ -528,9 +534,8 @@ func TestChildCommandFlags(t *testing.T) {
 | 
			
		||||
	if r.Error == nil {
 | 
			
		||||
		t.Errorf("invalid input should generate error")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !strings.Contains(r.Output, "invalid argument \"10E\" for i10E") {
 | 
			
		||||
		t.Errorf("Wrong error message displayed, \n %s", r.Output)
 | 
			
		||||
	if !strings.Contains(r.Error.Error(), "invalid argument \"10E\" for i10E") {
 | 
			
		||||
		t.Errorf("Wrong error message displayed, \n %s", r.Error)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -547,10 +552,10 @@ func TestInvalidSubcommandFlags(t *testing.T) {
 | 
			
		||||
	cmd.AddCommand(cmdTimes)
 | 
			
		||||
 | 
			
		||||
	result := simpleTester(cmd, "times --inttwo=2 --badflag=bar")
 | 
			
		||||
 | 
			
		||||
	checkResultContains(t, result, "unknown flag: --badflag")
 | 
			
		||||
 | 
			
		||||
	if strings.Contains(result.Output, "unknown flag: --inttwo") {
 | 
			
		||||
	// given that we are not checking here result.Error we check for
 | 
			
		||||
	// stock usage message
 | 
			
		||||
	checkResultContains(t, result, "cobra-test times [# times]")
 | 
			
		||||
	if strings.Contains(result.Error.Error(), "unknown flag: --inttwo") {
 | 
			
		||||
		t.Errorf("invalid --badflag flag shouldn't fail on 'unknown' --inttwo flag")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -809,6 +814,20 @@ func TestRootUnknownCommand(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRootUnknownCommandSilenced(t *testing.T) {
 | 
			
		||||
	r := noRRSetupTestSilenced("bogus")
 | 
			
		||||
	s := "Run 'cobra-test --help' for usage.\n"
 | 
			
		||||
 | 
			
		||||
	if r.Output != "" {
 | 
			
		||||
		t.Errorf("Unexpected response.\nExpecting to be: \n\"\"\n Got:\n %q\n", s, r.Output)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	r = noRRSetupTestSilenced("--strtwo=a bogus")
 | 
			
		||||
	if r.Output != "" {
 | 
			
		||||
		t.Errorf("Unexpected response.\nExpecting to be:\n\"\"\nGot:\n %q\n", s, r.Output)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRootSuggestions(t *testing.T) {
 | 
			
		||||
	outputWithSuggestions := "Error: unknown command \"%s\" for \"cobra-test\"\n\nDid you mean this?\n\t%s\n\nRun 'cobra-test --help' for usage.\n"
 | 
			
		||||
	outputWithoutSuggestions := "Error: unknown command \"%s\" for \"cobra-test\"\nRun 'cobra-test --help' for usage.\n"
 | 
			
		||||
@ -872,8 +891,8 @@ func TestFlagsBeforeCommand(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// With parsing error properly reported
 | 
			
		||||
	x = fullSetupTest("-i10E echo")
 | 
			
		||||
	if !strings.Contains(x.Output, "invalid argument \"10E\" for i10E") {
 | 
			
		||||
		t.Errorf("Wrong error message displayed, \n %s", x.Output)
 | 
			
		||||
	if !strings.Contains(x.Error.Error(), "invalid argument \"10E\" for i10E") {
 | 
			
		||||
		t.Errorf("Wrong error message displayed, \n %s", x.Error)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//With quotes
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								command.go
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								command.go
									
									
									
									
									
								
							@ -61,6 +61,10 @@ type Command struct {
 | 
			
		||||
	pflags *flag.FlagSet
 | 
			
		||||
	// Flags that are declared specifically by this command (not inherited).
 | 
			
		||||
	lflags *flag.FlagSet
 | 
			
		||||
	// SilenceErrors is an option to quiet errors down stream
 | 
			
		||||
	SilenceErrors bool
 | 
			
		||||
	// Silence Usage is an option to silence usage when an error occurs.
 | 
			
		||||
	SilenceUsage bool
 | 
			
		||||
	// The *Run functions are executed in the following order:
 | 
			
		||||
	//   * PersistentPreRun()
 | 
			
		||||
	//   * PreRun()
 | 
			
		||||
@ -626,21 +630,31 @@ func (c *Command) Execute() (err error) {
 | 
			
		||||
		if cmd != nil {
 | 
			
		||||
			c = cmd
 | 
			
		||||
		}
 | 
			
		||||
		c.Println("Error:", err.Error())
 | 
			
		||||
		c.Printf("Run '%v --help' for usage.\n", c.CommandPath())
 | 
			
		||||
		if !c.SilenceErrors {
 | 
			
		||||
			c.Println("Error:", err.Error())
 | 
			
		||||
			c.Printf("Run '%v --help' for usage.\n", c.CommandPath())
 | 
			
		||||
		}
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = cmd.execute(flags)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if err == flag.ErrHelp {
 | 
			
		||||
			cmd.HelpFunc()(cmd, args)
 | 
			
		||||
			return nil
 | 
			
		||||
		// If root command has SilentUsage flagged,
 | 
			
		||||
		// all subcommands should respect it
 | 
			
		||||
		if !cmd.SilenceUsage && !c.SilenceUsage {
 | 
			
		||||
			c.Println(cmd.UsageString())
 | 
			
		||||
		}
 | 
			
		||||
		c.Println(cmd.UsageString())
 | 
			
		||||
		c.Println("Error:", err.Error())
 | 
			
		||||
		// If root command has SilentErrors flagged,
 | 
			
		||||
		// all subcommands should respect it
 | 
			
		||||
		if !cmd.SilenceErrors && !c.SilenceErrors {
 | 
			
		||||
			if err == flag.ErrHelp {
 | 
			
		||||
				cmd.HelpFunc()(cmd, args)
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
			c.Println("Error:", err.Error())
 | 
			
		||||
		}
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user