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 (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
@ -990,7 +991,7 @@ func (c *Command) ExecuteC() (cmd *Command, err error) {
 | 
				
			|||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		// Always show help if requested, even if SilenceErrors is in
 | 
							// Always show help if requested, even if SilenceErrors is in
 | 
				
			||||||
		// effect
 | 
							// effect
 | 
				
			||||||
		if err == flag.ErrHelp {
 | 
							if errors.Is(err, flag.ErrHelp) {
 | 
				
			||||||
			cmd.HelpFunc()(cmd, args)
 | 
								cmd.HelpFunc()(cmd, args)
 | 
				
			||||||
			return cmd, nil
 | 
								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,
 | 
					// 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.
 | 
				
			||||||
// Related to https://github.com/spf13/cobra/issues/404.
 | 
					// Related to https://github.com/spf13/cobra/issues/404.
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user