github.com/moby/docker@v26.1.3+incompatible/cmd/dockerd/cobra.go (about) 1 package main 2 3 import ( 4 "fmt" 5 6 "github.com/moby/term" 7 "github.com/spf13/cobra" 8 ) 9 10 // SetupRootCommand sets default usage, help, and error handling for the 11 // root command. 12 func SetupRootCommand(rootCmd *cobra.Command) { 13 cobra.AddTemplateFunc("wrappedFlagUsages", wrappedFlagUsages) 14 15 rootCmd.SetUsageTemplate(usageTemplate) 16 rootCmd.SetHelpTemplate(helpTemplate) 17 rootCmd.SetFlagErrorFunc(FlagErrorFunc) 18 rootCmd.SetVersionTemplate("Docker version {{.Version}}\n") 19 20 rootCmd.PersistentFlags().BoolP("help", "h", false, "Print usage") 21 rootCmd.PersistentFlags().MarkShorthandDeprecated("help", "please use --help") 22 } 23 24 // FlagErrorFunc prints an error message which matches the format of the 25 // docker/docker/cli error messages 26 func FlagErrorFunc(cmd *cobra.Command, err error) error { 27 if err == nil { 28 return nil 29 } 30 31 usage := "" 32 if cmd.HasSubCommands() { 33 usage = "\n\n" + cmd.UsageString() 34 } 35 return StatusError{ 36 Status: fmt.Sprintf("%s\nSee '%s --help'.%s", err, cmd.CommandPath(), usage), 37 StatusCode: 125, 38 } 39 } 40 41 func wrappedFlagUsages(cmd *cobra.Command) string { 42 width := 80 43 if ws, err := term.GetWinsize(0); err == nil { 44 width = int(ws.Width) 45 } 46 return cmd.Flags().FlagUsagesWrapped(width - 1) 47 } 48 49 const usageTemplate = `Usage: {{.UseLine}} 50 51 {{ .Short | trim }} 52 53 {{- if gt .Aliases 0}} 54 55 Aliases: 56 {{.NameAndAliases}} 57 58 {{- end}} 59 {{- if .HasExample}} 60 61 Examples: 62 {{ .Example }} 63 64 {{- end}} 65 {{- if .HasAvailableFlags}} 66 67 Options: 68 {{ wrappedFlagUsages . | trimRightSpace}} 69 70 {{- end}} 71 ` 72 73 const helpTemplate = ` 74 {{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`