-
Notifications
You must be signed in to change notification settings - Fork 48
Description
Actual behavior
When I run a global tool e.g. ide docker ps that is not yet installed, then the following is happening:
runTool is invoked that calls install method to ensure the tool is installed.
Since the tool is not installed and it is a global tool this typically means that we run an interactive installer in the background. In our example on Windows this would download e.g. the rancher desktop Windows installer and run it in the background showing me some first screen of the installer.
Since then the install method returns, we continue with runTool to execute the actual command which here is docker ps.
This will end up with an error since the docker command is not found (installation is still running).
Even after the installation is completed, the command docker would still be unavailable since the PATH was changed in the Windows registry and that change is not visible in my existing change.
docker: command not found
Reproduce
ide docker ps
Expected behavior
After docker installer is launched in the background, we should get the following warning logged:
The installation of docker/rancher@1.21.0[*] is currently running in the background!
You need to complete the installation, potentially reboot and rerun your 'ide' command in a new terminal session after the installation has completed.
IDEasy status
IDE_ROOT is set to D:/projects
IDE_HOME is set to D:/projects/project
You are online.
Found bash executable at: C:/Program Files/Git/usr/bin/bash.exe
Found git executable at: C:/Program Files/Git/mingw64/bin/git.exe
Your settings are up-to-date.
Your version of IDEasy is 2025.11.001.Related/Dependent issues
Comments/Hints
When we create a global installation by running an installer in the background here:
IDEasy/cli/src/main/java/com/devonfw/tools/ide/tool/GlobalToolCommandlet.java
Lines 153 to 167 in de740df
| ProcessContext pc = this.context.newProcess().errorHandling(ProcessErrorHandling.LOG_WARNING).executable(executable); | |
| int exitCode = pc.run(ProcessMode.BACKGROUND).getExitCode(); | |
| if (tmpDir != null) { | |
| fileAccess.delete(tmpDir); | |
| } | |
| if (exitCode == 0) { | |
| asSuccess(request.getStep()).log("Installation process for {} in version {} has started", this.tool, resolvedVersion); | |
| } else { | |
| throw new CliException("Installation process for " + this.tool + " in version " + resolvedVersion + " failed with exit code " + exitCode + "!"); | |
| } | |
| installationPath = getInstallationPath(toolEdition.edition(), resolvedVersion); | |
| if (installationPath == null) { | |
| this.context.warning("Could not find binary {} on PATH after installation.", getBinaryName()); | |
| } | |
| return createToolInstallation(installationPath, resolvedVersion, true, pc, false); |
We should somehow have a new flag in ToolInstallation telling us that we have a background installation is running or in other words that the tool is not yet available. This flag should be set here to true while it is false by default (in all other places also in cases when we install a global tool via package manager on Linux since that will be synchronous waiting for the installation to complete).
Now we can change this code:
| install(request); |
So we store the returned ToolInstallation in a local installation variable and check the new flag.
If that flag is true, we log a warning and abort the further process:
ToolInstallation installation = install(request);
if (installation.isInstalledAsynchronously()) {
this.context.warning("The installation of {} is currently running in the background!\nYou need to complete the installation, potentially reboot and rerun your 'ide' command in a new terminal session after the installation has completed.", request.getRequested());
return new ProcessResultImpl(this.tool, this.tool, 0, List.of());
}
Metadata
Metadata
Assignees
Labels
Type
Projects
Status