• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

devonfw / IDEasy / 20433382941

22 Dec 2025 01:31PM UTC coverage: 69.904% (-0.2%) from 70.088%
20433382941

Pull #1668

github

web-flow
Merge b8d300f26 into 8cc587d42
Pull Request #1668: #1653 implementation get version and get edition docker

3981 of 6272 branches covered (63.47%)

Branch coverage included in aggregate %.

10192 of 14003 relevant lines covered (72.78%)

3.14 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

5.88
cli/src/main/java/com/devonfw/tools/ide/tool/docker/Docker.java
1
package com.devonfw.tools.ide.tool.docker;
2

3
import java.util.ArrayList;
4
import java.util.Arrays;
5
import java.util.List;
6
import java.util.Set;
7
import java.util.regex.Pattern;
8

9
import com.devonfw.tools.ide.common.Tag;
10
import com.devonfw.tools.ide.context.IdeContext;
11
import com.devonfw.tools.ide.os.SystemArchitecture;
12
import com.devonfw.tools.ide.tool.GlobalToolCommandlet;
13
import com.devonfw.tools.ide.tool.NativePackageManager;
14
import com.devonfw.tools.ide.tool.PackageManagerCommand;
15
import com.devonfw.tools.ide.tool.repository.ToolRepository;
16
import com.devonfw.tools.ide.version.VersionIdentifier;
17

18
/**
19
 * {@link GlobalToolCommandlet} for <a href="https://www.docker.com/">docker</a> either as
20
 * <a href="https://rancherdesktop.io/">Rancher Desktop</a> or as
21
 * <a href="https://www.docker.com/products/docker-desktop/">Docker Desktop</a>.
22
 */
