From 01ce53c87a3cba9b3225049e20751dbe886ab108 Mon Sep 17 00:00:00 2001 From: Dong Gang Date: Sat, 11 Jul 2020 15:38:54 +0800 Subject: [PATCH 1/2] fix(args): Correct `legacyArgs` logical errors Close #1156 Signed-off-by: Dong Gang --- args.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/args.go b/args.go index 70e9b262..a1299960 100644 --- a/args.go +++ b/args.go @@ -9,16 +9,15 @@ type PositionalArgs func(cmd *Command, args []string) error // Legacy arg validation has the following behaviour: // - root commands with no subcommands can take arbitrary arguments -// - root commands with subcommands will do subcommand validity checking -// - subcommands will always accept arbitrary arguments +// - commands with subcommands cannot take any arguments func legacyArgs(cmd *Command, args []string) error { // no subcommand, always take args if !cmd.HasSubCommands() { return nil } - // root command with subcommands, do subcommand checking. - if !cmd.HasParent() && len(args) > 0 { + // root command with subcommands, the args should be empty. + if cmd.HasSubCommands() && len(args) > 0 { return fmt.Errorf("unknown command %q for %q%s", args[0], cmd.CommandPath(), cmd.findSuggestions(args[0])) } return nil From f5ce8029462b7cdc899b6c53b1a1a5c95c1c7efb Mon Sep 17 00:00:00 2001 From: Dong Gang Date: Mon, 13 Jul 2020 11:34:19 +0800 Subject: [PATCH 2/2] Modify the logic of Command execute function Signed-off-by: Dong Gang --- command.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/command.go b/command.go index 5f1caccc..6fb6af8b 100644 --- a/command.go +++ b/command.go @@ -801,12 +801,6 @@ func (c *Command) execute(a []string) (err error) { } } - if !c.Runnable() { - return flag.ErrHelp - } - - c.preRun() - argWoFlags := c.Flags().Args() if c.DisableFlagParsing { argWoFlags = a @@ -816,6 +810,12 @@ func (c *Command) execute(a []string) (err error) { return err } + if !c.Runnable() { + return flag.ErrHelp + } + + c.preRun() + for p := c; p != nil; p = p.Parent() { if p.PersistentPreRunE != nil { if err := p.PersistentPreRunE(c, argWoFlags); err != nil {