diff --git a/cli-plugins/manager/cobra.go b/cli-plugins/manager/cobra.go index ddf067be1dbd..57ec4a7909ec 100644 --- a/cli-plugins/manager/cobra.go +++ b/cli-plugins/manager/cobra.go @@ -38,6 +38,7 @@ func AddPluginCommandStubs(dockerCLI config.Provider, rootCmd *cobra.Command) (e rootCmd.AddCommand(&cobra.Command{ Use: p.Name, Short: p.ShortDescription, + Hidden: p.Hidden, Run: func(_ *cobra.Command, _ []string) {}, Annotations: annotations, DisableFlagParsing: true, diff --git a/cli-plugins/metadata/metadata.go b/cli-plugins/metadata/metadata.go index 9d408c00b3dd..7061486a7056 100644 --- a/cli-plugins/metadata/metadata.go +++ b/cli-plugins/metadata/metadata.go @@ -33,4 +33,6 @@ type Metadata struct { ShortDescription string `json:",omitempty"` // URL is a pointer to the plugin's homepage. URL string `json:",omitempty"` + // Hidden hides the plugin in completion and help message output. + Hidden bool `json:",omitempty"` } diff --git a/cli/cobra_test.go b/cli/cobra_test.go index 9ca87ea5c836..eb87c75d4184 100644 --- a/cli/cobra_test.go +++ b/cli/cobra_test.go @@ -56,6 +56,33 @@ func TestInvalidPlugin(t *testing.T) { assert.DeepEqual(t, invalidPlugins(root), []*cobra.Command{sub1}, cmpopts.IgnoreUnexported(cobra.Command{})) } +func TestHiddenPlugin(t *testing.T) { + root := &cobra.Command{Use: "root"} + sub1 := &cobra.Command{ + Use: "sub1", + Hidden: true, + Annotations: map[string]string{ + metadata.CommandAnnotationPlugin: "true", + }, + Run: func(cmd *cobra.Command, args []string) {}, + } + + sub1sub1 := &cobra.Command{Use: "sub1sub1"} + sub1sub2 := &cobra.Command{Use: "sub1sub2"} + sub2 := &cobra.Command{ + Use: "sub2", + Annotations: map[string]string{ + metadata.CommandAnnotationPlugin: "true", + }, + Run: func(cmd *cobra.Command, args []string) {}, + } + + root.AddCommand(sub1, sub2) + sub1.AddCommand(sub1sub1, sub1sub2) + + assert.DeepEqual(t, allManagementSubCommands(root), []*cobra.Command{sub2}, cmpopts.IgnoreFields(cobra.Command{}, "Run"), cmpopts.IgnoreUnexported(cobra.Command{})) +} + func TestCommandAliases(t *testing.T) { root := &cobra.Command{Use: "root"} sub := &cobra.Command{Use: "subcommand", Aliases: []string{"alias1", "alias2"}}