diff --git a/cli/cobra.go b/cli/cobra.go index cb1cf8527abc..ae425adddd23 100644 --- a/cli/cobra.go +++ b/cli/cobra.go @@ -37,6 +37,7 @@ func setupCommonRootCommand(rootCmd *cobra.Command) (*cliflags.ClientOptions, *p cobra.AddTemplateFunc("hasSwarmSubCommands", hasSwarmSubCommands) cobra.AddTemplateFunc("hasInvalidPlugins", hasInvalidPlugins) cobra.AddTemplateFunc("topCommands", topCommands) + cobra.AddTemplateFunc("commandAliases", commandAliases) cobra.AddTemplateFunc("operationSubCommands", operationSubCommands) cobra.AddTemplateFunc("managementSubCommands", managementSubCommands) cobra.AddTemplateFunc("orchestratorSubCommands", orchestratorSubCommands) @@ -258,6 +259,21 @@ func hasTopCommands(cmd *cobra.Command) bool { return len(topCommands(cmd)) > 0 } +// commandAliases is a templating function to return aliases for the command, +// formatted as the full command as they're called (contrary to the default +// Aliases function, which only returns the subcommand). +func commandAliases(cmd *cobra.Command) string { + var parentPath string + if cmd.HasParent() { + parentPath = cmd.Parent().CommandPath() + " " + } + aliases := cmd.CommandPath() + for _, alias := range cmd.Aliases { + aliases += ", " + parentPath + alias + } + return aliases +} + func topCommands(cmd *cobra.Command) []*cobra.Command { cmds := []*cobra.Command{} if cmd.Parent() != nil { @@ -398,7 +414,7 @@ EXPERIMENTAL: {{- if gt .Aliases 0}} Aliases: - {{.NameAndAliases}} + {{ commandAliases . }} {{- end}} {{- if .HasExample}} diff --git a/cli/cobra_test.go b/cli/cobra_test.go index 18ce31ca2e69..3349d1860340 100644 --- a/cli/cobra_test.go +++ b/cli/cobra_test.go @@ -78,6 +78,14 @@ func TestInvalidPlugin(t *testing.T) { assert.DeepEqual(t, invalidPlugins(root), []*cobra.Command{sub1}, cmpopts.IgnoreUnexported(cobra.Command{})) } +func TestCommandAliases(t *testing.T) { + root := &cobra.Command{Use: "root"} + sub := &cobra.Command{Use: "subcommand", Aliases: []string{"alias1", "alias2"}} + root.AddCommand(sub) + + assert.Equal(t, commandAliases(sub), "root subcommand, root alias1, root alias2") +} + func TestDecoratedName(t *testing.T) { root := &cobra.Command{Use: "root"} topLevelCommand := &cobra.Command{Use: "pluginTopLevelCommand"} diff --git a/e2e/stack/testdata/stack-deploy-help.golden b/e2e/stack/testdata/stack-deploy-help.golden index fd8baec1af73..6ca82f31aa06 100644 --- a/e2e/stack/testdata/stack-deploy-help.golden +++ b/e2e/stack/testdata/stack-deploy-help.golden @@ -4,7 +4,7 @@ Usage: docker stack deploy [OPTIONS] STACK Deploy a new stack or update an existing stack Aliases: - deploy, up + docker stack deploy, docker stack up Options: -c, --compose-file strings Path to a Compose file, or "-" to read