From 561a6b61ad147ff2315693d44e8899d94e93177f Mon Sep 17 00:00:00 2001 From: Hiepiscus Date: Fri, 21 Aug 2026 21:48:54 +0200 Subject: [PATCH 1/6] #2345: add Linux support for Docker Desktop with version selection --- .../devonfw/tools/ide/tool/docker/Docker.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java index 6cfefde1e6..bd67a9d5a5 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java @@ -35,6 +35,10 @@ public class Docker extends GlobalToolCommandlet { private static final Pattern DOCKER_DESKTOP_VERSION_PATTERN = Pattern.compile("^([0-9]+(?:\\.[0-9]+){1,2})"); + private static final String EDITION_DOCKER = "docker"; + + private static final String EDITION_DOCKER = "docker"; + /** * The constructor. * @@ -70,6 +74,32 @@ private String detectContainerRuntime() { @Override protected List getNativePackages() { + + if (EDITION_DOCKER.equals(getConfiguredEdition())) { + return List.of( + new NativePackage( + NativePackageManager.APT, + List.of("/tmp/docker-desktop-amd64.deb"), + List.of("--allow-downgrades"), + List.of( + "sudo install -m 0755 -d /etc/apt/keyrings", + "sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc", + "sudo chmod a+r /etc/apt/keyrings/docker.asc", + "echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] " + + "https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \\\"$VERSION_CODENAME\\\") stable\" | " + + "sudo tee /etc/apt/sources.list.d/docker.list > /dev/null", + "sudo apt update", + "curl -fsSL https://desktop.docker.com/linux/main/amd64/docker-desktop-amd64.deb -o /tmp/docker-desktop-amd64.deb" + ), + List.of( + "sudo rm -f /etc/apt/sources.list.d/docker.list", + "sudo rm -f /etc/apt/keyrings/docker.asc", + "rm -f /tmp/docker-desktop-amd64.deb" + ) + ) + ); + } + return List.of( new NativePackage( NativePackageManager.ZYPPER, @@ -129,6 +159,49 @@ public boolean isExtract() { }; } + @Override + protected List getInstallPackageManagerCommands() { + + String edition = getConfiguredEdition(); + ToolRepository toolRepository = getToolRepository(); + VersionIdentifier configuredVersion = getConfiguredVersion(); + String resolvedVersion = toolRepository.resolveVersion(this.tool, edition, configuredVersion, this).toString(); + + if (EDITION_DOCKER.equals(edition)) { + return getInstallPackageManagerCommandsDockerDesktop(resolvedVersion); + } + + return getInstallPackageManagerCommandsRancherDesktop(resolvedVersion); + } + + private List getInstallPackageManagerCommandsRancherDesktop(String resolvedVersion) { + + return List.of(new PackageManagerCommand(NativePackageManager.ZYPPER, List.of( + "sudo zypper addrepo https://download.opensuse.org/repositories/isv:/Rancher:/stable/rpm/isv:Rancher:stable.repo", + String.format("sudo zypper --no-gpg-checks install rancher-desktop=%s*", resolvedVersion))), + new PackageManagerCommand(NativePackageManager.APT, List.of( + "curl -s https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/Release.key | gpg --dearmor |" + + " sudo dd status=none of=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg", + "echo 'deb [signed-by=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg]" + + " https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/ ./' |" + + " sudo dd status=none of=/etc/apt/sources.list.d/isv-rancher-stable.list", "sudo apt update", + String.format("sudo apt install -y --allow-downgrades rancher-desktop=%s*", resolvedVersion)))); + } + + private List getInstallPackageManagerCommandsDockerDesktop(String resolvedVersion) { + + return List.of(new PackageManagerCommand(NativePackageManager.APT, List.of( + "sudo install -m 0755 -d /etc/apt/keyrings", + "sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc", + "sudo chmod a+r /etc/apt/keyrings/docker.asc", + "echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]" + + " https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \\\"$VERSION_CODENAME\\\") stable\" |" + + " sudo tee /etc/apt/sources.list.d/docker.list > /dev/null", + "sudo apt update", + "curl -fsSL https://desktop.docker.com/linux/main/amd64/docker-desktop-amd64.deb -o /tmp/docker-desktop-amd64.deb", + String.format("sudo apt install -y --allow-downgrades rancher-desktop=%s*", resolvedVersion)))); + } + @Override protected EditionAndVersion computeInstalledEditionAndVersion() { From 1f550adbfe3132b5955eab7d9f94d098b9f567cb Mon Sep 17 00:00:00 2001 From: Hiepiscus Date: Fri, 21 Aug 2026 21:49:50 +0200 Subject: [PATCH 2/6] #2345: fix DockerDesktopUrlUpdater --- .../url/tool/docker/DockerDesktopUrlUpdater.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java index 01417d03e3..70fb6c7a9a 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java @@ -1,5 +1,6 @@ package com.devonfw.tools.ide.url.tool.docker; + import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -39,17 +40,14 @@ public String getTool() { protected void addVersion(UrlVersion urlVersion) { VersionIdentifier vid = VersionIdentifier.of(urlVersion.getName()); - String version = urlVersion.getName().replaceAll("\\.", ""); - // get Code for version String body = doGetResponseBodyAsString(getVersionUrl()); - String regex = "href=#" + version - // .......1.........................................................2................. - + ".{8,12}(\r\n|\r|\n).{0,350}href=https://desktop\\.docker\\.com.*?(\\d{5,6}).*\\.exe"; + String regex = "## " + Pattern.quote(urlVersion.getName()) + + ".*?\\[Windows\\(https://desktop\\.docker\\.com/win/main/amd64/(\\d{5,6})/"; Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); Matcher matcher = pattern.matcher(body); - String code; + if (matcher.find()) { - code = matcher.group(2); + String code = matcher.group(1); boolean success = doAddVersion(urlVersion, getDownloadBaseUrl() + "/win/main/amd64/" + code + "/Docker%20Desktop%20Installer.exe", WINDOWS); if (!success) { @@ -58,6 +56,7 @@ protected void addVersion(UrlVersion urlVersion) { if (WINDOWS_ONLY_VERSIONS.stream().noneMatch(i -> vid.compareVersion(i).isEqual())) { doAddVersion(urlVersion, getDownloadBaseUrl() + "/mac/main/amd64/" + code + "/Docker.dmg", MAC, X64); doAddVersion(urlVersion, getDownloadBaseUrl() + "/mac/main/arm64/" + code + "/Docker.dmg", MAC, ARM64); + doAddVersion(urlVersion, getDownloadBaseUrl() + "/linux/main/amd64/" + code + "/docker-desktop-amd64.deb", LINUX); } } } @@ -65,7 +64,7 @@ protected void addVersion(UrlVersion urlVersion) { @Override protected String getVersionUrl() { - return getVersionBaseUrl() + "/desktop/release-notes/"; + return getVersionBaseUrl() + "/desktop/release-notes.md"; } @Override From 6e48fe22d35d290d7e52822d6b624b3ae272032a Mon Sep 17 00:00:00 2001 From: Hiepiscus Date: Mon, 24 Aug 2026 12:42:55 +0200 Subject: [PATCH 3/6] #2345: fix regex --- .../tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java index 70fb6c7a9a..39a9ff871f 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/docker/DockerDesktopUrlUpdater.java @@ -42,7 +42,7 @@ protected void addVersion(UrlVersion urlVersion) { VersionIdentifier vid = VersionIdentifier.of(urlVersion.getName()); String body = doGetResponseBodyAsString(getVersionUrl()); String regex = "## " + Pattern.quote(urlVersion.getName()) - + ".*?\\[Windows\\(https://desktop\\.docker\\.com/win/main/amd64/(\\d{5,6})/"; + + ".*?\\[Windows]\\(https://desktop\\.docker\\.com/win/main/amd64/(\\d{5,6})/"; Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); Matcher matcher = pattern.matcher(body); From 143440a47fec1632c2880d51f1a7b0cded07330c Mon Sep 17 00:00:00 2001 From: Hiepiscus Date: Tue, 25 Aug 2026 09:50:27 +0200 Subject: [PATCH 4/6] #2345: Install docker-desktop from .deb --- .../devonfw/tools/ide/tool/docker/Docker.java | 46 +++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java index bd67a9d5a5..a76da4839c 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java @@ -1,5 +1,6 @@ package com.devonfw.tools.ide.tool.docker; +import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.Set; @@ -16,6 +17,8 @@ import com.devonfw.tools.ide.tool.GlobalToolCommandlet; import com.devonfw.tools.ide.tool.NativePackage; import com.devonfw.tools.ide.tool.NativePackageManager; +import com.devonfw.tools.ide.tool.PackageManagerCommand; +import com.devonfw.tools.ide.tool.repository.ToolRepository; import com.devonfw.tools.ide.tool.ToolEdition; import com.devonfw.tools.ide.tool.ToolEditionAndVersion; import com.devonfw.tools.ide.version.VersionIdentifier; @@ -79,22 +82,12 @@ protected List getNativePackages() { return List.of( new NativePackage( NativePackageManager.APT, - List.of("/tmp/docker-desktop-amd64.deb"), + List.of("docker-desktop"), List.of("--allow-downgrades"), - List.of( - "sudo install -m 0755 -d /etc/apt/keyrings", - "sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc", - "sudo chmod a+r /etc/apt/keyrings/docker.asc", - "echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] " - + "https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \\\"$VERSION_CODENAME\\\") stable\" | " - + "sudo tee /etc/apt/sources.list.d/docker.list > /dev/null", - "sudo apt update", - "curl -fsSL https://desktop.docker.com/linux/main/amd64/docker-desktop-amd64.deb -o /tmp/docker-desktop-amd64.deb" - ), + List.of(), List.of( "sudo rm -f /etc/apt/sources.list.d/docker.list", - "sudo rm -f /etc/apt/keyrings/docker.asc", - "rm -f /tmp/docker-desktop-amd64.deb" + "sudo rm -f /etc/apt/keyrings/docker.asc" ) ) ); @@ -149,6 +142,33 @@ protected ToolEditionAndVersion adjustRequestedEdition(ToolEditionAndVersion req return requested; } + @Override + protected List getInstallPackageManagerCommands(VersionIdentifier resolvedVersion) { + if (!EDITION_DOCKER.equals(getConfiguredEdition())) { + return super.getInstallPackageManagerCommands(resolvedVersion); + } + + ToolRepository toolRepository = this.context.getDefaultToolRepository(); + Path downloadedDeb = toolRepository.download(this.tool, EDITION_DOCKER, resolvedVersion, this); + + NativePackage dockerDesktopInstallPackage = new NativePackage( + NativePackageManager.APT, + List.of(downloadedDeb.toString()), + List.of("--allow-downgrades"), + List.of( + "sudo install -m 0755 -d /etc/apt/keyrings", + "sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc", + "sudo chmod a+r /etc/apt/keyrings/docker.asc", + "echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] " + + "https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \\\"$VERSION_CODENAME\\\") stable\" | " + + "sudo tee /etc/apt/sources.list.d/docker.list > /dev/null", + "sudo apt update" + ), + List.of() + ); + return List.of(dockerDesktopInstallPackage.install(null)); + } + @Override public boolean isExtract() { From d04f30933e1612e14a9f309c59ad740abb6c45c5 Mon Sep 17 00:00:00 2001 From: Hiepiscus Date: Thu, 3 Sep 2026 15:37:05 +0200 Subject: [PATCH 5/6] #2345: Add optional artifact paths to NativePackage --- .../devonfw/tools/ide/tool/NativePackage.java | 14 ++- .../tools/ide/tool/NativePackageManager.java | 10 +- .../devonfw/tools/ide/tool/docker/Docker.java | 100 ++++++------------ .../tools/ide/tool/pgadmin/PgAdmin.java | 5 +- .../ide/tool/GlobalToolCommandletTest.java | 3 +- .../ide/tool/NativePackageManagerTest.java | 71 +++++++++++-- .../tools/ide/tool/NativePackageTest.java | 6 +- 7 files changed, 125 insertions(+), 84 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackage.java b/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackage.java index 8156b97618..4eba6bb31e 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackage.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackage.java @@ -13,6 +13,7 @@ public class NativePackage { private final List extraInstallOptions; private final List setupCommands; private final List cleanupCommands; + private final List optionalNativePackageArtifactPaths; /** * Creates a new {@link NativePackage} with optional fields defaulting to empty lists. @@ -22,14 +23,16 @@ public class NativePackage { * @param extraInstallOptions extra install options (optional) * @param setupCommands commands to run before install (optional) * @param cleanupCommands commands to run after uninstall (optional) + * @param optionalNativePackageArtifactPaths paths to local package artifacts (optional) */ public NativePackage(NativePackageManager pm, List packages, - List extraInstallOptions, List setupCommands, List cleanupCommands) { + List extraInstallOptions, List setupCommands, List cleanupCommands, List optionalNativePackageArtifactPaths) { this.packageManager = Objects.requireNonNull(pm, "package manager must not be null"); this.packages = List.copyOf(Objects.requireNonNull(packages, "packages must not be null")); this.extraInstallOptions = extraInstallOptions != null ? List.copyOf(extraInstallOptions) : List.of(); this.setupCommands = setupCommands != null ? List.copyOf(setupCommands) : List.of(); this.cleanupCommands = cleanupCommands != null ? List.copyOf(cleanupCommands) : List.of(); + this.optionalNativePackageArtifactPaths = optionalNativePackageArtifactPaths != null ? List.copyOf(optionalNativePackageArtifactPaths) : List.of(); } /** @@ -39,7 +42,7 @@ public NativePackage(NativePackageManager pm, List packages, * @param packages the packages that need to be handled */ public NativePackage(NativePackageManager pm, List packages) { - this(pm, packages, null, null, null); + this(pm, packages, null, null, null, null); } /** @@ -88,6 +91,13 @@ public List getCleanupCommands() { return cleanupCommands; } + /** + * @return set {@link optionalNativePackageArtifactPaths}. + */ + public List getOptionalNativePackageArtifactPath() { + return optionalNativePackageArtifactPaths; + } + /** * @param version the version to pin the {@link #getPackages()} to or {@code null} to install the latest available version. * @return {@link PackageManagerCommand} for installation. diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackageManager.java b/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackageManager.java index 614cef4c67..35cf84ab02 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackageManager.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackageManager.java @@ -183,8 +183,14 @@ public PackageManagerCommand install(NativePackage nativePackage, String version command.append(' ').append(option); } command.append(' ').append(this.installCommand); - for (String pkg : nativePackage.getPackages()) { - command.append(' ').append(getPackageSpec(pkg, version)); + if (nativePackage.getOptionalNativePackageArtifactPath().isEmpty()) { + for (String pkg : nativePackage.getPackages()) { + command.append(' ').append(getPackageSpec(pkg, version)); + } + } else { + for (String nativePackageArtifactPath : nativePackage.getOptionalNativePackageArtifactPath()) { + command.append(' ').append(nativePackageArtifactPath); + } } commands.add(command.toString()); return new PackageManagerCommand(this, commands); diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java index a76da4839c..c04a3df498 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java @@ -18,6 +18,8 @@ import com.devonfw.tools.ide.tool.NativePackage; import com.devonfw.tools.ide.tool.NativePackageManager; import com.devonfw.tools.ide.tool.PackageManagerCommand; +import com.devonfw.tools.ide.tool.ToolInstallRequest; +import com.devonfw.tools.ide.tool.ToolInstallation; import com.devonfw.tools.ide.tool.repository.ToolRepository; import com.devonfw.tools.ide.tool.ToolEdition; import com.devonfw.tools.ide.tool.ToolEditionAndVersion; @@ -40,7 +42,7 @@ public class Docker extends GlobalToolCommandlet { private static final String EDITION_DOCKER = "docker"; - private static final String EDITION_DOCKER = "docker"; + private Path downloadedDebPackageForDocker; /** * The constructor. @@ -79,16 +81,28 @@ private String detectContainerRuntime() { protected List getNativePackages() { if (EDITION_DOCKER.equals(getConfiguredEdition())) { + + List artifactPaths = (this.downloadedDebPackageForDocker == null) ? List.of() : List.of(this.downloadedDebPackageForDocker.toString()); + return List.of( new NativePackage( NativePackageManager.APT, List.of("docker-desktop"), List.of("--allow-downgrades"), - List.of(), + List.of( + "sudo install -m 0755 -d /etc/apt/keyrings", + "sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc", + "sudo chmod a+r /etc/apt/keyrings/docker.asc", + "echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] " + + "https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \\\"$VERSION_CODENAME\\\") stable\" | " + + "sudo tee /etc/apt/sources.list.d/docker.list > /dev/null", + "sudo apt update" + ), List.of( "sudo rm -f /etc/apt/sources.list.d/docker.list", "sudo rm -f /etc/apt/keyrings/docker.asc" - ) + ), + artifactPaths ) ); } @@ -99,6 +113,7 @@ protected List getNativePackages() { List.of("rancher-desktop"), List.of("--no-gpg-checks"), List.of("sudo zypper addrepo https://download.opensuse.org/repositories/isv:/Rancher:/stable/rpm/isv:Rancher:stable.repo"), + null, null ), new NativePackage( @@ -116,7 +131,8 @@ protected List getNativePackages() { List.of( "sudo rm -f /etc/apt/sources.list.d/isv-rancher-stable.list", "sudo rm -f /usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg" - ) + ), + null ), new NativePackage(NativePackageManager.YAY, List.of("rancher-desktop")), new NativePackage(NativePackageManager.BREW_CASK, List.of("docker")) @@ -142,31 +158,26 @@ protected ToolEditionAndVersion adjustRequestedEdition(ToolEditionAndVersion req return requested; } + @Override + protected ToolInstallation doInstall(ToolInstallRequest request) { + if (EDITION_DOCKER.equals(getConfiguredEdition())) { + downloadDebPackageStepAndSetPackagePath(request.getRequested().getResolvedVersion()); + } + return super.doInstall(request); + } + + private void downloadDebPackageStepAndSetPackagePath(VersionIdentifier resolvedVersion) { + ToolRepository toolRepository = this.context.getDefaultToolRepository(); + this.downloadedDebPackageForDocker = toolRepository.download(this.tool, EDITION_DOCKER, resolvedVersion, this); + } + @Override protected List getInstallPackageManagerCommands(VersionIdentifier resolvedVersion) { if (!EDITION_DOCKER.equals(getConfiguredEdition())) { return super.getInstallPackageManagerCommands(resolvedVersion); } - ToolRepository toolRepository = this.context.getDefaultToolRepository(); - Path downloadedDeb = toolRepository.download(this.tool, EDITION_DOCKER, resolvedVersion, this); - - NativePackage dockerDesktopInstallPackage = new NativePackage( - NativePackageManager.APT, - List.of(downloadedDeb.toString()), - List.of("--allow-downgrades"), - List.of( - "sudo install -m 0755 -d /etc/apt/keyrings", - "sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc", - "sudo chmod a+r /etc/apt/keyrings/docker.asc", - "echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] " - + "https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \\\"$VERSION_CODENAME\\\") stable\" | " - + "sudo tee /etc/apt/sources.list.d/docker.list > /dev/null", - "sudo apt update" - ), - List.of() - ); - return List.of(dockerDesktopInstallPackage.install(null)); + return getNativePackages().stream().map(nativePackage -> nativePackage.install(null)).toList(); } @Override @@ -179,49 +190,6 @@ public boolean isExtract() { }; } - @Override - protected List getInstallPackageManagerCommands() { - - String edition = getConfiguredEdition(); - ToolRepository toolRepository = getToolRepository(); - VersionIdentifier configuredVersion = getConfiguredVersion(); - String resolvedVersion = toolRepository.resolveVersion(this.tool, edition, configuredVersion, this).toString(); - - if (EDITION_DOCKER.equals(edition)) { - return getInstallPackageManagerCommandsDockerDesktop(resolvedVersion); - } - - return getInstallPackageManagerCommandsRancherDesktop(resolvedVersion); - } - - private List getInstallPackageManagerCommandsRancherDesktop(String resolvedVersion) { - - return List.of(new PackageManagerCommand(NativePackageManager.ZYPPER, List.of( - "sudo zypper addrepo https://download.opensuse.org/repositories/isv:/Rancher:/stable/rpm/isv:Rancher:stable.repo", - String.format("sudo zypper --no-gpg-checks install rancher-desktop=%s*", resolvedVersion))), - new PackageManagerCommand(NativePackageManager.APT, List.of( - "curl -s https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/Release.key | gpg --dearmor |" - + " sudo dd status=none of=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg", - "echo 'deb [signed-by=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg]" - + " https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/ ./' |" - + " sudo dd status=none of=/etc/apt/sources.list.d/isv-rancher-stable.list", "sudo apt update", - String.format("sudo apt install -y --allow-downgrades rancher-desktop=%s*", resolvedVersion)))); - } - - private List getInstallPackageManagerCommandsDockerDesktop(String resolvedVersion) { - - return List.of(new PackageManagerCommand(NativePackageManager.APT, List.of( - "sudo install -m 0755 -d /etc/apt/keyrings", - "sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc", - "sudo chmod a+r /etc/apt/keyrings/docker.asc", - "echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]" - + " https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \\\"$VERSION_CODENAME\\\") stable\" |" - + " sudo tee /etc/apt/sources.list.d/docker.list > /dev/null", - "sudo apt update", - "curl -fsSL https://desktop.docker.com/linux/main/amd64/docker-desktop-amd64.deb -o /tmp/docker-desktop-amd64.deb", - String.format("sudo apt install -y --allow-downgrades rancher-desktop=%s*", resolvedVersion)))); - } - @Override protected EditionAndVersion computeInstalledEditionAndVersion() { diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java b/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java index 0c01627137..f4489ecec8 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java @@ -42,8 +42,9 @@ protected List getNativePackages() { "sudo sh -c 'echo \"deb [signed-by=/usr/share/keyrings/packages-pgadmin-org.gpg] " + "https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main\" " + "> /etc/apt/sources.list.d/pgadmin4.list && apt update'"), - List.of("sudo rm -f /etc/apt/sources.list.d/pgadmin4.list", "sudo rm -f /usr/share/keyrings/packages-pgadmin-org.gpg") - ), + List.of("sudo rm -f /etc/apt/sources.list.d/pgadmin4.list", "sudo rm -f /usr/share/keyrings/packages-pgadmin-org.gpg"), + null + ), new NativePackage(NativePackageManager.BREW_CASK, List.of("pgadmin4")) ); } diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/GlobalToolCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/GlobalToolCommandletTest.java index aace8b766a..db8d69f2f1 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/GlobalToolCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/GlobalToolCommandletTest.java @@ -173,7 +173,8 @@ protected List getNativePackages() { List.of("mytool"), List.of(), List.of(), - List.of("sudo rm -f /etc/apt/sources.list.d/mytool.list")) + List.of("sudo rm -f /etc/apt/sources.list.d/mytool.list"), + List.of()) ); } diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageManagerTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageManagerTest.java index 69e7d0f545..7231206dba 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageManagerTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageManagerTest.java @@ -23,7 +23,8 @@ void testAptInstallCommand() { "sudo apt update"), List.of( "sudo rm -f /etc/apt/sources.list.d/example.list", - "sudo rm -f /usr/share/keyrings/example.gpg")); + "sudo rm -f /usr/share/keyrings/example.gpg"), + List.of()); var cmd = NativePackageManager.APT.install(np, "1.0.0"); @@ -47,7 +48,8 @@ void testAptUninstallCommand() { "sudo apt update"), List.of( "sudo rm -f /etc/apt/sources.list.d/example.list", - "sudo rm -f /usr/share/keyrings/example.gpg")); + "sudo rm -f /usr/share/keyrings/example.gpg"), + List.of()); var cmd = NativePackageManager.APT.uninstall(np); @@ -68,7 +70,8 @@ void testZypperInstallCommand() { "sudo zypper addrepo https://example.com/repo.repo", "sudo zypper refresh"), List.of( - "sudo zypper removerepo example-repo")); + "sudo zypper removerepo example-repo"), + List.of()); var cmd = NativePackageManager.ZYPPER.install(np, "1.0.0"); @@ -89,7 +92,8 @@ void testZypperUninstallCommand() { "sudo zypper addrepo https://example.com/repo.repo", "sudo zypper refresh"), List.of( - "sudo zypper removerepo example-repo")); + "sudo zypper removerepo example-repo"), + List.of()); var cmd = NativePackageManager.ZYPPER.uninstall(np); @@ -109,7 +113,8 @@ void testYumInstallCommand() { "sudo yum-config-manager --add-repo https://example.com/repo.repo", "sudo yum makecache"), List.of( - "sudo rm -f /etc/yum.repos.d/example.repo")); + "sudo rm -f /etc/yum.repos.d/example.repo"), + List.of()); var cmd = NativePackageManager.YUM.install(np, "1.0.0"); @@ -127,7 +132,8 @@ void testYumUninstallCommand() { List.of("pkg1"), List.of("--skip-broken"), List.of("sudo yum-config-manager --add-repo https://example.com/repo.repo", "sudo yum makecache"), - List.of("sudo rm -f /etc/yum.repos.d/example.repo")); + List.of("sudo rm -f /etc/yum.repos.d/example.repo"), + List.of()); var cmd = NativePackageManager.YUM.uninstall(np); @@ -143,7 +149,8 @@ void testDnfInstallCommand() { List.of("pkg1"), List.of("--refresh"), List.of("sudo dnf config-manager addrepo --from-repofile=https://example.com/repo.repo", "sudo dnf makecache"), - List.of("sudo rm -f /etc/yum.repos.d/example.repo")); + List.of("sudo rm -f /etc/yum.repos.d/example.repo"), + List.of()); var cmd = NativePackageManager.DNF.install(np, "1.0.0"); @@ -159,7 +166,8 @@ void testDnfUninstallCommand() { List.of("pkg1"), List.of("--refresh"), List.of("sudo dnf config-manager addrepo --from-repofile=https://example.com/repo.repo", "sudo dnf makecache"), - List.of("sudo rm -f /etc/yum.repos.d/example.repo")); + List.of("sudo rm -f /etc/yum.repos.d/example.repo"), + List.of()); var cmd = NativePackageManager.DNF.uninstall(np); @@ -213,6 +221,53 @@ void testParseVersionQueryOutputForRpmBasedPackageManager() { assertThat(NativePackageManager.DNF.parseVersionQueryOutput("1.0.0")).isEqualTo("1.0.0"); } + @Test + void installUsesPackageNameAndVersionWhenNoArtifactPathConfigured() { + NativePackage nativePackage = new NativePackage(NativePackageManager.APT, List.of("docker-desktop")); + PackageManagerCommand result = NativePackageManager.APT.install(nativePackage, "1.2.3"); + + List commands = result.commands(); + String installCommand = commands.getLast(); + assertThat(installCommand).contains("apt", "install -y", "docker-desktop=1.2.3*"); + assertThat(installCommand).doesNotContain(".deb"); + } + + @Test + void installUsesArtifactPathWhenConfiguredInsteadOfPackageName() { + String debPath = "/tmp/downloads/docker-desktop-4.34.0-amd64"; + + NativePackage nativePackage = new NativePackage(NativePackageManager.APT, List.of("docker-desktop"), null, null, null, List.of(debPath)); + + PackageManagerCommand result = NativePackageManager.APT.install(nativePackage, null); + + List commands = result.commands(); + String installCommand = commands.getLast(); + assertThat(installCommand).contains(debPath); + assertThat(installCommand).doesNotContain("docker-desktop="); + } + + @Test + void installFallsBackToPackagesWhenArtifactPathListIsEmpty() { + NativePackage nativePackage = new NativePackage(NativePackageManager.APT, List.of("docker-desktop"), null, null, null, List.of()); + + PackageManagerCommand result = NativePackageManager.APT.install(nativePackage, null); + + List commands = result.commands(); + String installCommand = commands.getLast(); + assertThat(installCommand).contains("docker-desktop"); + } + + @Test + void installRejectsMismatchingPackageManager() { + NativePackage nativePackage = new NativePackage(NativePackageManager.APT, List.of("docker-desktop"), null, null, null, List.of()); + + PackageManagerCommand result = NativePackageManager.APT.install(nativePackage, null); + + List commands = result.commands(); + String installCommand = commands.getLast(); + assertThat(installCommand).contains("docker-desktop"); + } + @Test void testBrewInstallAndUninstallCommandsDoNotUseSudo() { NativePackage np = NativePackage.of(NativePackageManager.BREW, "pkg1"); diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageTest.java index 3ba939304c..d679d06190 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageTest.java @@ -24,7 +24,7 @@ void testOfFactoryMethod() { @Test void testConstructorWithAllFields() { - NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), List.of("--opt"), List.of("setup"), List.of("cleanup")); + NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), List.of("--opt"), List.of("setup"), List.of("cleanup"), List.of()); assertThat(np.getExtraInstallOptions()).containsExactly("--opt"); assertThat(np.getSetupCommands()).containsExactly("setup"); @@ -33,14 +33,14 @@ void testConstructorWithAllFields() { @Test void testGetPackages() { - NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), null, null, null); + NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), null, null, null, null); assertThat(np.getPackages()).containsExactly("pkg1"); } @Test void testNullSafeGetters() { - NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), null, null, null); + NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), null, null, null, null); assertThat(np.getExtraInstallOptions()).isEmpty(); assertThat(np.getSetupCommands()).isEmpty(); From 81ed4d60c8ec259c0da9a2b5a21596015f38a0f2 Mon Sep 17 00:00:00 2001 From: Hiepiscus Date: Wed, 30 Sep 2026 13:59:44 +0200 Subject: [PATCH 6/6] #2345: Applied review --- CHANGELOG.adoc | 1 + .../devonfw/tools/ide/tool/NativePackage.java | 21 ++++++++++-- .../tools/ide/tool/NativePackageManager.java | 5 +-- .../devonfw/tools/ide/tool/docker/Docker.java | 20 ++++++----- .../tools/ide/tool/pgadmin/PgAdmin.java | 5 ++- .../ide/tool/GlobalToolCommandletTest.java | 3 +- .../ide/tool/NativePackageManagerTest.java | 33 ++++++++----------- .../tools/ide/tool/NativePackageTest.java | 6 ++-- 8 files changed, 52 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index f50d1a8ca5..c293a606ae 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -6,6 +6,7 @@ This file documents all notable changes to https://github.com/devonfw/IDEasy[IDE Release with new features and bugfixes: +* https://github.com/devonfw/IDEasy/issues/2345[#2345]: DOCKER_EDITION ignored on Linux * https://github.com/devonfw/IDEasy/issues/2381[#2381]: Make node and npm pristine versioned tools with per-project npm global prefix The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/51?closed=1[milestone 2026.10.001]. diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackage.java b/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackage.java index 4eba6bb31e..d8509191fd 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackage.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackage.java @@ -1,5 +1,6 @@ package com.devonfw.tools.ide.tool; +import java.nio.file.Path; import java.util.List; import java.util.Objects; @@ -13,7 +14,21 @@ public class NativePackage { private final List extraInstallOptions; private final List setupCommands; private final List cleanupCommands; - private final List optionalNativePackageArtifactPaths; + private final List optionalNativePackageArtifactPaths; + + /** + * Creates a new {@link NativePackage} with optional fields defaulting to empty lists. + * + * @param pm the specific {@link NativePackageManager} + * @param packages the packages that need to be handled. + * @param extraInstallOptions extra install options (optional) + * @param setupCommands commands to run before install (optional) + * @param cleanupCommands commands to run after uninstall (optional) + */ + public NativePackage(NativePackageManager pm, List packages, + List extraInstallOptions, List setupCommands, List cleanupCommands) { + this(pm, packages, extraInstallOptions, setupCommands, cleanupCommands, null); + } /** * Creates a new {@link NativePackage} with optional fields defaulting to empty lists. @@ -26,7 +41,7 @@ public class NativePackage { * @param optionalNativePackageArtifactPaths paths to local package artifacts (optional) */ public NativePackage(NativePackageManager pm, List packages, - List extraInstallOptions, List setupCommands, List cleanupCommands, List optionalNativePackageArtifactPaths) { + List extraInstallOptions, List setupCommands, List cleanupCommands, List optionalNativePackageArtifactPaths) { this.packageManager = Objects.requireNonNull(pm, "package manager must not be null"); this.packages = List.copyOf(Objects.requireNonNull(packages, "packages must not be null")); this.extraInstallOptions = extraInstallOptions != null ? List.copyOf(extraInstallOptions) : List.of(); @@ -94,7 +109,7 @@ public List getCleanupCommands() { /** * @return set {@link optionalNativePackageArtifactPaths}. */ - public List getOptionalNativePackageArtifactPath() { + public List getOptionalNativePackageArtifactPaths() { return optionalNativePackageArtifactPaths; } diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackageManager.java b/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackageManager.java index 35cf84ab02..869a6385f5 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackageManager.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/NativePackageManager.java @@ -1,5 +1,6 @@ package com.devonfw.tools.ide.tool; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -183,12 +184,12 @@ public PackageManagerCommand install(NativePackage nativePackage, String version command.append(' ').append(option); } command.append(' ').append(this.installCommand); - if (nativePackage.getOptionalNativePackageArtifactPath().isEmpty()) { + if (nativePackage.getOptionalNativePackageArtifactPaths().isEmpty()) { for (String pkg : nativePackage.getPackages()) { command.append(' ').append(getPackageSpec(pkg, version)); } } else { - for (String nativePackageArtifactPath : nativePackage.getOptionalNativePackageArtifactPath()) { + for (Path nativePackageArtifactPath : nativePackage.getOptionalNativePackageArtifactPaths()) { command.append(' ').append(nativePackageArtifactPath); } } diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java index c04a3df498..53a0704be2 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java @@ -18,11 +18,11 @@ import com.devonfw.tools.ide.tool.NativePackage; import com.devonfw.tools.ide.tool.NativePackageManager; import com.devonfw.tools.ide.tool.PackageManagerCommand; +import com.devonfw.tools.ide.tool.ToolEdition; +import com.devonfw.tools.ide.tool.ToolEditionAndVersion; import com.devonfw.tools.ide.tool.ToolInstallRequest; import com.devonfw.tools.ide.tool.ToolInstallation; import com.devonfw.tools.ide.tool.repository.ToolRepository; -import com.devonfw.tools.ide.tool.ToolEdition; -import com.devonfw.tools.ide.tool.ToolEditionAndVersion; import com.devonfw.tools.ide.version.VersionIdentifier; /** @@ -80,9 +80,9 @@ private String detectContainerRuntime() { @Override protected List getNativePackages() { - if (EDITION_DOCKER.equals(getConfiguredEdition())) { + if (isDockerDesktopEditionConfigured()) { - List artifactPaths = (this.downloadedDebPackageForDocker == null) ? List.of() : List.of(this.downloadedDebPackageForDocker.toString()); + List artifactPaths = (this.downloadedDebPackageForDocker == null) ? List.of() : List.of(this.downloadedDebPackageForDocker); return List.of( new NativePackage( @@ -113,7 +113,6 @@ protected List getNativePackages() { List.of("rancher-desktop"), List.of("--no-gpg-checks"), List.of("sudo zypper addrepo https://download.opensuse.org/repositories/isv:/Rancher:/stable/rpm/isv:Rancher:stable.repo"), - null, null ), new NativePackage( @@ -131,8 +130,7 @@ protected List getNativePackages() { List.of( "sudo rm -f /etc/apt/sources.list.d/isv-rancher-stable.list", "sudo rm -f /usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg" - ), - null + ) ), new NativePackage(NativePackageManager.YAY, List.of("rancher-desktop")), new NativePackage(NativePackageManager.BREW_CASK, List.of("docker")) @@ -160,7 +158,7 @@ protected ToolEditionAndVersion adjustRequestedEdition(ToolEditionAndVersion req @Override protected ToolInstallation doInstall(ToolInstallRequest request) { - if (EDITION_DOCKER.equals(getConfiguredEdition())) { + if (isDockerDesktopEditionConfigured()) { downloadDebPackageStepAndSetPackagePath(request.getRequested().getResolvedVersion()); } return super.doInstall(request); @@ -173,7 +171,7 @@ private void downloadDebPackageStepAndSetPackagePath(VersionIdentifier resolvedV @Override protected List getInstallPackageManagerCommands(VersionIdentifier resolvedVersion) { - if (!EDITION_DOCKER.equals(getConfiguredEdition())) { + if (!isDockerDesktopEditionConfigured()) { return super.getInstallPackageManagerCommands(resolvedVersion); } @@ -261,6 +259,10 @@ private VersionIdentifier getRancherDesktopClientVersion() { } } + private boolean isDockerDesktopEditionConfigured() { + return EDITION_DOCKER.equals(getConfiguredEdition()); + } + @Override public String getToolHelpArguments() { diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java b/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java index f4489ecec8..0c01627137 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/pgadmin/PgAdmin.java @@ -42,9 +42,8 @@ protected List getNativePackages() { "sudo sh -c 'echo \"deb [signed-by=/usr/share/keyrings/packages-pgadmin-org.gpg] " + "https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main\" " + "> /etc/apt/sources.list.d/pgadmin4.list && apt update'"), - List.of("sudo rm -f /etc/apt/sources.list.d/pgadmin4.list", "sudo rm -f /usr/share/keyrings/packages-pgadmin-org.gpg"), - null - ), + List.of("sudo rm -f /etc/apt/sources.list.d/pgadmin4.list", "sudo rm -f /usr/share/keyrings/packages-pgadmin-org.gpg") + ), new NativePackage(NativePackageManager.BREW_CASK, List.of("pgadmin4")) ); } diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/GlobalToolCommandletTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/GlobalToolCommandletTest.java index db8d69f2f1..aace8b766a 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/GlobalToolCommandletTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/GlobalToolCommandletTest.java @@ -173,8 +173,7 @@ protected List getNativePackages() { List.of("mytool"), List.of(), List.of(), - List.of("sudo rm -f /etc/apt/sources.list.d/mytool.list"), - List.of()) + List.of("sudo rm -f /etc/apt/sources.list.d/mytool.list")) ); } diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageManagerTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageManagerTest.java index 7231206dba..76916f7885 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageManagerTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageManagerTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import java.nio.file.Path; import java.util.List; import org.junit.jupiter.api.Test; @@ -23,8 +24,7 @@ void testAptInstallCommand() { "sudo apt update"), List.of( "sudo rm -f /etc/apt/sources.list.d/example.list", - "sudo rm -f /usr/share/keyrings/example.gpg"), - List.of()); + "sudo rm -f /usr/share/keyrings/example.gpg")); var cmd = NativePackageManager.APT.install(np, "1.0.0"); @@ -48,8 +48,7 @@ void testAptUninstallCommand() { "sudo apt update"), List.of( "sudo rm -f /etc/apt/sources.list.d/example.list", - "sudo rm -f /usr/share/keyrings/example.gpg"), - List.of()); + "sudo rm -f /usr/share/keyrings/example.gpg")); var cmd = NativePackageManager.APT.uninstall(np); @@ -70,8 +69,7 @@ void testZypperInstallCommand() { "sudo zypper addrepo https://example.com/repo.repo", "sudo zypper refresh"), List.of( - "sudo zypper removerepo example-repo"), - List.of()); + "sudo zypper removerepo example-repo")); var cmd = NativePackageManager.ZYPPER.install(np, "1.0.0"); @@ -92,8 +90,7 @@ void testZypperUninstallCommand() { "sudo zypper addrepo https://example.com/repo.repo", "sudo zypper refresh"), List.of( - "sudo zypper removerepo example-repo"), - List.of()); + "sudo zypper removerepo example-repo")); var cmd = NativePackageManager.ZYPPER.uninstall(np); @@ -113,8 +110,7 @@ void testYumInstallCommand() { "sudo yum-config-manager --add-repo https://example.com/repo.repo", "sudo yum makecache"), List.of( - "sudo rm -f /etc/yum.repos.d/example.repo"), - List.of()); + "sudo rm -f /etc/yum.repos.d/example.repo")); var cmd = NativePackageManager.YUM.install(np, "1.0.0"); @@ -132,8 +128,7 @@ void testYumUninstallCommand() { List.of("pkg1"), List.of("--skip-broken"), List.of("sudo yum-config-manager --add-repo https://example.com/repo.repo", "sudo yum makecache"), - List.of("sudo rm -f /etc/yum.repos.d/example.repo"), - List.of()); + List.of("sudo rm -f /etc/yum.repos.d/example.repo")); var cmd = NativePackageManager.YUM.uninstall(np); @@ -149,8 +144,7 @@ void testDnfInstallCommand() { List.of("pkg1"), List.of("--refresh"), List.of("sudo dnf config-manager addrepo --from-repofile=https://example.com/repo.repo", "sudo dnf makecache"), - List.of("sudo rm -f /etc/yum.repos.d/example.repo"), - List.of()); + List.of("sudo rm -f /etc/yum.repos.d/example.repo")); var cmd = NativePackageManager.DNF.install(np, "1.0.0"); @@ -166,8 +160,7 @@ void testDnfUninstallCommand() { List.of("pkg1"), List.of("--refresh"), List.of("sudo dnf config-manager addrepo --from-repofile=https://example.com/repo.repo", "sudo dnf makecache"), - List.of("sudo rm -f /etc/yum.repos.d/example.repo"), - List.of()); + List.of("sudo rm -f /etc/yum.repos.d/example.repo")); var cmd = NativePackageManager.DNF.uninstall(np); @@ -234,7 +227,7 @@ void installUsesPackageNameAndVersionWhenNoArtifactPathConfigured() { @Test void installUsesArtifactPathWhenConfiguredInsteadOfPackageName() { - String debPath = "/tmp/downloads/docker-desktop-4.34.0-amd64"; + Path debPath = Path.of("/tmp/downloads/docker-desktop-4.34.0-amd64"); NativePackage nativePackage = new NativePackage(NativePackageManager.APT, List.of("docker-desktop"), null, null, null, List.of(debPath)); @@ -242,13 +235,13 @@ void installUsesArtifactPathWhenConfiguredInsteadOfPackageName() { List commands = result.commands(); String installCommand = commands.getLast(); - assertThat(installCommand).contains(debPath); + assertThat(installCommand).contains(debPath.toString()); assertThat(installCommand).doesNotContain("docker-desktop="); } @Test void installFallsBackToPackagesWhenArtifactPathListIsEmpty() { - NativePackage nativePackage = new NativePackage(NativePackageManager.APT, List.of("docker-desktop"), null, null, null, List.of()); + NativePackage nativePackage = new NativePackage(NativePackageManager.APT, List.of("docker-desktop"), null, null, null); PackageManagerCommand result = NativePackageManager.APT.install(nativePackage, null); @@ -259,7 +252,7 @@ void installFallsBackToPackagesWhenArtifactPathListIsEmpty() { @Test void installRejectsMismatchingPackageManager() { - NativePackage nativePackage = new NativePackage(NativePackageManager.APT, List.of("docker-desktop"), null, null, null, List.of()); + NativePackage nativePackage = new NativePackage(NativePackageManager.APT, List.of("docker-desktop"), null, null, null); PackageManagerCommand result = NativePackageManager.APT.install(nativePackage, null); diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageTest.java index d679d06190..3ba939304c 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/NativePackageTest.java @@ -24,7 +24,7 @@ void testOfFactoryMethod() { @Test void testConstructorWithAllFields() { - NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), List.of("--opt"), List.of("setup"), List.of("cleanup"), List.of()); + NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), List.of("--opt"), List.of("setup"), List.of("cleanup")); assertThat(np.getExtraInstallOptions()).containsExactly("--opt"); assertThat(np.getSetupCommands()).containsExactly("setup"); @@ -33,14 +33,14 @@ void testConstructorWithAllFields() { @Test void testGetPackages() { - NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), null, null, null, null); + NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), null, null, null); assertThat(np.getPackages()).containsExactly("pkg1"); } @Test void testNullSafeGetters() { - NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), null, null, null, null); + NativePackage np = new NativePackage(NativePackageManager.APT, List.of("pkg1"), null, null, null); assertThat(np.getExtraInstallOptions()).isEmpty(); assertThat(np.getSetupCommands()).isEmpty();