From e2f1f778f353af857e0b7323299a3962c264334b Mon Sep 17 00:00:00 2001 From: Ta-Ching Chen Date: Tue, 28 Jan 2020 19:37:07 +0800 Subject: [PATCH] Show global options in usage (#1516) --- .../driver/cobra/helptemplate/templater.go | 33 ++++++++----------- .../driver/cobra/helptemplate/templates.go | 31 +++++------------ 2 files changed, 22 insertions(+), 42 deletions(-) diff --git a/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templater.go b/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templater.go index 8a963c48..54ff2e4b 100644 --- a/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templater.go +++ b/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templater.go @@ -53,15 +53,6 @@ func ActsAsRootCommand(cmd *cobra.Command, filters []string, groups ...CommandGr return templater } -func UseOptionsTemplates(cmd *cobra.Command) { - templater := &templater{ - UsageTemplate: OptionsUsageTemplate(), - HelpTemplate: OptionsHelpTemplate(), - } - cmd.SetUsageFunc(templater.UsageFunc()) - cmd.SetHelpFunc(templater.HelpFunc()) -} - type templater struct { UsageTemplate string HelpTemplate string @@ -73,12 +64,7 @@ type templater struct { func (templater *templater) FlagErrorFunc(exposedFlags ...string) func(*cobra.Command, error) error { return func(c *cobra.Command, err error) error { c.SilenceUsage = true - switch c.CalledAs() { - case "options": - return fmt.Errorf("%s\nRun '%s' without flags", err, c.CommandPath()) - default: - return fmt.Errorf("%s\nSee '%s --help' for usage", err, c.CommandPath()) - } + return fmt.Errorf("%s\nSee '%s --help' for usage", err, c.CommandPath()) } } @@ -211,12 +197,19 @@ func (t *templater) optionsCmdFor(c *cobra.Command) string { } func (t *templater) usageLine(c *cobra.Command) string { - usage := c.UseLine() - suffix := "[options]" - if c.HasFlags() && !strings.Contains(usage, suffix) { - usage += " " + suffix + var useline string + if c.HasParent() { + useline = c.Parent().CommandPath() + " " + c.Use + } else { + useline = c.Use } - return usage + if c.DisableFlagsInUseLine { + return useline + } + if c.HasAvailableFlags() && !strings.Contains(useline, "[options]") { + useline += " [options]" + } + return useline } func flagsUsages(f *flag.FlagSet) string { diff --git a/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templates.go b/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templates.go index de83a3c7..e43f1975 100644 --- a/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templates.go +++ b/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templates.go @@ -29,7 +29,6 @@ const ( `{{$rootCmd := rootCmd .}}` + `{{$visibleFlags := visibleFlags (flagsNotIntersected .LocalFlags .PersistentFlags)}}` + `{{$explicitlyExposedFlags := exposed .}}` + - `{{$optionsCmdFor := optionsCmdFor .}}` + `{{$usageLine := usageLine .}}` // SectionAliases is the help template section that displays command aliases. @@ -50,25 +49,25 @@ const ( {{end}}` // SectionFlags is the help template section that displays the command's flags. - SectionFlags = `{{ if or $visibleFlags.HasFlags $explicitlyExposedFlags.HasFlags}}Options -{{ if $visibleFlags.HasFlags}}{{trimRight (flagsUsages $visibleFlags)}}{{end}}{{ if $explicitlyExposedFlags.HasFlags}}{{ if $visibleFlags.HasFlags}} -{{end}}{{trimRight (flagsUsages $explicitlyExposedFlags)}}{{end}} + SectionFlags = `{{ if $visibleFlags.HasFlags}}Options: +{{trimRight (flagsUsages $visibleFlags)}} + +{{end}}` + + // SectionGlobalFlags is the help template section that displays the command's global flags. + SectionGlobalFlags = `{{ if and (not $isRootCmd) (not .HasSubCommands) }}{{ if $explicitlyExposedFlags.HasFlags}}Global Options: +{{trimRight (flagsUsages $explicitlyExposedFlags)}}{{end}} {{end}}` // SectionUsage is the help template section that displays the command's usage. SectionUsage = `{{if and .Runnable (ne .UseLine "") (ne .UseLine $rootCmd)}}Usage: {{$usageLine}} - {{end}}` // SectionTipsHelp is the help template section that displays the '--help' hint. SectionTipsHelp = `{{if .HasSubCommands}}Use "{{$rootCmd}} --help" for more information about a given command. {{end}}` - - // SectionTipsGlobalOptions is the help template section that displays the 'options' hint for displaying global flags. - SectionTipsGlobalOptions = `{{if $optionsCmdFor}}Use "{{$optionsCmdFor}}" for a list of global command-line options (applies to all commands). -{{end}}` ) // MainHelpTemplate if the template for 'help' used by most commands. @@ -86,21 +85,9 @@ func MainUsageTemplate() string { SectionExamples, SectionSubcommands, SectionFlags, + SectionGlobalFlags, SectionUsage, SectionTipsHelp, - SectionTipsGlobalOptions, } return strings.TrimRightFunc(strings.Join(sections, ""), unicode.IsSpace) } - -// OptionsHelpTemplate if the template for 'help' used by the 'options' command. -func OptionsHelpTemplate() string { - return "" -} - -// OptionsUsageTemplate if the template for 'usage' used by the 'options' command. -func OptionsUsageTemplate() string { - return `{{ if .HasInheritedFlags}}The following options can be passed to any command: - -{{flagsUsages .InheritedFlags}}{{end}}` -}