Skip to content

Commit a2845e7

Browse files
committed
1 parent fb5077a commit a2845e7

File tree

3 files changed

+98
-28
lines changed

3 files changed

+98
-28
lines changed

cobra_test.go

+51-3
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import (
1010
var _ = fmt.Println
1111

1212
var tp, te, tt, t1 []string
13-
var flagb1, flagb2, flagb3 bool
13+
var flagb1, flagb2, flagb3, flagbr bool
1414
var flags1, flags2, flags3 string
15-
var flagi1, flagi2, flagi3 int
15+
var flagi1, flagi2, flagi3, flagir int
1616
var globalFlag1 bool
17-
var flagEcho bool
17+
var flagEcho, rootcalled bool
1818

1919
var cmdPrint = &Command{
2020
Use: "print [string to print]",
@@ -41,6 +41,15 @@ var cmdTimes = &Command{
4141
Run: timesRunner,
4242
}
4343

44+
var cmdRoot = &Command{
45+
Use: "cobra-test",
46+
Short: "The root can run it's own function",
47+
Long: "The root description for help",
48+
Run: func(cmd *Command, args []string) {
49+
rootcalled = true
50+
},
51+
}
52+
4453
func timesRunner(cmd *Command, args []string) {
4554
tt = args
4655
}
@@ -49,6 +58,7 @@ func flagInit() {
4958
cmdEcho.ResetFlags()
5059
cmdPrint.ResetFlags()
5160
cmdTimes.ResetFlags()
61+
cmdRoot.ResetFlags()
5262
cmdEcho.Flags().IntVarP(&flagi1, "intone", "i", 123, "help message for flag intone")
5363
cmdTimes.Flags().IntVarP(&flagi2, "inttwo", "j", 234, "help message for flag inttwo")
5464
cmdPrint.Flags().IntVarP(&flagi3, "intthree", "i", 345, "help message for flag intthree")
@@ -75,6 +85,17 @@ func initialize() *Commander {
7585
return c
7686
}
7787

88+
func initializeWithRootCmd() *Commander {
89+
cmdRoot.ResetCommands()
90+
tt, tp, te, rootcalled = nil, nil, nil, false
91+
cmdRoot.Flags().BoolVarP(&flagbr, "boolroot", "b", false, "help message for flag boolroot")
92+
cmdRoot.Flags().IntVarP(&flagir, "introot", "i", 321, "help message for flag intthree")
93+
var c = cmdRoot.ToCommander()
94+
flagInit()
95+
commandInit()
96+
return c
97+
}
98+
7899
func TestSingleCommand(t *testing.T) {
79100
c := initialize()
80101
c.AddCommand(cmdPrint, cmdEcho)
@@ -292,3 +313,30 @@ func TestHelpCommand(t *testing.T) {
292313
t.Errorf("Wrong error message displayed, \n %s", buf.String())
293314
}
294315
}
316+
317+
func TestCommandToCommander(t *testing.T) {
318+
c := initializeWithRootCmd()
319+
c.AddCommand(cmdPrint, cmdEcho)
320+
c.SetArgs([]string(nil))
321+
c.Execute()
322+
323+
if rootcalled != true {
324+
t.Errorf("Root Function was not called")
325+
}
326+
}
327+
328+
func TestRootFlags(t *testing.T) {
329+
c := initializeWithRootCmd()
330+
c.AddCommand(cmdPrint, cmdEcho)
331+
c.SetArgs(strings.Split("-i 17 -b", " "))
332+
c.Execute()
333+
334+
if flagbr != true {
335+
t.Errorf("flag value should be true, %v given", flagbr)
336+
}
337+
338+
if flagir != 17 {
339+
t.Errorf("flag value should be 17, %d given", flagir)
340+
}
341+
342+
}

command.go

+17-15
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func (c *Command) Find(arrs []string) (*Command, []string, error) {
104104

105105
// if commander returned and not appropriately matched return nil & error
106106
if commandFound.Name() == c.Name() && commandFound.Name() != arrs[0] {
107-
return nil, a, fmt.Errorf("Command not found")
107+
return nil, a, fmt.Errorf("unknown command %q\nRun 'help' for usage.\n", a[0])
108108
}
109109

110110
return commandFound, a, nil
@@ -138,26 +138,28 @@ func (c *Command) Out() io.Writer {
138138
}
139139

140140
// execute the command determined by args and the command tree
141-
func (c *Command) execute(args []string) (err error) {
142-
err = fmt.Errorf("unknown subcommand %q\nRun 'help' for usage.\n", args[0])
141+
func (c *Command) findAndExecute(args []string) (err error) {
143142

143+
cmd, a, e := c.Find(args)
144+
if e != nil {
145+
return e
146+
}
147+
return cmd.execute(a)
148+
}
149+
150+
func (c *Command) execute(a []string) (err error) {
144151
if c == nil {
145152
return fmt.Errorf("Called Execute() on a nil Command")
146153
}
147154

148-
cmd, a, e := c.Find(args)
149-
if e == nil {
150-
err = cmd.ParseFlags(a)
151-
if err != nil {
152-
return err
153-
} else {
154-
argWoFlags := cmd.Flags().Args()
155-
cmd.Run(cmd, argWoFlags)
156-
return nil
157-
}
155+
err = c.ParseFlags(a)
156+
if err != nil {
157+
return err
158+
} else {
159+
argWoFlags := c.Flags().Args()
160+
c.Run(c, argWoFlags)
161+
return nil
158162
}
159-
err = e
160-
return err
161163
}
162164

163165
// Used for testing

commander.go

+30-10
Original file line numberDiff line numberDiff line change
@@ -78,27 +78,47 @@ func (c *Commander) Execute() (err error) {
7878
// initialize help as the last point possible to allow for user
7979
// overriding
8080
c.initHelp()
81+
var args []string
82+
8183
if len(c.args) == 0 {
82-
if len(os.Args) == 1 {
83-
// If only the executable is called and the root is runnable, run it
84-
if c.Runnable() {
85-
argWoFlags := c.Flags().Args()
86-
c.Run(c.cmd, argWoFlags)
87-
} else {
88-
c.Usage()
89-
}
84+
args = os.Args[1:]
85+
} else {
86+
args = c.args
87+
}
88+
89+
if len(args) == 0 {
90+
// Only the executable is called and the root is runnable, run it
91+
if c.Runnable() {
92+
err = c.execute([]string(nil))
9093
} else {
91-
err = c.execute(os.Args[1:])
94+
c.Usage()
9295
}
9396
} else {
94-
err = c.execute(c.args)
97+
err = c.findAndExecute(args)
98+
}
99+
100+
// Now handle the case where the root is runnable and only flags are provided
101+
if err != nil && c.Runnable() {
102+
e := c.ParseFlags(args)
103+
if e != nil {
104+
return e
105+
} else {
106+
argWoFlags := c.Flags().Args()
107+
if len(argWoFlags) > 0 {
108+
c.Usage()
109+
} else {
110+
c.Run(c.cmd, argWoFlags)
111+
err = nil
112+
}
113+
}
95114
}
96115

97116
if err != nil {
98117
c.Println("Error:", err.Error())
99118
c.Printf("%v: invalid command %#q\n", c.Root().Name(), os.Args[1:])
100119
c.Printf("Run '%v help' for usage\n", c.Root().Name())
101120
}
121+
102122
return
103123
}
104124

0 commit comments

Comments
 (0)