This commit is contained in:
Holder 2022-09-28 11:00:20 +09:00 committed by GitHub
commit 9d52fd05e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 10 deletions

View file

@ -23,16 +23,15 @@ type PositionalArgs func(cmd *Command, args []string) error
// Legacy arg validation has the following behaviour: // Legacy arg validation has the following behaviour:
// - root commands with no subcommands can take arbitrary arguments // - root commands with no subcommands can take arbitrary arguments
// - root commands with subcommands will do subcommand validity checking // - commands with subcommands cannot take any arguments
// - subcommands will always accept arbitrary arguments
func legacyArgs(cmd *Command, args []string) error { func legacyArgs(cmd *Command, args []string) error {
// no subcommand, always take args // no subcommand, always take args
if !cmd.HasSubCommands() { if !cmd.HasSubCommands() {
return nil return nil
} }
// root command with subcommands, do subcommand checking. // root command with subcommands, the args should be empty.
if !cmd.HasParent() && len(args) > 0 { if cmd.HasSubCommands() && len(args) > 0 {
return fmt.Errorf("unknown command %q for %q%s", args[0], cmd.CommandPath(), cmd.findSuggestions(args[0])) return fmt.Errorf("unknown command %q for %q%s", args[0], cmd.CommandPath(), cmd.findSuggestions(args[0]))
} }
return nil return nil

View file

@ -828,12 +828,6 @@ func (c *Command) execute(a []string) (err error) {
} }
} }
if !c.Runnable() {
return flag.ErrHelp
}
c.preRun()
argWoFlags := c.Flags().Args() argWoFlags := c.Flags().Args()
if c.DisableFlagParsing { if c.DisableFlagParsing {
argWoFlags = a argWoFlags = a
@ -843,6 +837,12 @@ func (c *Command) execute(a []string) (err error) {
return err return err
} }
if !c.Runnable() {
return flag.ErrHelp
}
c.preRun()
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 {