Merge pull request #138 from eparis/cleanup-helpfunc

Allow SetHelpFunc to overwrite the --help flag instead of just the help subcommand
This commit is contained in:
Eric Paris 2015-09-03 15:53:20 -05:00
commit 16b4170663

View file

@ -188,34 +188,23 @@ func (c *Command) UsageFunc() (f func(*Command) error) {
} }
} }
} }
// HelpFunc returns either the function set by SetHelpFunc for this command
// or a parent, or it returns a function which calls c.Help()
func (c *Command) HelpFunc() func(*Command, []string) { func (c *Command) HelpFunc() func(*Command, []string) {
if c.helpFunc != nil { cmd := c
return c.helpFunc for cmd != nil {
if cmd.helpFunc != nil {
return cmd.helpFunc
} }
cmd = cmd.parent
if c.HasParent() {
return c.parent.HelpFunc()
} else {
return func(c *Command, args []string) {
if len(args) == 0 {
// Help called without any topic, calling on root
c.Root().Help()
return
} }
return func(*Command, []string) {
cmd, _, e := c.Root().Find(args) err := c.Help()
if cmd == nil || e != nil {
c.Printf("Unknown help topic %#q.", args)
c.Root().Usage()
} else {
err := cmd.Help()
if err != nil { if err != nil {
c.Println(err) c.Println(err)
} }
} }
}
}
} }
var minUsagePadding int = 25 var minUsagePadding int = 25
@ -593,7 +582,7 @@ func (c *Command) Execute() (err error) {
err = cmd.execute(flags) err = cmd.execute(flags)
if err != nil { if err != nil {
if err == flag.ErrHelp { if err == flag.ErrHelp {
cmd.Help() cmd.HelpFunc()(cmd, args)
return nil return nil
} }
c.Println(cmd.UsageString()) c.Println(cmd.UsageString())
@ -620,9 +609,19 @@ func (c *Command) initHelpCmd() {
Short: "Help about any command", Short: "Help about any command",
Long: `Help provides help for any command in the application. Long: `Help provides help for any command in the application.
Simply type ` + c.Name() + ` help [path to command] for full details.`, Simply type ` + c.Name() + ` help [path to command] for full details.`,
Run: c.HelpFunc(),
PersistentPreRun: func(cmd *Command, args []string) {}, PersistentPreRun: func(cmd *Command, args []string) {},
PersistentPostRun: func(cmd *Command, args []string) {}, PersistentPostRun: func(cmd *Command, args []string) {},
Run: func(c *Command, args []string) {
cmd, _, e := c.Root().Find(args)
if cmd == nil || e != nil {
c.Printf("Unknown help topic %#q.", args)
c.Root().Usage()
} else {
helpFunc := cmd.HelpFunc()
helpFunc(cmd, args)
}
},
} }
} }
c.AddCommand(c.helpCommand) c.AddCommand(c.helpCommand)