diff --git a/command.go b/command.go index a3e96e8e..d90cf7f3 100644 --- a/command.go +++ b/command.go @@ -479,8 +479,8 @@ func argsMinusFirstX(args []string, x string) []string { } func isFlagArg(arg string) bool { - return ((len(arg) >= 3 && arg[0] == '-') || - (len(arg) >= 2 && arg[1] == '-' && arg[1] != '-')) + return ((len(arg) >= 3 && arg[1] == '-') || + (len(arg) >= 2 && arg[0] == '-' && arg[1] != '-')) } // Find the target command given the args and command tree @@ -551,19 +551,23 @@ func (c *Command) Traverse(args []string) (*Command, []string, error) { for i, arg := range args { switch { + // A long flag with a space separated value case strings.HasPrefix(arg, "--") && !strings.Contains(arg, "="): // TODO: this isn't quite right, we should really check ahead for 'true' or 'false' inFlag = !hasNoOptDefVal(arg[2:], c.Flags()) flags = append(flags, arg) continue + // A short flag with a space separated value case strings.HasPrefix(arg, "-") && !strings.Contains(arg, "=") && len(arg) == 2 && !shortHasNoOptDefVal(arg[1:], c.Flags()): inFlag = true flags = append(flags, arg) continue + // The value for a flag case inFlag: inFlag = false flags = append(flags, arg) continue + // A flag without a value, or with an `=` separated value case isFlagArg(arg): flags = append(flags, arg) continue diff --git a/command_test.go b/command_test.go index c086caaa..938a7417 100644 --- a/command_test.go +++ b/command_test.go @@ -350,16 +350,17 @@ func TestSetHelpCommand(t *testing.T) { func TestTraverseWithParentFlags(t *testing.T) { cmd := &Command{ - Use: "do", + Use: "do", TraverseChildren: true, } cmd.Flags().String("foo", "", "foo things") + cmd.Flags().BoolP("goo", "g", false, "foo things") sub := &Command{Use: "next"} sub.Flags().String("add", "", "add things") cmd.AddCommand(sub) - c, args, err := cmd.Traverse([]string{"--foo", "ok", "next", "--add"}) + c, args, err := cmd.Traverse([]string{"-g", "--foo", "ok", "next", "--add"}) if err != nil { t.Fatalf("Expected no error: %s", err) } @@ -373,7 +374,7 @@ func TestTraverseWithParentFlags(t *testing.T) { func TestTraverseNoParentFlags(t *testing.T) { cmd := &Command{ - Use: "do", + Use: "do", TraverseChildren: true, } cmd.Flags().String("foo", "", "foo things") @@ -396,7 +397,7 @@ func TestTraverseNoParentFlags(t *testing.T) { func TestTraverseWithBadParentFlags(t *testing.T) { cmd := &Command{ - Use: "do", + Use: "do", TraverseChildren: true, } sub := &Command{Use: "next"} @@ -416,7 +417,7 @@ func TestTraverseWithBadParentFlags(t *testing.T) { func TestTraverseWithBadChildFlag(t *testing.T) { cmd := &Command{ - Use: "do", + Use: "do", TraverseChildren: true, } cmd.Flags().String("foo", "", "foo things")