diff --git a/cobra_test.go b/cobra_test.go index b23ac2fd..fb4a7c4d 100644 --- a/cobra_test.go +++ b/cobra_test.go @@ -47,6 +47,12 @@ var cmdRootNoRun = &Command{ Long: "The root description for help", } +var cmdRootSameName = &Command{ + Use: "print", + Short: "Root with the same name as a subcommand", + Long: "The root description for help", +} + var cmdRootWithRun = &Command{ Use: "cobra-test", Short: "The root can run it's own function", @@ -65,6 +71,7 @@ func flagInit() { cmdPrint.ResetFlags() cmdTimes.ResetFlags() cmdRootNoRun.ResetFlags() + cmdRootSameName.ResetFlags() cmdRootWithRun.ResetFlags() cmdEcho.Flags().IntVarP(&flagi1, "intone", "i", 123, "help message for flag intone") cmdTimes.Flags().IntVarP(&flagi2, "inttwo", "j", 234, "help message for flag inttwo") @@ -82,6 +89,7 @@ func commandInit() { cmdPrint.ResetCommands() cmdTimes.ResetCommands() cmdRootNoRun.ResetCommands() + cmdRootSameName.ResetCommands() cmdRootWithRun.ResetCommands() } @@ -93,6 +101,14 @@ func initialize() *Command { return c } +func initializeWithSameName() *Command { + tt, tp, te = nil, nil, nil + var c = cmdRootSameName + flagInit() + commandInit() + return c +} + func initializeWithRootCmd() *Command { cmdRootWithRun.ResetCommands() tt, tp, te, rootcalled = nil, nil, nil, false @@ -156,6 +172,40 @@ func TestChildCommandPrefix(t *testing.T) { } } +func TestChildSameName(t *testing.T) { + c := initializeWithSameName() + c.AddCommand(cmdPrint, cmdEcho) + c.SetArgs(strings.Split("print one two", " ")) + c.Execute() + + if te != nil || tt != nil { + t.Error("Wrong command called") + } + if tp == nil { + t.Error("Wrong command called") + } + if strings.Join(tp, " ") != "one two" { + t.Error("Command didn't parse correctly") + } +} + +func TestChildSameNamePrefix(t *testing.T) { + c := initializeWithSameName() + c.AddCommand(cmdPrint, cmdEcho) + c.SetArgs(strings.Split("pr one two", " ")) + c.Execute() + + if te != nil || tt != nil { + t.Error("Wrong command called") + } + if tp == nil { + t.Error("Wrong command called") + } + if strings.Join(tp, " ") != "one two" { + t.Error("Command didn't parse correctly") + } +} + func TestFlagLong(t *testing.T) { c := initialize() c.AddCommand(cmdPrint, cmdEcho, cmdTimes) diff --git a/command.go b/command.go index 61f2104a..663681a8 100644 --- a/command.go +++ b/command.go @@ -260,7 +260,7 @@ func (c *Command) Find(arrs []string) (*Command, []string, error) { commandFound, a := innerfind(c, arrs) // if commander returned and not appropriately matched return nil & error - if commandFound.Name() == c.Name() && commandFound.Name() != arrs[0] { + if commandFound.Name() == c.Name() && !strings.HasPrefix(commandFound.Name(), arrs[0]) { return nil, a, fmt.Errorf("unknown command %q\nRun 'help' for usage.\n", a[0]) }