diff --git a/cli-plugins/manager/hooks.go b/cli-plugins/manager/hooks.go index 7b45e2afd7..4d99e679b0 100644 --- a/cli-plugins/manager/hooks.go +++ b/cli-plugins/manager/hooks.go @@ -18,19 +18,20 @@ type HookPluginData struct { // which is currently being invoked. If a hook for `docker context` is // configured and the user executes `docker context ls`, the plugin will // be invoked with `context`. - RootCmd string - Flags map[string]string + RootCmd string + Flags map[string]string + CommandError string } // RunCLICommandHooks is the entrypoint into the hooks execution flow after // a main CLI command was executed. It calls the hook subcommand for all // present CLI plugins that declare support for hooks in their metadata and // parses/prints their responses. -func RunCLICommandHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command) { +func RunCLICommandHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command, cmdErrorMessage string) { commandName := strings.TrimPrefix(subCommand.CommandPath(), rootCmd.Name()+" ") flags := getCommandFlags(subCommand) - runHooks(dockerCli, rootCmd, subCommand, commandName, flags) + runHooks(dockerCli, rootCmd, subCommand, commandName, flags, cmdErrorMessage) } // RunPluginHooks is the entrypoint for the hooks execution flow @@ -39,16 +40,16 @@ func RunPluginHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command, a commandName := strings.Join(args, " ") flags := getNaiveFlags(args) - runHooks(dockerCli, rootCmd, subCommand, commandName, flags) + runHooks(dockerCli, rootCmd, subCommand, commandName, flags, "") } -func runHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command, invokedCommand string, flags map[string]string) { - nextSteps := invokeAndCollectHooks(dockerCli, rootCmd, subCommand, invokedCommand, flags) +func runHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command, invokedCommand string, flags map[string]string, cmdErrorMessage string) { + nextSteps := invokeAndCollectHooks(dockerCli, rootCmd, subCommand, invokedCommand, flags, cmdErrorMessage) hooks.PrintNextSteps(dockerCli.Err(), nextSteps) } -func invokeAndCollectHooks(dockerCli command.Cli, rootCmd, subCmd *cobra.Command, subCmdStr string, flags map[string]string) []string { +func invokeAndCollectHooks(dockerCli command.Cli, rootCmd, subCmd *cobra.Command, subCmdStr string, flags map[string]string, cmdErrorMessage string) []string { pluginsCfg := dockerCli.ConfigFile().Plugins if pluginsCfg == nil { return nil @@ -66,7 +67,11 @@ func invokeAndCollectHooks(dockerCli command.Cli, rootCmd, subCmd *cobra.Command continue } - hookReturn, err := p.RunHook(match, flags) + hookReturn, err := p.RunHook(HookPluginData{ + RootCmd: match, + Flags: flags, + CommandError: cmdErrorMessage, + }) if err != nil { // skip misbehaving plugins, but don't halt execution continue diff --git a/cli-plugins/manager/plugin.go b/cli-plugins/manager/plugin.go index 6e1ca9bbe5..2cffafacca 100644 --- a/cli-plugins/manager/plugin.go +++ b/cli-plugins/manager/plugin.go @@ -105,11 +105,8 @@ func newPlugin(c Candidate, cmds []*cobra.Command) (Plugin, error) { // RunHook executes the plugin's hooks command // and returns its unprocessed output. -func (p *Plugin) RunHook(cmdName string, flags map[string]string) ([]byte, error) { - hDataBytes, err := json.Marshal(HookPluginData{ - RootCmd: cmdName, - Flags: flags, - }) +func (p *Plugin) RunHook(hookData HookPluginData) ([]byte, error) { + hDataBytes, err := json.Marshal(hookData) if err != nil { return nil, wrapAsPluginError(err, "failed to marshall hook data") } diff --git a/cmd/docker/docker.go b/cmd/docker/docker.go index e6bba05622..b87c24fba7 100644 --- a/cmd/docker/docker.go +++ b/cmd/docker/docker.go @@ -357,7 +357,11 @@ func runDocker(ctx context.Context, dockerCli *command.DockerCli) error { // If the command is being executed in an interactive terminal // and hook are enabled, run the plugin hooks. if dockerCli.HooksEnabled() && dockerCli.Out().IsTerminal() && subCommand != nil { - pluginmanager.RunCLICommandHooks(dockerCli, cmd, subCommand) + var errMessage string + if err != nil { + errMessage = err.Error() + } + pluginmanager.RunCLICommandHooks(dockerCli, cmd, subCommand, errMessage) } return err