Commit Graph

672 Commits

Author SHA1 Message Date
Eric Paris b78326bb16 Merge pull request #88 from eparis/subhelptest
Add tests about additional help topics
2015-04-07 18:26:15 -05:00
Eric Paris aab4e37189 Merge pull request #89 from eparis/line-in-go-test-error
print line number in go test failures
2015-04-07 17:05:46 -05:00
Eric Paris 86a16864ea Add tests about additional help topics 2015-04-07 16:17:22 -04:00
Eric Paris 9692856020 print line number in go test failures 2015-04-07 15:56:01 -04:00
Eric Paris f576d29563 Merge pull request #82 from bep/mousetrap
Add mousetrap for Windows users
2015-04-06 15:49:03 -05:00
Eric Paris 0ea881ce45 Merge pull request #60 from dohzya/remove-command
Add Command's RemoveCommand method
2015-04-06 15:18:42 -05:00
Eric Paris bbc51773c3 Merge pull request #77 from eparis/additional-help-topics
Additional help topics
2015-04-06 15:04:48 -05:00
Eric Paris 794a362808 Remove specail casing in Execute()
We had some stuff that created a new empty []string if args was already
and empty string (why?)

We had some stuff that called Help() if it wasn't runnable (but
.execute() already does that)

Just remove the special case stuff.
2015-04-06 16:02:09 -04:00
Eric Paris b9e25fa4a0 Slight formatting change, to make next commit more readable 2015-04-06 16:02:08 -04:00
Eric Paris 29e27b1649 Merge pull request #84 from eparis/subcommand-invalid-flag
Stop special casing runnable root commands
2015-04-06 14:57:12 -05:00
Eric Paris bd0f8a846e Stop special casing runnable root commands
The special case code to handle a runnable root command had some
problems.  It was noticed that if you created a runnable root and a
subcommand.  And the subcommand was then executed with both a valid and
invalid flag, the error message was about the valid flag being invalid.
For example

./command subcommand --goodflag=10 --badflag=10

Would fail and tell you that --goodflag was an invalid flag. Instead if
we just do away with the special Command.execute() for the root command
the parser for subcommand is what prints the error and it gets it
right...
2015-04-06 15:42:03 -04:00
Eric Paris fe581720ad New tests (they don't all pass) 2015-04-06 15:42:01 -04:00
Eric Paris 09b49c329c Merge pull request #83 from adammck/fix_double_output_on_unknown_command
Fix redundant error for unknown root commands
2015-04-03 15:28:12 -05:00
Adam Mckaig 2c370cd936 Fix redundant error for unknown root command 2015-04-03 01:07:34 -04:00
bep beda1945ad Add mousetrap for Windows users
Fixes #80
2015-04-01 21:14:40 +02:00
bep be3cf39f80 Set Go version to 1.4.2 in Travis config
See #81
2015-04-01 19:20:02 +02:00
bep be1667c3f0 Add Go 1.4 to Travis config
See #81
2015-04-01 19:14:28 +02:00
bep bea8ba9ce6 Update Go versions in Travis config
See #81
2015-04-01 19:04:25 +02:00
Jeff Lowdermilk 79bd93d369 Add test for persistent bool flag on subcommand 2015-03-23 14:42:59 -07:00
Eric Paris fd10548830 Fix additional help topics template
The additional help topics were really hard to ever get to show.  The
required conditionals were difficult to meet and did not seem to really
be logical.

Problems I see:
1) the top level command could never have additional topics.
2) you must have at least one sibling command AND one subcommand
3) we had the AND above, but then test both conditionals a second time
4) if the sub command was runnable we wouldn't print anything
5) if the sibling commands were not runnable we wouldn't print anything
4+5) it's possible that we printed "Additional help topics:" with nothing following it
6) We always printed ourselves as a sibling in the additional info

Whew, I think I fixed all of those!  Again, using
https://github.com/eparis/readable-golang-template
I'm actually able to visualize the template and see this craziness.

The conditionals BEFORE this change:

{{if .HasParent}}
        {{if and (gt .Commands 0) (gt .Parent.Commands 1) }}
                Additional help topics:
                {{if gt .Commands 0 }}
                        {{range .Commands}}
                                {{if not .Runnable}}
                                        {{rpad .CommandPath .CommandPathPadding}} {{.Short}}
                                {{end}}
                        {{end}}
                {{end}}
                {{if gt .Parent.Commands 1 }}
                        {{range .Parent.Commands}}
                                {{if .Runnable}}
                                        {{if not (eq .Name $cmd.Name) }}
                                        {{end}}
                                        {{rpad .CommandPath .CommandPathPadding}} {{.Short}}
                                {{end}}
                        {{end}}
                {{end}}
        {{end}}
{{end}}

