package trust import ( "fmt" "github.com/docker/cli-docs-tool/annotation" "github.com/docker/cli/cli" "github.com/docker/cli/cli-plugins/plugin" "github.com/docker/cli/cli/command" "github.com/docker/cli/cli/debug" cliflags "github.com/docker/cli/cli/flags" "github.com/spf13/cobra" "github.com/spf13/pflag" ) func NewRootCmd(name string, isPlugin bool, dockerCLI *command.DockerCli) *cobra.Command { var opt rootOptions cmd := &cobra.Command{ Use: name, Short: "Manage trust on Docker images", Long: `Extended build capabilities with BuildKit`, Annotations: map[string]string{ annotation.CodeDelimiter: `"`, }, CompletionOptions: cobra.CompletionOptions{ HiddenDefaultCmd: true, }, PersistentPreRunE: func(cmd *cobra.Command, args []string) error { if opt.debug { debug.Enable() } // cmd.SetContext(appcontext.Context()) if !isPlugin { // InstallFlags and SetDefaultOptions are necessary to match // the plugin mode behavior to handle env vars such as // DOCKER_TLS, DOCKER_TLS_VERIFY, ... and we also need to use a // new flagset to avoid conflict with the global debug flag // that we already handle in the root command otherwise it // would panic. nflags := pflag.NewFlagSet(cmd.DisplayName(), pflag.ContinueOnError) options := cliflags.NewClientOptions() options.InstallFlags(nflags) options.SetDefaultOptions(nflags) return dockerCLI.Initialize(options) } return plugin.PersistentPreRunE(cmd, args) }, RunE: func(cmd *cobra.Command, args []string) error { if len(args) == 0 { return cmd.Help() } _ = cmd.Help() return cli.StatusError{ StatusCode: 1, Status: fmt.Sprintf("ERROR: unknown command: %q", args[0]), } }, } if !isPlugin { // match plugin behavior for standalone mode // https://github.com/docker/cli/blob/6c9eb708fa6d17765d71965f90e1c59cea686ee9/cli-plugins/plugin/plugin.go#L117-L127 cmd.SilenceUsage = true cmd.SilenceErrors = true cmd.TraverseChildren = true cmd.DisableFlagsInUseLine = true } cmd.AddCommand( newRevokeCommand(dockerCLI), newSignCommand(dockerCLI), newTrustKeyCommand(dockerCLI), newTrustSignerCommand(dockerCLI), newInspectCommand(dockerCLI), ) return cmd } type rootOptions struct { debug bool }