use errors.Is() to check for errors (#1730)
Since go 1.13 you can wrap errors. This make it no longer possible to compare with `==`, instead you have to compare with `errors.Is()`. I noticed this problem because -h was no longer working after I stared wrapping the errors in my custom FlagErrorFunc function. Note that this is only a problem when a custom help flag is defined. Signed-off-by: Paul Holzinger <pholzing@redhat.com>
This commit is contained in:
		@ -18,6 +18,7 @@ package cobra
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
@ -990,7 +991,7 @@ func (c *Command) ExecuteC() (cmd *Command, err error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// Always show help if requested, even if SilenceErrors is in
 | 
			
		||||
		// effect
 | 
			
		||||
		if err == flag.ErrHelp {
 | 
			
		||||
		if errors.Is(err, flag.ErrHelp) {
 | 
			
		||||
			cmd.HelpFunc()(cmd, args)
 | 
			
		||||
			return cmd, nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -1723,6 +1723,38 @@ func TestFlagErrorFunc(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestFlagErrorFuncHelp(t *testing.T) {
 | 
			
		||||
	c := &Command{Use: "c", Run: emptyRun}
 | 
			
		||||
	c.PersistentFlags().Bool("help", false, "help for c")
 | 
			
		||||
	c.SetFlagErrorFunc(func(_ *Command, err error) error {
 | 
			
		||||
		return fmt.Errorf("wrap error: %w", err)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	out, err := executeCommand(c, "--help")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("--help should not fail: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	expected := `Usage:
 | 
			
		||||
  c [flags]
 | 
			
		||||
 | 
			
		||||
Flags:
 | 
			
		||||
      --help   help for c
 | 
			
		||||
`
 | 
			
		||||
	if out != expected {
 | 
			
		||||
		t.Errorf("Expected: %v, got: %v", expected, out)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	out, err = executeCommand(c, "-h")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("-h should not fail: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if out != expected {
 | 
			
		||||
		t.Errorf("Expected: %v, got: %v", expected, out)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestSortedFlags checks,
 | 
			
		||||
// if cmd.LocalFlags() is unsorted when cmd.Flags().SortFlags set to false.
 | 
			
		||||
// Related to https://github.com/spf13/cobra/issues/404.
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user