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}}`