mirror of
https://github.com/spf13/cobra
synced 2025-05-06 13:27:26 +00:00
Don't display usage on a returned error by a RunE function
Signed-off-by: Pierre-Emmanuel Jacquier <pierre-emmanuel.jacquier@epitech.eu>
This commit is contained in:
parent
a114f312e0
commit
4864275d4a
1 changed files with 43 additions and 20 deletions
63
command.go
63
command.go
|
@ -27,6 +27,24 @@ import (
|
||||||
flag "github.com/spf13/pflag"
|
flag "github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CmdErrorType command error type
|
||||||
|
type CmdErrorType int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ErrHelp is like flag.ErrHelp
|
||||||
|
ErrHelp CmdErrorType = iota
|
||||||
|
// RunError error returned during a Run function
|
||||||
|
RunError
|
||||||
|
// CommandError error during cmd execution or flag parsing
|
||||||
|
CommandError
|
||||||
|
)
|
||||||
|
|
||||||
|
// CmdError command executed error type
|
||||||
|
type CmdError struct {
|
||||||
|
error
|
||||||
|
CmdErrorType
|
||||||
|
}
|
||||||
|
|
||||||
// FParseErrWhitelist configures Flag parse errors to be ignored
|
// FParseErrWhitelist configures Flag parse errors to be ignored
|
||||||
type FParseErrWhitelist flag.ParseErrorsWhitelist
|
type FParseErrWhitelist flag.ParseErrorsWhitelist
|
||||||
|
|
||||||
|
@ -672,9 +690,9 @@ func (c *Command) ArgsLenAtDash() int {
|
||||||
return c.Flags().ArgsLenAtDash()
|
return c.Flags().ArgsLenAtDash()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Command) execute(a []string) (err error) {
|
func (c *Command) execute(a []string) *CmdError {
|
||||||
if c == nil {
|
if c == nil {
|
||||||
return fmt.Errorf("Called Execute() on a nil Command")
|
return &CmdError{fmt.Errorf("Called Execute() on a nil Command"), CommandError}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(c.Deprecated) > 0 {
|
if len(c.Deprecated) > 0 {
|
||||||
|
@ -686,9 +704,9 @@ func (c *Command) execute(a []string) (err error) {
|
||||||
c.InitDefaultHelpFlag()
|
c.InitDefaultHelpFlag()
|
||||||
c.InitDefaultVersionFlag()
|
c.InitDefaultVersionFlag()
|
||||||
|
|
||||||
err = c.ParseFlags(a)
|
err := c.ParseFlags(a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.FlagErrorFunc()(c, err)
|
return &CmdError{c.FlagErrorFunc()(c, err), CommandError}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If help is called, regardless of other flags, return we want help.
|
// If help is called, regardless of other flags, return we want help.
|
||||||
|
@ -698,11 +716,11 @@ func (c *Command) execute(a []string) (err error) {
|
||||||
// should be impossible to get here as we always declare a help
|
// should be impossible to get here as we always declare a help
|
||||||
// flag in InitDefaultHelpFlag()
|
// flag in InitDefaultHelpFlag()
|
||||||
c.Println("\"help\" flag declared as non-bool. Please correct your code")
|
c.Println("\"help\" flag declared as non-bool. Please correct your code")
|
||||||
return err
|
return &CmdError{err, CommandError}
|
||||||
}
|
}
|
||||||
|
|
||||||
if helpVal {
|
if helpVal {
|
||||||
return flag.ErrHelp
|
return &CmdError{flag.ErrHelp, ErrHelp}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for back-compat, only add version flag behavior if version is defined
|
// for back-compat, only add version flag behavior if version is defined
|
||||||
|
@ -710,19 +728,19 @@ func (c *Command) execute(a []string) (err error) {
|
||||||
versionVal, err := c.Flags().GetBool("version")
|
versionVal, err := c.Flags().GetBool("version")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.Println("\"version\" flag declared as non-bool. Please correct your code")
|
c.Println("\"version\" flag declared as non-bool. Please correct your code")
|
||||||
return err
|
return &CmdError{err, CommandError}
|
||||||
}
|
}
|
||||||
if versionVal {
|
if versionVal {
|
||||||
err := tmpl(c.OutOrStdout(), c.VersionTemplate(), c)
|
err := tmpl(c.OutOrStdout(), c.VersionTemplate(), c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.Println(err)
|
c.Println(err)
|
||||||
}
|
}
|
||||||
return err
|
return &CmdError{err, CommandError}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !c.Runnable() {
|
if !c.Runnable() {
|
||||||
return flag.ErrHelp
|
return &CmdError{flag.ErrHelp, ErrHelp}
|
||||||
}
|
}
|
||||||
|
|
||||||
c.preRun()
|
c.preRun()
|
||||||
|
@ -733,13 +751,13 @@ func (c *Command) execute(a []string) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.ValidateArgs(argWoFlags); err != nil {
|
if err := c.ValidateArgs(argWoFlags); err != nil {
|
||||||
return err
|
return &CmdError{err, CommandError}
|
||||||
}
|
}
|
||||||
|
|
||||||
for p := c; p != nil; p = p.Parent() {
|
for p := c; p != nil; p = p.Parent() {
|
||||||
if p.PersistentPreRunE != nil {
|
if p.PersistentPreRunE != nil {
|
||||||
if err := p.PersistentPreRunE(c, argWoFlags); err != nil {
|
if err := p.PersistentPreRunE(c, argWoFlags); err != nil {
|
||||||
return err
|
return &CmdError{err, RunError}
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
} else if p.PersistentPreRun != nil {
|
} else if p.PersistentPreRun != nil {
|
||||||
|
@ -749,25 +767,25 @@ func (c *Command) execute(a []string) (err error) {
|
||||||
}
|
}
|
||||||
if c.PreRunE != nil {
|
if c.PreRunE != nil {
|
||||||
if err := c.PreRunE(c, argWoFlags); err != nil {
|
if err := c.PreRunE(c, argWoFlags); err != nil {
|
||||||
return err
|
return &CmdError{err, RunError}
|
||||||
}
|
}
|
||||||
} else if c.PreRun != nil {
|
} else if c.PreRun != nil {
|
||||||
c.PreRun(c, argWoFlags)
|
c.PreRun(c, argWoFlags)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.validateRequiredFlags(); err != nil {
|
if err := c.validateRequiredFlags(); err != nil {
|
||||||
return err
|
return &CmdError{err, CommandError}
|
||||||
}
|
}
|
||||||
if c.RunE != nil {
|
if c.RunE != nil {
|
||||||
if err := c.RunE(c, argWoFlags); err != nil {
|
if err := c.RunE(c, argWoFlags); err != nil {
|
||||||
return err
|
return &CmdError{err, RunError}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
c.Run(c, argWoFlags)
|
c.Run(c, argWoFlags)
|
||||||
}
|
}
|
||||||
if c.PostRunE != nil {
|
if c.PostRunE != nil {
|
||||||
if err := c.PostRunE(c, argWoFlags); err != nil {
|
if err := c.PostRunE(c, argWoFlags); err != nil {
|
||||||
return err
|
return &CmdError{err, RunError}
|
||||||
}
|
}
|
||||||
} else if c.PostRun != nil {
|
} else if c.PostRun != nil {
|
||||||
c.PostRun(c, argWoFlags)
|
c.PostRun(c, argWoFlags)
|
||||||
|
@ -775,7 +793,7 @@ func (c *Command) execute(a []string) (err error) {
|
||||||
for p := c; p != nil; p = p.Parent() {
|
for p := c; p != nil; p = p.Parent() {
|
||||||
if p.PersistentPostRunE != nil {
|
if p.PersistentPostRunE != nil {
|
||||||
if err := p.PersistentPostRunE(c, argWoFlags); err != nil {
|
if err := p.PersistentPostRunE(c, argWoFlags); err != nil {
|
||||||
return err
|
return &CmdError{err, RunError}
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
} else if p.PersistentPostRun != nil {
|
} else if p.PersistentPostRun != nil {
|
||||||
|
@ -849,19 +867,23 @@ func (c *Command) ExecuteC() (cmd *Command, err error) {
|
||||||
cmd.commandCalledAs.name = cmd.Name()
|
cmd.commandCalledAs.name = cmd.Name()
|
||||||
}
|
}
|
||||||
|
|
||||||
err = cmd.execute(flags)
|
cmdErr := cmd.execute(flags)
|
||||||
if err != nil {
|
if cmdErr != 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 cmdErr.CmdErrorType == ErrHelp {
|
||||||
cmd.HelpFunc()(cmd, args)
|
cmd.HelpFunc()(cmd, args)
|
||||||
return cmd, nil
|
return cmd, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cmdErr.CmdErrorType == RunError {
|
||||||
|
return cmd, cmdErr
|
||||||
|
}
|
||||||
|
|
||||||
// If root command has SilentErrors flagged,
|
// If root command has SilentErrors flagged,
|
||||||
// all subcommands should respect it
|
// all subcommands should respect it
|
||||||
if !cmd.SilenceErrors && !c.SilenceErrors {
|
if !cmd.SilenceErrors && !c.SilenceErrors {
|
||||||
c.Println("Error:", err.Error())
|
c.Println("Error:", cmdErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If root command has SilentUsage flagged,
|
// If root command has SilentUsage flagged,
|
||||||
|
@ -869,6 +891,7 @@ func (c *Command) ExecuteC() (cmd *Command, err error) {
|
||||||
if !cmd.SilenceUsage && !c.SilenceUsage {
|
if !cmd.SilenceUsage && !c.SilenceUsage {
|
||||||
c.Println(cmd.UsageString())
|
c.Println(cmd.UsageString())
|
||||||
}
|
}
|
||||||
|
return cmd, cmdErr
|
||||||
}
|
}
|
||||||
return cmd, err
|
return cmd, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue