diff --git a/cmd/docker/docker.go b/cmd/docker/docker.go index d781b688ca..f4b94652ec 100644 --- a/cmd/docker/docker.go +++ b/cmd/docker/docker.go @@ -103,6 +103,18 @@ func setupHelpCommand(dockerCli *command.DockerCli, rootCmd, helpCmd *cobra.Comm return err } + if len(args) > 0 { + helpcmd, err := pluginmanager.PluginRunCommand(dockerCli, args[0], rootCmd) + if err == nil { + err = helpcmd.Run() + if err != nil { + return err + } + } + if !pluginmanager.IsNotFound(err) { + return err + } + } if origRunE != nil { return origRunE(c, args) } diff --git a/e2e/cli-plugins/run_test.go b/e2e/cli-plugins/run_test.go index e4cd94d59a..34bd84c9a8 100644 --- a/e2e/cli-plugins/run_test.go +++ b/e2e/cli-plugins/run_test.go @@ -22,6 +22,19 @@ func TestRunNonexisting(t *testing.T) { golden.Assert(t, res.Stderr(), "docker-nonexistent-err.golden") } +// TestHelpNonexisting ensures correct behaviour when invoking help on a nonexistent plugin. +func TestHelpNonexisting(t *testing.T) { + run, cleanup := prepare(t) + defer cleanup() + + res := icmd.RunCmd(run("help", "nonexistent")) + res.Assert(t, icmd.Expected{ + ExitCode: 1, + }) + assert.Assert(t, is.Equal(res.Stdout(), "")) + golden.Assert(t, res.Stderr(), "docker-help-nonexistent-err.golden") +} + // TestRunBad ensures correct behaviour when running an existent but invalid plugin func TestRunBad(t *testing.T) { run, cleanup := prepare(t) @@ -35,6 +48,19 @@ func TestRunBad(t *testing.T) { golden.Assert(t, res.Stderr(), "docker-badmeta-err.golden") } +// TestHelpBad ensures correct behaviour when invoking help on a existent but invalid plugin. +func TestHelpBad(t *testing.T) { + run, cleanup := prepare(t) + defer cleanup() + + res := icmd.RunCmd(run("help", "badmeta")) + res.Assert(t, icmd.Expected{ + ExitCode: 1, + }) + assert.Assert(t, is.Equal(res.Stdout(), "")) + golden.Assert(t, res.Stderr(), "docker-help-badmeta-err.golden") +} + // TestRunGood ensures correct behaviour when running a valid plugin func TestRunGood(t *testing.T) { run, cleanup := prepare(t) @@ -47,6 +73,19 @@ func TestRunGood(t *testing.T) { }) } +// TestHelpGood ensures correct behaviour when invoking help on a +// valid plugin. A global argument is included to ensure it does not +// interfere. +func TestHelpGood(t *testing.T) { + run, cleanup := prepare(t) + defer cleanup() + + res := icmd.RunCmd(run("-D", "help", "helloworld")) + res.Assert(t, icmd.Success) + golden.Assert(t, res.Stdout(), "docker-help-helloworld.golden") + assert.Assert(t, is.Equal(res.Stderr(), "")) +} + // TestRunGoodSubcommand ensures correct behaviour when running a valid plugin with a subcommand func TestRunGoodSubcommand(t *testing.T) { run, cleanup := prepare(t) @@ -58,3 +97,16 @@ func TestRunGoodSubcommand(t *testing.T) { Out: "Goodbye World!", }) } + +// TestHelpGoodSubcommand ensures correct behaviour when invoking help on a +// valid plugin subcommand. A global argument is included to ensure it does not +// interfere. +func TestHelpGoodSubcommand(t *testing.T) { + run, cleanup := prepare(t) + defer cleanup() + + res := icmd.RunCmd(run("-D", "help", "helloworld", "goodbye")) + res.Assert(t, icmd.Success) + golden.Assert(t, res.Stdout(), "docker-help-helloworld-goodbye.golden") + assert.Assert(t, is.Equal(res.Stderr(), "")) +} diff --git a/e2e/cli-plugins/testdata/docker-help-badmeta-err.golden b/e2e/cli-plugins/testdata/docker-help-badmeta-err.golden new file mode 100644 index 0000000000..13a827f406 --- /dev/null +++ b/e2e/cli-plugins/testdata/docker-help-badmeta-err.golden @@ -0,0 +1 @@ +unknown help topic: badmeta diff --git a/e2e/cli-plugins/testdata/docker-help-helloworld-goodbye.golden b/e2e/cli-plugins/testdata/docker-help-helloworld-goodbye.golden new file mode 100644 index 0000000000..d789f7997f --- /dev/null +++ b/e2e/cli-plugins/testdata/docker-help-helloworld-goodbye.golden @@ -0,0 +1,4 @@ + +Usage: docker helloworld goodbye + +Say Goodbye instead of Hello diff --git a/e2e/cli-plugins/testdata/docker-help-helloworld.golden b/e2e/cli-plugins/testdata/docker-help-helloworld.golden new file mode 100644 index 0000000000..67390e6e44 --- /dev/null +++ b/e2e/cli-plugins/testdata/docker-help-helloworld.golden @@ -0,0 +1,9 @@ + +Usage: docker helloworld COMMAND + +A basic Hello World plugin for tests + +Commands: + goodbye Say Goodbye instead of Hello + +Run 'docker helloworld COMMAND --help' for more information on a command. diff --git a/e2e/cli-plugins/testdata/docker-help-nonexistent-err.golden b/e2e/cli-plugins/testdata/docker-help-nonexistent-err.golden new file mode 100644 index 0000000000..7a151caa3e --- /dev/null +++ b/e2e/cli-plugins/testdata/docker-help-nonexistent-err.golden @@ -0,0 +1 @@ +unknown help topic: nonexistent