Only hide commands if the env variable is set.

Better formatting for usage template.
Group commands in usage to management/operation commands.
Remove the word Docker from the description of management commands.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
This commit is contained in:
Daniel Nephin 2016-09-12 11:37:00 -04:00
parent 68b7f55a45
commit 1f0f7ecb5a
12 changed files with 86 additions and 18 deletions

View File

@ -9,6 +9,11 @@ import (
// SetupRootCommand sets default usage, help, and error handling for the // SetupRootCommand sets default usage, help, and error handling for the
// root command. // root command.
func SetupRootCommand(rootCmd *cobra.Command) { func SetupRootCommand(rootCmd *cobra.Command) {
cobra.AddTemplateFunc("hasSubCommands", hasSubCommands)
cobra.AddTemplateFunc("hasManagementSubCommands", hasManagementSubCommands)
cobra.AddTemplateFunc("operationSubCommands", operationSubCommands)
cobra.AddTemplateFunc("managementSubCommands", managementSubCommands)
rootCmd.SetUsageTemplate(usageTemplate) rootCmd.SetUsageTemplate(usageTemplate)
rootCmd.SetHelpTemplate(helpTemplate) rootCmd.SetHelpTemplate(helpTemplate)
rootCmd.SetFlagErrorFunc(FlagErrorFunc) rootCmd.SetFlagErrorFunc(FlagErrorFunc)
@ -34,23 +39,81 @@ func FlagErrorFunc(cmd *cobra.Command, err error) error {
} }
} }
var usageTemplate = `Usage: {{if not .HasSubCommands}}{{.UseLine}}{{end}}{{if .HasSubCommands}}{{ .CommandPath}} COMMAND{{end}} func hasSubCommands(cmd *cobra.Command) bool {
return len(operationSubCommands(cmd)) > 0
}
{{ .Short | trim }}{{if gt .Aliases 0}} func hasManagementSubCommands(cmd *cobra.Command) bool {
return len(managementSubCommands(cmd)) > 0
}
func operationSubCommands(cmd *cobra.Command) []*cobra.Command {
cmds := []*cobra.Command{}
for _, sub := range cmd.Commands() {
if sub.IsAvailableCommand() && !sub.HasSubCommands() {
cmds = append(cmds, sub)
}
}
return cmds
}
func managementSubCommands(cmd *cobra.Command) []*cobra.Command {
cmds := []*cobra.Command{}
for _, sub := range cmd.Commands() {
if sub.IsAvailableCommand() && sub.HasSubCommands() {
cmds = append(cmds, sub)
}
}
return cmds
}
var usageTemplate = `Usage:
{{- if not .HasSubCommands}} {{.UseLine}}{{end}}
{{- if .HasSubCommands}} {{ .CommandPath}} COMMAND{{end}}
{{ .Short | trim }}
{{- if gt .Aliases 0}}
Aliases: Aliases:
{{.NameAndAliases}}{{end}}{{if .HasExample}} {{.NameAndAliases}}
{{- end}}
{{- if .HasExample}}
Examples: Examples:
{{ .Example }}{{end}}{{if .HasFlags}} {{ .Example }}
{{- end}}
{{- if .HasFlags}}
Options: Options:
{{.Flags.FlagUsages | trimRightSpace}}{{end}}{{ if .HasAvailableSubCommands}} {{.Flags.FlagUsages | trimRightSpace}}
Commands:{{range .Commands}}{{if .IsAvailableCommand}} {{- end}}
{{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{ if .HasSubCommands }} {{- if hasManagementSubCommands . }}
Run '{{.CommandPath}} COMMAND --help' for more information on a command.{{end}} Management Commands:
{{- range managementSubCommands . }}
{{rpad .Name .NamePadding }} {{.Short}}
{{- end}}
{{- end}}
{{- if hasSubCommands .}}
Commands:
{{- range operationSubCommands . }}
{{rpad .Name .NamePadding }} {{.Short}}
{{- end}}
{{- end}}
{{- if .HasSubCommands }}
Run '{{.CommandPath}} COMMAND --help' for more information on a command.
{{- end}}
` `
var helpTemplate = ` var helpTemplate = `

View File

@ -15,7 +15,7 @@ import (
func NewCheckpointCommand(rootCmd *cobra.Command, dockerCli *command.DockerCli) { func NewCheckpointCommand(rootCmd *cobra.Command, dockerCli *command.DockerCli) {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "checkpoint", Use: "checkpoint",
Short: "Manage Container Checkpoints", Short: "Manage checkpoints",
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())

View File

@ -1,6 +1,8 @@
package commands package commands
import ( import (
"os"
"github.com/docker/docker/cli/command" "github.com/docker/docker/cli/command"
"github.com/docker/docker/cli/command/checkpoint" "github.com/docker/docker/cli/command/checkpoint"
"github.com/docker/docker/cli/command/container" "github.com/docker/docker/cli/command/container"
@ -75,6 +77,9 @@ func AddCommands(cmd *cobra.Command, dockerCli *command.DockerCli) {
} }
func hide(cmd *cobra.Command) *cobra.Command { func hide(cmd *cobra.Command) *cobra.Command {
if os.Getenv("DOCKER_HIDE_LEGACY_COMMANDS") == "" {
return cmd
}
cmdCopy := *cmd cmdCopy := *cmd
cmdCopy.Hidden = true cmdCopy.Hidden = true
cmdCopy.Aliases = []string{} cmdCopy.Aliases = []string{}

View File

@ -13,7 +13,7 @@ import (
func NewContainerCommand(dockerCli *command.DockerCli) *cobra.Command { func NewContainerCommand(dockerCli *command.DockerCli) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "container", Use: "container",
Short: "Manage Docker containers", Short: "Manage containers",
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())

View File

@ -13,7 +13,7 @@ import (
func NewImageCommand(dockerCli *command.DockerCli) *cobra.Command { func NewImageCommand(dockerCli *command.DockerCli) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "image", Use: "image",
Short: "Manage Docker images", Short: "Manage images",
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())

View File

@ -13,7 +13,7 @@ import (
func NewNetworkCommand(dockerCli *command.DockerCli) *cobra.Command { func NewNetworkCommand(dockerCli *command.DockerCli) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "network", Use: "network",
Short: "Manage Docker networks", Short: "Manage networks",
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())

View File

@ -14,7 +14,7 @@ import (
func NewNodeCommand(dockerCli *command.DockerCli) *cobra.Command { func NewNodeCommand(dockerCli *command.DockerCli) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "node", Use: "node",
Short: "Manage Docker Swarm nodes", Short: "Manage Swarm nodes",
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())

View File

@ -14,7 +14,7 @@ import (
func NewPluginCommand(rootCmd *cobra.Command, dockerCli *command.DockerCli) { func NewPluginCommand(rootCmd *cobra.Command, dockerCli *command.DockerCli) {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "plugin", Use: "plugin",
Short: "Manage Docker plugins", Short: "Manage plugins",
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())

View File

@ -13,7 +13,7 @@ import (
func NewServiceCommand(dockerCli *command.DockerCli) *cobra.Command { func NewServiceCommand(dockerCli *command.DockerCli) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "service", Use: "service",
Short: "Manage Docker services", Short: "Manage services",
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())

View File

@ -14,7 +14,7 @@ import (
func NewStackCommand(dockerCli *command.DockerCli) *cobra.Command { func NewStackCommand(dockerCli *command.DockerCli) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "stack", Use: "stack",
Short: "Manage Docker stacks", Short: "Manage stacks",
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())

View File

@ -13,7 +13,7 @@ import (
func NewSwarmCommand(dockerCli *command.DockerCli) *cobra.Command { func NewSwarmCommand(dockerCli *command.DockerCli) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "swarm", Use: "swarm",
Short: "Manage Docker Swarm", Short: "Manage Swarm",
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString()) fmt.Fprintf(dockerCli.Err(), "\n"+cmd.UsageString())

View File

@ -13,7 +13,7 @@ import (
func NewVolumeCommand(dockerCli *command.DockerCli) *cobra.Command { func NewVolumeCommand(dockerCli *command.DockerCli) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "volume COMMAND", Use: "volume COMMAND",
Short: "Manage Docker volumes", Short: "Manage volumes",
Long: volumeDescription, Long: volumeDescription,
Args: cli.NoArgs, Args: cli.NoArgs,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {