From 0d9621b1c71aea1c1b1b83759456a6770a6d93f8 Mon Sep 17 00:00:00 2001 From: Dejan K Date: Fri, 16 Jan 2026 10:37:54 +0100 Subject: [PATCH] fix: update docker-compose version detection to support future versions --- pkg/docker/docker_test.go | 17 +++-- pkg/executors/docker_compose_executor.go | 4 +- pkg/executors/docker_compose_executor_test.go | 70 +++++++++++++++++++ 3 files changed, 84 insertions(+), 7 deletions(-) diff --git a/pkg/docker/docker_test.go b/pkg/docker/docker_test.go index b9865791..5e610cb2 100644 --- a/pkg/docker/docker_test.go +++ b/pkg/docker/docker_test.go @@ -14,13 +14,18 @@ func Test__DockerComposeVersion(t *testing.T) { t.Skip() } - v1Version, err := DockerComposeCLIVersion() + // Test plugin version (v2+) - should have "v" prefix + pluginVersion, err := DockerComposePluginVersion() assert.NoError(t, err) - assert.Contains(t, v1Version, "1.") - - v2Version, err := DockerComposePluginVersion() - assert.NoError(t, err) - assert.Contains(t, v2Version, "v2.") + assert.True(t, len(pluginVersion) > 0 && pluginVersion[0] == 'v', + "Docker Compose plugin version should start with 'v', got: %s", pluginVersion) + + // Test legacy CLI version if available - should NOT have "v" prefix + cliVersion, err := DockerComposeCLIVersion() + if err == nil { + assert.True(t, len(cliVersion) > 0 && cliVersion[0] != 'v', + "Docker Compose CLI version should not start with 'v', got: %s", cliVersion) + } } func Test__NewDockerConfig(t *testing.T) { diff --git a/pkg/executors/docker_compose_executor.go b/pkg/executors/docker_compose_executor.go index 0da91f0a..32454397 100644 --- a/pkg/executors/docker_compose_executor.go +++ b/pkg/executors/docker_compose_executor.go @@ -206,7 +206,9 @@ func (e *DockerComposeExecutor) Start() int { } func (e *DockerComposeExecutor) composeExecutableAndArgs() (string, []string) { - if strings.HasPrefix(e.dockerComposeVersion, "v2") { + // Docker Compose plugin (v2+) returns versions with "v" prefix (e.g., v2.20.0, v5.0.0) + // Legacy standalone docker-compose (v1) returns versions without "v" prefix (e.g., 1.29.2) + if strings.HasPrefix(e.dockerComposeVersion, "v") { return "docker", []string{"compose"} } diff --git a/pkg/executors/docker_compose_executor_test.go b/pkg/executors/docker_compose_executor_test.go index 6d309a92..dd902f3a 100644 --- a/pkg/executors/docker_compose_executor_test.go +++ b/pkg/executors/docker_compose_executor_test.go @@ -184,3 +184,73 @@ func Test__DockerComposeExecutor__StopingRunningJob(t *testing.T) { "Exit Code: 1", }) } + +func Test__DockerComposeExecutor__composeExecutableAndArgs(t *testing.T) { + testCases := []struct { + name string + version string + expectedExec string + expectedArgs []string + }{ + { + name: "v1 legacy standalone", + version: "1.29.2", + expectedExec: "docker-compose", + expectedArgs: []string{}, + }, + { + name: "v2 plugin", + version: "v2.20.0", + expectedExec: "docker", + expectedArgs: []string{"compose"}, + }, + { + name: "v2 plugin with build metadata", + version: "v2.21.0-desktop.1", + expectedExec: "docker", + expectedArgs: []string{"compose"}, + }, + { + name: "v3 plugin", + version: "v3.0.0", + expectedExec: "docker", + expectedArgs: []string{"compose"}, + }, + { + name: "v4 plugin", + version: "v4.0.0", + expectedExec: "docker", + expectedArgs: []string{"compose"}, + }, + { + name: "v5 plugin", + version: "v5.0.0", + expectedExec: "docker", + expectedArgs: []string{"compose"}, + }, + { + name: "v5 plugin with build metadata", + version: "v5.1.0-desktop.1", + expectedExec: "docker", + expectedArgs: []string{"compose"}, + }, + { + name: "future v10 plugin", + version: "v10.0.0", + expectedExec: "docker", + expectedArgs: []string{"compose"}, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + e := &DockerComposeExecutor{ + dockerComposeVersion: tc.version, + } + + exec, args := e.composeExecutableAndArgs() + assert.Equal(t, tc.expectedExec, exec) + assert.Equal(t, tc.expectedArgs, args) + }) + } +}