The conditionals AFTER this change:

{{if or (.HasHelpSubCommands) (.HasRunnableSiblings)}}
        Additional help topics:
        {{if .HasHelpSubCommands}}
                {{range .Commands}}
                        {{if not .Runnable}}
                                {{rpad .CommandPath .CommandPathPadding}} {{.Short}}
                        {{end}}
                {{end}}
        {{end}}
        {{if .HasRunnableSiblings }}
                {{range .Parent.Commands}}
                        {{if .Runnable}}
                                {{if not (eq .Name $cmd.Name) }}
                                        {{rpad .CommandPath .CommandPathPadding}} {{.Short}}
                                {{end}}
                        {{end}}
                {{end}}
        {{end}}
{{end}}
2015-03-20 14:55:05 -04:00
Eric Paris c64442a487 fix usage template conditional
I wrote https://github.com/eparis/readable-golang-template which
converts golang templates into something structured around the
conditionals.  Obviously you can't just USE the output, but you can SEE
the problems.  In this case the output shows something like:

{{if .HasParent}}
        {{if and (gt .Commands 0) (gt .Parent.Commands 1) }}
                Additional help topics:
                {{if gt .Commands 0 }}
                        {{range .Commands}}
                                {{if not .Runnable}}
                                        {{rpad .CommandPath .CommandPathPadding}} {{.Short}}
                                {{end}}
                        {{end}}
                {{end}}
                {{if gt .Parent.Commands 1 }}
                        {{range .Parent.Commands}}
                                {{if .Runnable}}
                                        {{if not (eq .Name $cmd.Name) }}
                                        {{end}}
                                        {{rpad .CommandPath .CommandPathPadding}} {{.Short}}
                                {{end}}
                        {{end}}
                {{end}}
        {{end}}
{{end}}

We have a completely unused "{{if not (eq .Name $cmd.Name) }}"

Move the {{end}} after the {{rpad...}}
2015-03-20 13:59:32 -04:00
Edgard Castro 384c059f4b Help uses Short message if Long is not available 2015-03-19 20:29:37 +01:00
Eric Paris f81b784738 Make flags declared outside spf13.pflag persistent flags on the parent
Some projects pick up flags from other projects they include.  A great
example would be projects that use glog and thus get all of those flags.
Kubernetes, for example, merges those flags manually into its commands.

This was reported in https://github.com/spf13/cobra/issues/44

What this patch does is merge those flags into the PersistentFlags on
the highest parent.  This allows kubernetes to stop having to merge
things themselves...
2015-03-19 15:08:12 -04:00
Jason Moiron e784a59910 fix missing newline in help output introduced in bf480fe628 2015-03-18 21:11:55 +01:00
Eric Paris 6de96b849c Default usage output to stdout
If the command has not set an output explicitly everything will go to
stderr.  This makes a lot of sense, but is a huge PITA for people who
want to be able to grep the help output.  It is very common for users to
want to do

command --help | grep flag

This patch fixes that by default help output (but not error output like
an invalid command) to stdout instead of defaulting to stderr.
2015-03-18 16:43:00 +01:00
Bjørn Erik Pedersen 6264dc67e1 Merge pull request #70 from brendandburns/master
Add mergePersistentFlags in strip flags since we now look at the flag set.
2015-03-17 00:30:08 +01:00
Brendan Burns 93278e2f35 Add mergePersistentFlags in strip flags since we now look at the flag set. 2015-03-16 16:15:32 -07:00
Brendan Burns 9e7273d546 Remove some wonky error handling, as upstream seems correct now.
Also, it's buggy for nested commands.
2015-03-13 13:36:21 -04:00
Étienne Vallette d'Osia 5b56110fb0 Add tests for RemoveCommand 2015-03-13 16:30:33 +09:00
Étienne Vallette d'Osia 0e7e122c81 Add README section for RemoveCommand 2015-03-13 12:40:00 +09:00
Étienne Vallette d'Osia f479c924b8 Add Command's RemoveCommand method
This method removes children commands of an existing command.

This allows to build CLI clients that can be extended by 3rd party tools,
for instance by adding commands _and replacing the “version” command_.

