Skip to content

Commit b47c181

Browse files
fix: show swarm init help instead of docker-init plugin help
When the docker-init CLI plugin is installed, `docker swarm init --help` incorrectly delegated to the plugin because help handling matched on the command name "init" without checking whether the target was a plugin stub. Fixes #4400 Co-authored-by: Cursor <cursoragent@cursor.com> Signed-off-by: Hernan Garcia <hernan.garcia@alpaca.markets>
1 parent 0f83ace commit b47c181

2 files changed

Lines changed: 44 additions & 9 deletions

File tree

cmd/docker/docker.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -229,14 +229,11 @@ func setupHelpCommand(dockerCli command.Cli, rootCmd, helpCmd *cobra.Command) {
229229
}
230230
}
231231

232-
func tryRunPluginHelp(dockerCli command.Cli, ccmd *cobra.Command, cargs []string) error {
233-
root := ccmd.Root()
234-
235-
cmd, _, err := root.Traverse(cargs)
236-
if err != nil {
237-
return err
232+
func tryRunPluginHelp(dockerCli command.Cli, ccmd *cobra.Command) error {
233+
if !pluginmanager.IsPluginCommand(ccmd) {
234+
return errdefs.ErrNotFound
238235
}
239-
helpcmd, err := pluginmanager.PluginRunCommand(dockerCli, cmd.Name(), root)
236+
helpcmd, err := pluginmanager.PluginRunCommand(dockerCli, ccmd.Name(), ccmd.Root())
240237
if err != nil {
241238
return err
242239
}
@@ -251,8 +248,8 @@ func setHelpFunc(dockerCli command.Cli, cmd *cobra.Command) {
251248
return
252249
}
253250

254-
if len(args) >= 1 {
255-
err := tryRunPluginHelp(dockerCli, ccmd, args)
251+
if pluginmanager.IsPluginCommand(ccmd) {
252+
err := tryRunPluginHelp(dockerCli, ccmd)
256253
if err == nil {
257254
return
258255
}

cmd/docker/docker_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"fmt"
88
"io"
99
"os"
10+
"path/filepath"
11+
"strings"
1012
"syscall"
1113
"testing"
1214
"time"
@@ -205,3 +207,39 @@ func TestVisitAll(t *testing.T) {
205207
expected := []string{"sub1sub1", "sub1sub2", "sub1", "sub2", "root"}
206208
assert.DeepEqual(t, expected, visited)
207209
}
210+
211+
func TestSwarmInitHelpNotDelegatedToInitPlugin(t *testing.T) {
212+
tmpDir := t.TempDir()
213+
pluginScript := `#!/bin/sh
214+
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
215+
echo "PLUGIN INIT HELP"
216+
exit 0
217+
fi
218+
printf '%s' '{"SchemaVersion":"0.1.0","ShortDescription":"Docker Init"}'
219+
`
220+
pluginPath := filepath.Join(tmpDir, "docker-init")
221+
err := os.WriteFile(pluginPath, []byte(pluginScript), 0o755)
222+
assert.NilError(t, err)
223+
224+
var b bytes.Buffer
225+
ctx := context.Background()
226+
cli, err := command.NewDockerCli(
227+
command.WithBaseContext(ctx),
228+
command.WithCombinedStreams(&b),
229+
)
230+
assert.NilError(t, err)
231+
cli.ConfigFile().CLIPluginsExtraDirs = []string{tmpDir}
232+
233+
tcmd := newDockerCommand(cli)
234+
tcmd.SetArgs([]string{"swarm", "init", "--help"})
235+
cmd, args, err := tcmd.HandleGlobalFlags()
236+
assert.NilError(t, err)
237+
assert.NilError(t, tcmd.Initialize())
238+
cmd.SetArgs(args)
239+
err = cmd.Execute()
240+
assert.NilError(t, err)
241+
242+
out := b.String()
243+
assert.Assert(t, is.Contains(out, "Initialize a swarm"))
244+
assert.Assert(t, !strings.Contains(out, "PLUGIN INIT HELP"), "output: %s", out)
245+
}

0 commit comments

Comments
 (0)