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

devonfw / IDEasy / 30885547918

04 Aug 2026 06:52AM UTC coverage: 72.715% (+0.1%) from 72.61%
30885547918

Pull #2258

github

web-flow
Merge bc4337a4b into cd9770b9c
Pull Request #2258: #2250 uninstall commands from package manager

5033 of 7671 branches covered (65.61%)

Branch coverage included in aggregate %.

13126 of 17302 relevant lines covered (75.86%)

3.22 hits per line

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

7.04
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.List;
4
import java.util.Set;
5
import java.util.regex.Pattern;
6

7
import org.slf4j.Logger;
8
import org.slf4j.LoggerFactory;
9

10
import com.devonfw.tools.ide.common.Tag;
11
import com.devonfw.tools.ide.context.IdeContext;
12
import com.devonfw.tools.ide.os.SystemArchitecture;
13
import com.devonfw.tools.ide.os.WindowsHelper;
14
import com.devonfw.tools.ide.tool.GlobalToolCommandlet;
15
import com.devonfw.tools.ide.tool.NativePackage;
16
import com.devonfw.tools.ide.tool.NativePackageManager;
17
import com.devonfw.tools.ide.version.VersionIdentifier;
18

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

26
  private static final Logger LOG = LoggerFactory.getLogger(Docker.class);
3✔
27

28
  private static final String PODMAN = "podman";
29

30
  private static final Pattern RDCTL_CLIENT_VERSION_PATTERN = Pattern.compile("client version:\\s*v([\\d.]+)", Pattern.CASE_INSENSITIVE);
4✔
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
  protected List<NativePackage> getNativePackages() {
69
    return List.of(
×
70
        new NativePackage(
71
            NativePackageManager.ZYPPER,
72
            List.of("rancher-desktop"),
×
73
            List.of("--no-gpg-checks"),
×
74
            List.of("sudo zypper addrepo https://download.opensuse.org/repositories/isv:/Rancher:/stable/rpm/isv:Rancher:stable.repo"),
×
75
            null
76
        ),
77
        new NativePackage(
78
            NativePackageManager.APT,
79
            List.of("rancher-desktop"),
×
80
            List.of("--allow-downgrades"),
×
81
            List.of(
×
82
                "curl -s https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/Release.key | "
83
                    + "gpg --dearmor | sudo dd status=none of=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg",
84
                "echo 'deb [signed-by=/usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg] "
85
                    + "https://download.opensuse.org/repositories/isv:/Rancher:/stable/deb/ ./' | "
86
                    + "sudo dd status=none of=/etc/apt/sources.list.d/isv-rancher-stable.list",
87
                "sudo apt update"
88
            ),
89
            List.of(
×
90
                "sudo rm -f /etc/apt/sources.list.d/isv-rancher-stable.list",
91
                "sudo rm -f /usr/share/keyrings/isv-rancher-stable-archive-keyring.gpg"
92
            )
93
        )
94
    );
95
  }
96

97
  @Override
98
  public boolean isExtract() {
99

100
    return switch (this.context.getSystemInfo().getOs()) {
×
101
      case WINDOWS -> false;
×
102
      case MAC -> this.context.getSystemInfo().getArchitecture().equals(SystemArchitecture.ARM64);
×
103
      case LINUX -> true;
×
104
    };
105
  }
106

107
  @Override
108
  public VersionIdentifier getInstalledVersion() {
109

110
    if (!isDockerInstalled()) {
×
111
      return null;
×
112
    }
113

114
    if (isRancherDesktopInstalled()) {
×
115
      return getRancherDesktopClientVersion();
×
116
    } else {
117
      VersionIdentifier parsedVersion = switch (this.context.getSystemInfo().getOs()) {
×
118
        case WINDOWS -> getDockerDesktopVersionWindows();
×
119
        case LINUX -> getDockerDesktopVersionLinux();
×
120
        default -> null;
×
121
      };
122

123
      if (parsedVersion == null) {
×
124
        LOG.error("Couldn't get installed version of " + this.getName());
×
125
      }
126

127
      return parsedVersion;
×
128
    }
129
  }
130

131
  private VersionIdentifier getDockerDesktopVersionWindows() {
132

133
    String registryPath = "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Docker Desktop";
×
134

135
    WindowsHelper windowsHelper = ((com.devonfw.tools.ide.context.AbstractIdeContext) this.context).getWindowsHelper();
×
136
    String version = windowsHelper.getRegistryValue(registryPath, "DisplayVersion");
×
137

138
    return VersionIdentifier.of(version);
×
139
  }
140

141
  private VersionIdentifier getDockerDesktopVersionLinux() {
142

143
    String dockerDesktopVersionLinuxCommand = "apt list --installed | grep docker-desktop | awk '{print $2}'";
×
144
    String output = this.context.newProcess().runAndGetSingleOutput("bash", "-lc", dockerDesktopVersionLinuxCommand);
×
145
    return super.resolveVersionWithPattern(output, DOCKER_DESKTOP_LINUX_VERSION_PATTERN);
×
146
  }
147

148
  private VersionIdentifier getRancherDesktopClientVersion() {
149

150
    String output = this.context.newProcess().runAndGetSingleOutput("rdctl", "version");
×
151
    return super.resolveVersionWithPattern(output, RDCTL_CLIENT_VERSION_PATTERN);
×
152
  }
153

154
  @Override
155
  public String getInstalledEdition() {
156

157
    if (!isDockerInstalled()) {
×
158
      return null;
×
159
    }
160

161
    if (isRancherDesktopInstalled()) {
×
162
      return "rancher";
×
163
    } else {
164
      return "desktop";
×
165
    }
166
  }
167

168
  @Override
169
  public String getToolHelpArguments() {
170

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

© 2026 Coveralls, Inc