For now the 1st defined command will be executed, so it is not possible
to override an existing command. But anyway, deleting old command then
adding a new one is the ultimate way to be certain there is no
confusion.
2015-03-12 22:44:11 -04:00
Brendan Burns 2cb625eda3 Remove some wonky error handling, as upstream seems correct now.
Also, it's buggy for nested commands.
2015-03-12 22:37:48 -04:00
Brendan Burns bbdea35c49 Fix stripFlags to be more intelligent about what it parses. 2015-03-12 22:36:49 -04:00
Jeff Lowdermilk 5c9146990b Explicitly support local flags overwriting persistent/inherited flags
The current (desired) behavior when a Command specifies a flag that
has the same name as a persistent/inherited flag, is that the local
definition takes precedence. This change updates the various
Flag subset functions to respect that behavior:
* LocalFlags: now returns only the set of flags and persistent flags
  attached to the Command itself.
* InheritedFlags: now returns only the set of persistent flags inherited
  from the Command's parent(s), excluding any that are overwritten by a
  local flag.
* NonInheritedFlags: changed to an alias of LocalFlags.
* AllPersistentFlags: removed as not very useful; it returned the set
  of all persistent flags attached to the Command and its parent(s).

Default UsageTemplate updated to use LocalFlags and InheritedFlags
2015-03-12 16:41:00 -07:00
Étienne Vallette d'Osia fd2b84c4e2 Add Command's RemoveCommand method
This method removes children commands of an existing command.

This allows to build CLI clients that can be extended by 3rd party tools,
for instance by adding commands _and replacing the “version” command_.

For now the 1st defined command will be executed, so it is not possible
to override an existing command. But anyway, deleting old command then
adding a new one is the ultimate way to be certain there is no
confusion.
2015-03-03 16:38:01 +09:00
Eric Paris f8e1ec56bd new NonInheritedFlags() which give all flags which were not persisted from a parent command 2015-02-17 13:52:53 -05:00
Eric Paris b96dd75141 new InheritedFlags() command to tell all flags which persisted from a parent 2015-02-17 13:52:53 -05:00
Eric Paris bf480fe628 New "example" section of commands
We have a long and short description.  This adds an "Example" section.
Which can used to create better docs than putting it all in Long.
2015-02-17 13:50:52 -05:00
Masahiro Sano a16cb24999 help displays command names instead of usage in Available Commands 2015-02-17 13:50:09 -05:00
Clayton Coleman 07a9dc0024 Update README.md to describe help behavior without subcommands 2015-02-11 17:18:36 -05:00
Kartik Singhal bd75ea1d19 Updated test corresponding to #49 2015-02-11 17:17:28 -05:00
Kartik Singhal c36f627ba6 Minor English correction 2015-02-11 17:17:28 -05:00
fabianofranz efb045ec60 Restores the ability to fetch local only flags 2015-02-11 17:12:48 -05:00
Ahsanul Haque e1e66f7b4e Code commentary 2014-12-18 23:10:25 -05:00
Anthony Fok 4745f1fd64 In execute(), check if command is Runnable()
A corner case exists where c.Runnable() is not checked
before c.Run() is called, thus a nil c.Run is executed
leading to "panic: runtime error: invalid memory address
or nil pointer dereference".

This patch adds an extra c.Runnable() check in execute()
to catch that corner case.

Fixes #37.
2014-12-18 22:46:33 -05:00
Maciej Szulik 6e6b6a9c19 Subcommands flag parsing errors print subcommand usage and not root's command usage
Conflicts:
	command.go
2014-12-18 22:43:23 -05:00
spf13 1cb31604a1 small formatting change to readme 2014-12-18 22:41:49 -05:00
Maciej Szulik 033c83bc5e Subcommands flag parsing errors print subcommand usage and not root's command usage 2014-12-09 08:46:16 -05:00
Steve Francia b825817fc0 Merge pull request #32 from smarterclayton/hide_subcommand_help_for_root_only_command
When no subcommands are registered, omit command help output
2014-11-12 16:52:16 -05:00
Clayton Coleman 9b6c92647a When no subcommands are registered, omit command help output
For a single root command with a Run method, the help output still
contains 'help [command]' as a subcommand (because Help is always
added). Since the only subcommand would be 'help', the help is better
off omitted.

This change allows a command to be used both as a subcommand
or a root command without having to define a custom help that elides
the help command when no subcommands are added.  Instead, the default
help command is only added when subcommands are present.
2014-11-11 23:43:27 -05:00