diff --git a/cobra_test.go b/cobra_test.go index 7b5ed623..10ac8745 100644 --- a/cobra_test.go +++ b/cobra_test.go @@ -208,6 +208,34 @@ func TestCommandAlias(t *testing.T) { } } +func TestPrefixMatching(t *testing.T) { + noRRSetupTest("ech times one two") + + if te != nil || tp != nil { + t.Error("Wrong command called") + } + if tt == nil { + t.Error("Wrong command called") + } + if strings.Join(tt, " ") != "one two" { + t.Error("Command didn't parse correctly") + } +} + +func TestAliasPrefixMatching(t *testing.T) { + noRRSetupTest("sa times one two") + + if te != nil || tp != nil { + t.Error("Wrong command called") + } + if tt == nil { + t.Error("Wrong command called") + } + if strings.Join(tt, " ") != "one two" { + t.Error("Command didn't parse correctly") + } +} + func TestChildSameName(t *testing.T) { c := initializeWithSameName() c.AddCommand(cmdPrint, cmdEcho) diff --git a/command.go b/command.go index d2914378..161ed806 100644 --- a/command.go +++ b/command.go @@ -286,11 +286,26 @@ func (c *Command) Find(arrs []string) (*Command, []string, error) { if len(args) > 0 && c.HasSubCommands() { argsWOflags := stripFlags(args) if len(argsWOflags) > 0 { + matches := make([]*Command, 0) for _, cmd := range c.commands { if cmd.Name() == argsWOflags[0] || cmd.HasAlias(argsWOflags[0]) { // exact name or alias match return innerfind(cmd, argsMinusX(args, argsWOflags[0])) + } else { + if strings.HasPrefix(cmd.Name(), argsWOflags[0]) { // prefix match + matches = append(matches, cmd) + } + for _, x := range cmd.Aliases { + if strings.HasPrefix(x, argsWOflags[0]) { + matches = append(matches, cmd) + } + } } } + + // only accept a single prefix match - multiple matches would be ambiguous + if len(matches) == 1 { + return innerfind(matches[0], argsMinusX(args, argsWOflags[0])) + } } }