Skip to content

Commit b68db38

Browse files
authored
Merge pull request #3506 from thaJeztah/group_swarm_commands
re-organize --help output
2 parents 78da8e3 + b66f4b2 commit b68db38

22 files changed

Lines changed: 158 additions & 63 deletions

File tree

cli/cobra.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"os"
66
"path/filepath"
7+
"sort"
78
"strings"
89

910
pluginmanager "github.com/docker/cli/cli-plugins/manager"
@@ -12,6 +13,7 @@ import (
1213
cliflags "github.com/docker/cli/cli/flags"
1314
"github.com/docker/docker/pkg/homedir"
1415
"github.com/docker/docker/registry"
16+
"github.com/fvbommel/sortorder"
1517
"github.com/moby/term"
1618
"github.com/morikuni/aec"
1719
"github.com/pkg/errors"
@@ -30,10 +32,14 @@ func setupCommonRootCommand(rootCmd *cobra.Command) (*cliflags.ClientOptions, *p
3032

3133
cobra.AddTemplateFunc("add", func(a, b int) int { return a + b })
3234
cobra.AddTemplateFunc("hasSubCommands", hasSubCommands)
35+
cobra.AddTemplateFunc("hasTopCommands", hasTopCommands)
3336
cobra.AddTemplateFunc("hasManagementSubCommands", hasManagementSubCommands)
37+
cobra.AddTemplateFunc("hasSwarmSubCommands", hasSwarmSubCommands)
3438
cobra.AddTemplateFunc("hasInvalidPlugins", hasInvalidPlugins)
39+
cobra.AddTemplateFunc("topCommands", topCommands)
3540
cobra.AddTemplateFunc("operationSubCommands", operationSubCommands)
3641
cobra.AddTemplateFunc("managementSubCommands", managementSubCommands)
42+
cobra.AddTemplateFunc("orchestratorSubCommands", orchestratorSubCommands)
3743
cobra.AddTemplateFunc("invalidPlugins", invalidPlugins)
3844
cobra.AddTemplateFunc("wrappedFlagUsages", wrappedFlagUsages)
3945
cobra.AddTemplateFunc("vendorAndVersion", vendorAndVersion)
@@ -240,16 +246,51 @@ func hasManagementSubCommands(cmd *cobra.Command) bool {
240246
return len(managementSubCommands(cmd)) > 0
241247
}
242248

249+
func hasSwarmSubCommands(cmd *cobra.Command) bool {
250+
return len(orchestratorSubCommands(cmd)) > 0
251+
}
252+
243253
func hasInvalidPlugins(cmd *cobra.Command) bool {
244254
return len(invalidPlugins(cmd)) > 0
245255
}
246256

257+
func hasTopCommands(cmd *cobra.Command) bool {
258+
return len(topCommands(cmd)) > 0
259+
}
260+
261+
func topCommands(cmd *cobra.Command) []*cobra.Command {
262+
cmds := []*cobra.Command{}
263+
if cmd.Parent() != nil {
264+
// for now, only use top-commands for the root-command, and skip
265+
// for sub-commands
266+
return cmds
267+
}
268+
for _, sub := range cmd.Commands() {
269+
if isPlugin(sub) || !sub.IsAvailableCommand() {
270+
continue
271+
}
272+
if _, ok := sub.Annotations["category-top"]; ok {
273+
cmds = append(cmds, sub)
274+
}
275+
}
276+
sort.SliceStable(cmds, func(i, j int) bool {
277+
return sortorder.NaturalLess(cmds[i].Annotations["category-top"], cmds[j].Annotations["category-top"])
278+
})
279+
return cmds
280+
}
281+
247282
func operationSubCommands(cmd *cobra.Command) []*cobra.Command {
248283
cmds := []*cobra.Command{}
249284
for _, sub := range cmd.Commands() {
250285
if isPlugin(sub) {
251286
continue
252287
}
288+
if _, ok := sub.Annotations["category-top"]; ok {
289+
if cmd.Parent() == nil {
290+
// for now, only use top-commands for the root-command
291+
continue
292+
}
293+
}
253294
if sub.IsAvailableCommand() && !sub.HasSubCommands() {
254295
cmds = append(cmds, sub)
255296
}
@@ -285,6 +326,27 @@ func vendorAndVersion(cmd *cobra.Command) string {
285326
}
286327

287328
func managementSubCommands(cmd *cobra.Command) []*cobra.Command {
329+
cmds := []*cobra.Command{}
330+
for _, sub := range allManagementSubCommands(cmd) {
331+
if _, ok := sub.Annotations["swarm"]; ok {
332+
continue
333+
}
334+
cmds = append(cmds, sub)
335+
}
336+
return cmds
337+
}
338+
339+
func orchestratorSubCommands(cmd *cobra.Command) []*cobra.Command {
340+
cmds := []*cobra.Command{}
341+
for _, sub := range allManagementSubCommands(cmd) {
342+
if _, ok := sub.Annotations["swarm"]; ok {
343+
cmds = append(cmds, sub)
344+
}
345+
}
346+
return cmds
347+
}
348+
349+
func allManagementSubCommands(cmd *cobra.Command) []*cobra.Command {
288350
cmds := []*cobra.Command{}
289351
for _, sub := range cmd.Commands() {
290352
if isPlugin(sub) {
@@ -345,11 +407,20 @@ Examples:
345407
{{ .Example }}
346408
347409
{{- end}}
410+
{{- if .HasParent}}
348411
{{- if .HasAvailableFlags}}
349412
350413
Options:
351414
{{ wrappedFlagUsages . | trimRightSpace}}
352415
416+
{{- end}}
417+
{{- end}}
418+
{{- if hasTopCommands .}}
419+
420+
Common Commands:
421+
{{- range topCommands .}}
422+
{{rpad (decoratedName .) (add .NamePadding 1)}}{{.Short}}
423+
{{- end}}
353424
{{- end}}
354425
{{- if hasManagementSubCommands . }}
355426
@@ -359,6 +430,15 @@ Management Commands:
359430
{{rpad (decoratedName .) (add .NamePadding 1)}}{{.Short}}{{ if isPlugin .}} {{vendorAndVersion .}}{{ end}}
360431
{{- end}}
361432
433+
{{- end}}
434+
{{- if hasSwarmSubCommands . }}
435+
436+
Swarm Commands:
437+
438+
{{- range orchestratorSubCommands . }}
439+
{{rpad (decoratedName .) (add .NamePadding 1)}}{{.Short}}{{ if isPlugin .}} {{vendorAndVersion .}}{{ end}}
440+
{{- end}}
441+
362442
{{- end}}
363443
{{- if hasSubCommands .}}
364444
@@ -377,6 +457,14 @@ Invalid Plugins:
377457
{{rpad .Name .NamePadding }} {{invalidPluginReason .}}
378458
{{- end}}
379459
460+
{{- end}}
461+
{{- if not .HasParent}}
462+
{{- if .HasAvailableFlags}}
463+
464+
Global Options:
465+
{{ wrappedFlagUsages . | trimRightSpace}}
466+
467+
{{- end}}
380468
{{- end}}
381469
382470
{{- if .HasSubCommands }}

cli/command/commands/commands.go

Lines changed: 24 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -28,81 +28,52 @@ import (
2828
// AddCommands adds all the commands from cli/command to the root command
2929
func AddCommands(cmd *cobra.Command, dockerCli command.Cli) {
3030
cmd.AddCommand(
31-
// checkpoint
32-
checkpoint.NewCheckpointCommand(dockerCli),
33-
34-
// config
35-
config.NewConfigCommand(dockerCli),
36-
37-
// container
38-
container.NewContainerCommand(dockerCli),
31+
// commonly used shorthands
3932
container.NewRunCommand(dockerCli),
40-
41-
// image
42-
image.NewImageCommand(dockerCli),
33+
container.NewExecCommand(dockerCli),
34+
container.NewPsCommand(dockerCli),
4335
image.NewBuildCommand(dockerCli),
36+
image.NewPullCommand(dockerCli),
37+
image.NewPushCommand(dockerCli),
38+
image.NewImagesCommand(dockerCli),
39+
registry.NewLoginCommand(dockerCli),
40+
registry.NewLogoutCommand(dockerCli),
41+
registry.NewSearchCommand(dockerCli),
42+
system.NewVersionCommand(dockerCli),
43+
system.NewInfoCommand(dockerCli),
4444

45-
// builder
45+
// management commands
4646
builder.NewBuilderCommand(dockerCli),
47-
48-
// manifest
47+
checkpoint.NewCheckpointCommand(dockerCli),
48+
container.NewContainerCommand(dockerCli),
49+
context.NewContextCommand(dockerCli),
50+
image.NewImageCommand(dockerCli),
4951
manifest.NewManifestCommand(dockerCli),
50-
51-
// network
5252
network.NewNetworkCommand(dockerCli),
53-
54-
// node
55-
node.NewNodeCommand(dockerCli),
56-
57-
// plugin
5853
plugin.NewPluginCommand(dockerCli),
54+
system.NewSystemCommand(dockerCli),
55+
trust.NewTrustCommand(dockerCli),
56+
volume.NewVolumeCommand(dockerCli),
5957

60-
// registry
61-
registry.NewLoginCommand(dockerCli),
62-
registry.NewLogoutCommand(dockerCli),
63-
registry.NewSearchCommand(dockerCli),
64-
65-
// secret
58+
// orchestration (swarm) commands
59+
config.NewConfigCommand(dockerCli),
60+
node.NewNodeCommand(dockerCli),
6661
secret.NewSecretCommand(dockerCli),
67-
68-
// service
6962
service.NewServiceCommand(dockerCli),
70-
71-
// system
72-
system.NewSystemCommand(dockerCli),
73-
system.NewVersionCommand(dockerCli),
74-
75-
// stack
7663
stack.NewStackCommand(dockerCli),
77-
78-
// swarm
7964
swarm.NewSwarmCommand(dockerCli),
8065

81-
// trust
82-
trust.NewTrustCommand(dockerCli),
83-
84-
// volume
85-
volume.NewVolumeCommand(dockerCli),
86-
87-
// context
88-
context.NewContextCommand(dockerCli),
89-
9066
// legacy commands may be hidden
91-
hide(system.NewEventsCommand(dockerCli)),
92-
hide(system.NewInfoCommand(dockerCli)),
93-
hide(system.NewInspectCommand(dockerCli)),
9467
hide(container.NewAttachCommand(dockerCli)),
9568
hide(container.NewCommitCommand(dockerCli)),
9669
hide(container.NewCopyCommand(dockerCli)),
9770
hide(container.NewCreateCommand(dockerCli)),
9871
hide(container.NewDiffCommand(dockerCli)),
99-
hide(container.NewExecCommand(dockerCli)),
10072
hide(container.NewExportCommand(dockerCli)),
10173
hide(container.NewKillCommand(dockerCli)),
10274
hide(container.NewLogsCommand(dockerCli)),
10375
hide(container.NewPauseCommand(dockerCli)),
10476
hide(container.NewPortCommand(dockerCli)),
105-
hide(container.NewPsCommand(dockerCli)),
10677
hide(container.NewRenameCommand(dockerCli)),
10778
hide(container.NewRestartCommand(dockerCli)),
10879
hide(container.NewRmCommand(dockerCli)),
@@ -114,14 +85,13 @@ func AddCommands(cmd *cobra.Command, dockerCli command.Cli) {
11485
hide(container.NewUpdateCommand(dockerCli)),
11586
hide(container.NewWaitCommand(dockerCli)),
11687
hide(image.NewHistoryCommand(dockerCli)),
117-
hide(image.NewImagesCommand(dockerCli)),
11888
hide(image.NewImportCommand(dockerCli)),
11989
hide(image.NewLoadCommand(dockerCli)),
120-
hide(image.NewPullCommand(dockerCli)),
121-
hide(image.NewPushCommand(dockerCli)),
12290
hide(image.NewRemoveCommand(dockerCli)),
12391
hide(image.NewSaveCommand(dockerCli)),
12492
hide(image.NewTagCommand(dockerCli)),
93+
hide(system.NewEventsCommand(dockerCli)),
94+
hide(system.NewInspectCommand(dockerCli)),
12595
)
12696
}
12797

cli/command/config/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
func NewConfigCommand(dockerCli command.Cli) *cobra.Command {
1212
cmd := &cobra.Command{
1313
Use: "config",
14-
Short: "Manage Docker configs",
14+
Short: "Manage Swarm configs",
1515
Args: cli.NoArgs,
1616
RunE: command.ShowHelp(dockerCli.Err()),
1717
Annotations: map[string]string{

cli/command/container/exec.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ func NewExecCommand(dockerCli command.Cli) *cobra.Command {
5252
options.Command = args[1:]
5353
return RunExec(dockerCli, options)
5454
},
55+
Annotations: map[string]string{
56+
"category-top": "2",
57+
},
5558
}
5659

5760
flags := cmd.Flags()

cli/command/container/list.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ func NewPsCommand(dockerCli command.Cli) *cobra.Command {
3737
RunE: func(cmd *cobra.Command, args []string) error {
3838
return runPs(dockerCli, &options)
3939
},
40+
Annotations: map[string]string{
41+
"category-top": "3",
42+
},
4043
}
4144

4245
flags := cmd.Flags()

cli/command/container/run.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ func NewRunCommand(dockerCli command.Cli) *cobra.Command {
4444
}
4545
return runRun(dockerCli, cmd.Flags(), &opts, copts)
4646
},
47+
Annotations: map[string]string{
48+
"category-top": "1",
49+
},
4750
}
4851

4952
flags := cmd.Flags()

cli/command/image/build.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ func NewBuildCommand(dockerCli command.Cli) *cobra.Command {
105105
options.context = args[0]
106106
return runBuild(dockerCli, options)
107107
},
108+
Annotations: map[string]string{
109+
"category-top": "4",
110+
},
108111
}
109112

110113
flags := cmd.Flags()

cli/command/image/list.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ func NewImagesCommand(dockerCli command.Cli) *cobra.Command {
3737
}
3838
return runImages(dockerCli, options)
3939
},
40+
Annotations: map[string]string{
41+
"category-top": "7",
42+
},
4043
}
4144

4245
flags := cmd.Flags()

cli/command/image/pull.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ func NewPullCommand(dockerCli command.Cli) *cobra.Command {
3434
opts.remote = args[0]
3535
return RunPull(dockerCli, opts)
3636
},
37+
Annotations: map[string]string{
38+
"category-top": "5",
39+
},
3740
}
3841

3942
flags := cmd.Flags()

cli/command/image/push.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ func NewPushCommand(dockerCli command.Cli) *cobra.Command {
3535
opts.remote = args[0]
3636
return RunPush(dockerCli, opts)
3737
},
38+
Annotations: map[string]string{
39+
"category-top": "6",
40+
},
3841
}
3942

4043
flags := cmd.Flags()

0 commit comments

Comments
 (0)