package main import ( "fmt" "github.com/moby/term" "github.com/spf13/cobra" ) // SetupRootCommand sets default usage, help, and error handling for the // root command. func SetupRootCommand(rootCmd *cobra.Command) { cobra.AddTemplateFunc("wrappedFlagUsages", wrappedFlagUsages) rootCmd.SetUsageTemplate(usageTemplate) rootCmd.SetHelpTemplate(helpTemplate) rootCmd.SetFlagErrorFunc(FlagErrorFunc) rootCmd.SetVersionTemplate("Docker version {{.Version}}\n") rootCmd.PersistentFlags().BoolP("help", "h", false, "Print usage") rootCmd.PersistentFlags().MarkShorthandDeprecated("help", "please use --help") } // FlagErrorFunc prints an error message which matches the format of the // docker/docker/cli error messages func FlagErrorFunc(cmd *cobra.Command, err error) error { if err == nil { return nil } usage := "" if cmd.HasSubCommands() { usage = "\n\n" + cmd.UsageString() } return StatusError{ Status: fmt.Sprintf("%s\nSee '%s --help'.%s", err, cmd.CommandPath(), usage), StatusCode: 125, } } func wrappedFlagUsages(cmd *cobra.Command) string { width := 80 if ws, err := term.GetWinsize(0); err == nil { width = int(ws.Width) } return cmd.Flags().FlagUsagesWrapped(width - 1) } const usageTemplate = `Usage: {{.UseLine}} {{ .Short | trim }} {{- if gt .Aliases 0}} Aliases: {{.NameAndAliases}} {{- end}} {{- if .HasExample}} Examples: {{ .Example }} {{- end}} {{- if .HasAvailableFlags}} Options: {{ wrappedFlagUsages . | trimRightSpace}} {{- end}} ` const helpTemplate = ` {{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`