23
public class Docker extends GlobalToolCommandlet {
24

25
  private static final String PODMAN = "podman";
26

27

28
  private static final Pattern RDCTL_CLIENT_VERSION_PATTERN = Pattern.compile("client version:\\s*v([\\d.]+)", Pattern.CASE_INSENSITIVE);
4✔
29

30
  private static final Pattern DOCKER_DESKTOP_WINDOWS_VERSION_PATTERN = Pattern.compile("DisplayVersion\\s+REG_SZ\\s+([0-9]+(?:\\.[0-9]+){2})");
3✔
31

32
  private static final Pattern DOCKER_DESKTOP_LINUX_VERSION_PATTERN = Pattern.compile("^([0-9]+(?:\\.[0-9]+){1,2})");
4✔
33

34
  /**
35
   * The constructor.
36
   *
37
   * @param context the {@link IdeContext}.
38
   */
39
  public Docker(IdeContext context) {
40

41
    super(context, "docker", Set.of(Tag.DOCKER));
6✔
42
  }
1✔
43

44
  @Override
45
  public String getBinaryName() {
46
    return detectContainerRuntime();
×
47
  }
48

49
  private boolean isDockerInstalled() {
50
    return isCommandAvailable("docker");
×
51
  }
52

53
  private boolean isRancherDesktopInstalled() {
54
    return isCommandAvailable("rdctl");
×
55
  }
56

57
  private String detectContainerRuntime() {
58
    if (isCommandAvailable(this.tool)) {
×
59
      return this.tool;
×
60
    } else if (isCommandAvailable(PODMAN)) {
×
61
      return PODMAN;
×
62
    } else {
63
      return this.tool;
×
64
    }
65
  }
66

67
  @Override
68
  public boolean isExtract() {
69

70
    return switch (this.context.getSystemInfo().getOs()) {
×
71
      case WINDOWS -> false;
×
72
      case MAC -> this.context.getSystemInfo().getArchitecture().equals(SystemArchitecture.ARM64);
×
73
      case LINUX -> true;
×
74
    };
75
  }
76

77
  @Override
78
  protected List<PackageManagerCommand> getInstallPackageManagerCommands() {
79

80
    String edition = getConfiguredEdition();
×
81
    ToolRepository toolRepository = getToolRepository();
×
82
    VersionIdentifier configuredVersion = getConfiguredVersion();
×
83
    String resolvedVersion = toolRepository.resolveVersion(this.tool, edition, configuredVersion, this).toString();
×
84

85
    return List.of(new PackageManagerCommand(NativePackageManager.ZYPPER, List.of(
×
86
            "sudo zypper addrepo https://download.opensuse.org/repositories/isv:/Rancher:/stable/rpm/isv:Rancher:stable.repo",
87
            String.format("sudo zypper --no-gpg-checks install rancher-desktop=%s*", resolvedVersion))),
×
88
        new PackageManagerCommand(NativePackageManager.APT, List.of(
×
89
            "curl -s https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/Release.key | gpg --dearmor |"
90
                + " sudo dd status=none of=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg",
91
            "echo 'deb [signed-by=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg]"
92
                + " https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/ ./' |"
93
                + " sudo dd status=none of=/etc/apt/sources.list.d/isv-rancher-stable.list", "sudo apt update",
94
            String.format("sudo apt install -y --allow-downgrades rancher-desktop=%s*", resolvedVersion))));
×
95
  }
96

97
  @Override
98
  public VersionIdentifier getInstalledVersion() {
99

100
    if (!isDockerInstalled()) {
×
101
      this.context.error("Couldn't get installed version of " + this.getName());
×
102
      return null;
×
103
    }
104

105
    if (isRancherDesktopInstalled()) {
×
106
      return getRancherDesktopClientVersion();
×
107
    } else {
108
      VersionIdentifier parsedVersion = switch (this.context.getSystemInfo().getOs()) {
×
109
        case WINDOWS -> getDockerDesktopVersionWindows();
×
110
        case LINUX -> getDockerDesktopVersionLinux();
×
111
        default -> null;
×
112
      };
113

114
      if (parsedVersion == null) {
×
115
        this.context.error("Couldn't get installed version of " + this.getName());
×
116
      }
117

118
      return parsedVersion;
×
119
    }
120
  }
121

122
  private VersionIdentifier getDockerDesktopVersionWindows() {
123

124
    String dockerDesktopVersionWindowsCommand = "reg query \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Docker Desktop\" /v DisplayVersion";
×
125

126
    List<String> outputs = this.context.newProcess().runAndGetOutput("cmd.exe", "/c", dockerDesktopVersionWindowsCommand);
×
127
    String singleLineOutput = String.join(" ", outputs);
×
128
    return super.resolveVersionWithPattern(singleLineOutput, DOCKER_DESKTOP_WINDOWS_VERSION_PATTERN);
×
129
  }
130

131
  private VersionIdentifier getDockerDesktopVersionLinux() {
132

133
    String dockerDesktopVersionLinuxCommand = "apt list --installed | grep docker-desktop | awk '{print $2}'";
×
134
    String output = this.context.newProcess().runAndGetSingleOutput("bash", "-lc", dockerDesktopVersionLinuxCommand);
×
135
    return super.resolveVersionWithPattern(output, DOCKER_DESKTOP_LINUX_VERSION_PATTERN);
×
136
  }
137

138
  private VersionIdentifier getRancherDesktopClientVersion() {
139

140
    String output = this.context.newProcess().runAndGetSingleOutput("rdctl", "version");
×
141
    return super.resolveVersionWithPattern(output, RDCTL_CLIENT_VERSION_PATTERN);
×
142
  }
143

144
  @Override
145
  public String getInstalledEdition() {
146

147
    if (!isDockerInstalled()) {
×
148
      this.context.error("Couldn't get installed edition of " + this.getName());
×
149
      return null;
×
150
    }
151

152
    if (isRancherDesktopInstalled()) {
×
153
      return "rancher";
×
154
    } else {
155
      return "desktop";
×
156
    }
157
  }
158

159
  @Override
160
  public void uninstall() {
161

162
    if (this.context.getSystemInfo().isLinux()) {
×
163
      runWithPackageManager(false, getPackageManagerCommandsUninstall());
×
164
    } else {
165
      super.uninstall();
×
166
    }
167

168
  }
×
169

170
  private List<PackageManagerCommand> getPackageManagerCommandsUninstall() {
171

172
    List<PackageManagerCommand> pmCommands = new ArrayList<>();
×
173
    pmCommands.add(
×
174
        new PackageManagerCommand(NativePackageManager.ZYPPER, Arrays.asList("sudo zypper remove rancher-desktop")));
×
175
    pmCommands.add(
×
176
        new PackageManagerCommand(NativePackageManager.APT, Arrays.asList("sudo apt -y autoremove rancher-desktop")));
×
177

178
    return pmCommands;
×
179
  }
180

181
  @Override
182
  public String getToolHelpArguments() {
183

184
    return "help";
×
185
  }
186
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc