From 5ed62f352a781400e9ab5b12edf5d775dfb8614a Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Tue, 9 Dec 2014 14:42:53 +0100 Subject: [PATCH] Subcommands flag parsing errors print subcommand usage and not root's command usage --- command.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/command.go b/command.go index b506b1ed..7b2cf7de 100644 --- a/command.go +++ b/command.go @@ -57,6 +57,7 @@ type Command struct { commandsMaxCommandPathLen int flagErrorBuf *bytes.Buffer + cmdErrorBuf *bytes.Buffer args []string output *io.Writer // nil means stderr; use Out() method instead @@ -355,6 +356,17 @@ func (c *Command) execute(a []string) (err error) { err = c.ParseFlags(a) if err != nil { + // We're writing subcommand usage to root command's error buffer to have it displayed to the user + r := c.Root() + if r.cmdErrorBuf == nil { + r.cmdErrorBuf = new(bytes.Buffer) + } + // for writing the usage to the buffer we need to switch the output temporarily + // since Out() returns root output, you also need to revert that on root + out := r.Out() + r.SetOutput(r.cmdErrorBuf) + c.Usage() + r.SetOutput(out) return err } else { // If help is called, regardless of other flags, we print that @@ -430,7 +442,12 @@ func (c *Command) Execute() (err error) { // Flags parsing had an error. // If an error happens here, we have to report it to the user c.Println(c.errorMsgFromParse()) - c.Usage() + // If an error happens search also for subcommand info about that + if c.cmdErrorBuf != nil && c.cmdErrorBuf.Len() > 0 { + c.Println(c.cmdErrorBuf.String()) + } else { + c.Usage() + } return e } else { // If help is called, regardless of other flags, we print that @@ -484,6 +501,8 @@ func (c *Command) initHelp() { func (c *Command) ResetCommands() { c.commands = nil c.helpCommand = nil + c.cmdErrorBuf = new(bytes.Buffer) + c.cmdErrorBuf.Reset() } func (c *Command) Commands() []*Command {