From a1691f4ab33613c7e0915ca06b438bf03d8c4782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20M=C3=ADchal?= Date: Thu, 11 Nov 2021 18:18:52 +0200 Subject: [PATCH] cmd/root: Use string template instead of function for usage In version 1.1.2 of Cobra has been included a change[0] that changes the behaviour of how custom usage functions are printed. The change prepends "Error: " to the text. This is not desired since the usage text is not an error text. Example of the wrong behaviour: $ toolbox --foo Error: unknown flag: --foo Error: Run 'toolbox --help' for usage. Desired behaviour: $ toolbox --foo Error: unknown flag: --foo Run 'toolbox --help' for usage. A workaround is to define a template string for the usage instead. The template uses the templating language of Go[1]. See the default template string in version 1.2.1[2]. Because the template is set only once, the executableBase needs to be set before the template is applied. That required the move of setUpGlobals() into init() of the cmd package. This is a better place for the function call as init() is called earlier than Execute()[3]. Upstream issue: https://github.com/spf13/cobra/issues/1532 [0] https://github.com/spf13/cobra/pull/1044 [1] https://pkg.go.dev/text/template [2] https://github.com/spf13/cobra/blob/v1.2.1/command.go#L491 [3] https://golang.org/doc/effective_go#init https://github.com/containers/toolbox/pull/917 --- src/cmd/root.go | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/cmd/root.go b/src/cmd/root.go index 46bf52237..9430d3b10 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -62,11 +62,6 @@ var ( ) func Execute() { - if err := setUpGlobals(); err != nil { - fmt.Fprintf(os.Stderr, "Error: %s\n", err) - os.Exit(1) - } - if err := rootCmd.Execute(); err != nil { os.Exit(1) } @@ -75,6 +70,11 @@ func Execute() { } func init() { + if err := setUpGlobals(); err != nil { + fmt.Fprintf(os.Stderr, "Error: %s\n", err) + os.Exit(1) + } + persistentFlags := rootCmd.PersistentFlags() persistentFlags.BoolVarP(&rootFlags.assumeYes, @@ -96,12 +96,13 @@ func init() { persistentFlags.CountVarP(&rootFlags.verbose, "verbose", "v", "Set log-level to 'debug'") rootCmd.SetHelpFunc(rootHelp) - rootCmd.SetUsageFunc(rootUsage) + + usageTemplate := fmt.Sprintf(`Run '%s --help' for usage.`, executableBase) + rootCmd.SetUsageTemplate(usageTemplate) + rootCmd.SilenceUsage = true } func preRun(cmd *cobra.Command, args []string) error { - cmd.Root().SilenceUsage = true - if err := setUpLoggers(); err != nil { return err } @@ -188,12 +189,6 @@ func rootRun(cmd *cobra.Command, args []string) error { return rootRunImpl(cmd, args) } -func rootUsage(cmd *cobra.Command) error { - err := fmt.Errorf("Run '%s --help' for usage.", executableBase) - fmt.Fprintf(os.Stderr, "%s", err) - return err -} - func migrate() error { logrus.Debug("Migrating to newer Podman")