diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index bbfe750876..5135de4118 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -22,6 +22,7 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/1853[#1853]: Add ARM releases for VSCode on Mac * https://github.com/devonfw/IDEasy/issues/797[#797]: Use system unzip on macOS to preserve symlinks in ZIP extraction * https://github.com/devonfw/IDEasy/issues/1723[#1723]: Add commandlet for GitHub Copilot CLI +* https://github.com/devonfw/IDEasy/pull/1885[#1885]: Add per-project uv tool isolation using UV_TOOL_DIR and UV_TOOL_BIN_DIR * https://github.com/devonfw/IDEasy/issues/861[#861]: Fix install of pgadmin throws IllegalStateException when the install wizard starts * https://github.com/devonfw/IDEasy/issues/1844[#1844]: VSCode plugin installation progress freezing * https://github.com/devonfw/IDEasy/issues/1456[#1456]: Uninstall via Windows settings not working diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/python/Python.java b/cli/src/main/java/com/devonfw/tools/ide/tool/python/Python.java index caa38b5a3e..3af6dd2fa1 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/python/Python.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/python/Python.java @@ -66,6 +66,8 @@ public void setEnvironment(EnvironmentContext environmentContext, ToolInstallati super.setEnvironment(environmentContext, toolInstallation, additionalInstallation); environmentContext.withEnvVar("VIRTUAL_ENV", toolInstallation.rootDir().toString()); + environmentContext.withEnvVar("UV_TOOL_DIR", toolInstallation.rootDir().resolve("tools").toString()); + environmentContext.withEnvVar("UV_TOOL_BIN_DIR", toolInstallation.binDir().toString()); } @Override diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/uv/Uv.java b/cli/src/main/java/com/devonfw/tools/ide/tool/uv/Uv.java index 4efdac6c65..9665353f4d 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/uv/Uv.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/uv/Uv.java @@ -6,11 +6,13 @@ import com.devonfw.tools.ide.common.Tag; import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.process.EnvironmentContext; import com.devonfw.tools.ide.process.ProcessContext; import com.devonfw.tools.ide.process.ProcessMode; import com.devonfw.tools.ide.process.ProcessResult; import com.devonfw.tools.ide.tool.LocalToolCommandlet; import com.devonfw.tools.ide.tool.ToolCommandlet; +import com.devonfw.tools.ide.tool.ToolInstallation; import com.devonfw.tools.ide.version.VersionIdentifier; /** @@ -42,4 +44,12 @@ public void installPython(Path installationPath, VersionIdentifier resolvedVersi ProcessResult result = runTool(processContext, ProcessMode.DEFAULT_CAPTURE, List.of("venv", "--python", resolvedVersion.toString())); assert result.isSuccessful(); } + @Override + public void setEnvironment(EnvironmentContext environmentContext, ToolInstallation toolInstallation, boolean additionalInstallation) { + + super.setEnvironment(environmentContext, toolInstallation, additionalInstallation); + Path pythonPath = this.context.getSoftwarePath().resolve("python"); + environmentContext.withEnvVar("UV_TOOL_DIR", pythonPath.resolve("tools").toString()); + environmentContext.withEnvVar("UV_TOOL_BIN_DIR", pythonPath.resolve("bin").toString()); + } } diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/python/PythonTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/python/PythonTest.java new file mode 100644 index 0000000000..5f0139d68e --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/python/PythonTest.java @@ -0,0 +1,42 @@ +package com.devonfw.tools.ide.tool.python; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; +import com.devonfw.tools.ide.environment.EnvironmentVariablesType; +import com.devonfw.tools.ide.environment.VariableLine; +import com.devonfw.tools.ide.environment.VariableSource; +import com.devonfw.tools.ide.os.WindowsPathSyntax; +import com.devonfw.tools.ide.process.EnvironmentVariableCollectorContext; +import com.devonfw.tools.ide.tool.ToolInstallation; +import com.devonfw.tools.ide.version.VersionIdentifier; + +/** + * Test of {@link Python}. + */ +public class PythonTest extends AbstractIdeContextTest { + + @Test + public void testSetEnvironment() { + + // arrange + IdeTestContext context = newContext(PROJECT_BASIC); + Python python = new Python(context); + Path rootDir = context.getSoftwarePath().resolve("python"); + ToolInstallation toolInstallation = new ToolInstallation(rootDir, rootDir, rootDir.resolve("bin"), VersionIdentifier.of("3.12.0"), true); + Map variables = new HashMap<>(); + EnvironmentVariableCollectorContext environmentContext = new EnvironmentVariableCollectorContext(variables, new VariableSource(EnvironmentVariablesType.WORKSPACE, null), WindowsPathSyntax.MSYS); + + // act + python.setEnvironment(environmentContext, toolInstallation, false); + + // assert + assertThat(Path.of(variables.get("UV_TOOL_DIR").getValue())).isEqualTo(toolInstallation.rootDir().resolve("tools")); + assertThat(Path.of(variables.get("UV_TOOL_BIN_DIR").getValue())).isEqualTo(toolInstallation.binDir()); + } +} diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/uv/UvTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/uv/UvTest.java new file mode 100644 index 0000000000..984f7bd4b6 --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/uv/UvTest.java @@ -0,0 +1,43 @@ +package com.devonfw.tools.ide.tool.uv; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; +import com.devonfw.tools.ide.environment.EnvironmentVariablesType; +import com.devonfw.tools.ide.environment.VariableLine; +import com.devonfw.tools.ide.environment.VariableSource; +import com.devonfw.tools.ide.os.WindowsPathSyntax; +import com.devonfw.tools.ide.process.EnvironmentVariableCollectorContext; +import com.devonfw.tools.ide.tool.ToolInstallation; +import com.devonfw.tools.ide.version.VersionIdentifier; + +/** + * Test of {@link Uv}. + */ +public class UvTest extends AbstractIdeContextTest { + + @Test + public void testSetEnvironment() { + + // arrange + IdeTestContext context = newContext(PROJECT_BASIC); + Uv uv = new Uv(context); + Path rootDir = context.getSoftwarePath().resolve("uv"); + ToolInstallation toolInstallation = new ToolInstallation(rootDir, rootDir, rootDir, VersionIdentifier.of("0.1.0"), true); + Map variables = new HashMap<>(); + EnvironmentVariableCollectorContext environmentContext = new EnvironmentVariableCollectorContext(variables, new VariableSource(EnvironmentVariablesType.WORKSPACE, null), WindowsPathSyntax.MSYS); + + // act + uv.setEnvironment(environmentContext, toolInstallation, false); + + // assert + Path expectedPythonPath = context.getSoftwarePath().resolve("python"); + assertThat(Path.of(variables.get("UV_TOOL_DIR").getValue())).isEqualTo(expectedPythonPath.resolve("tools")); + assertThat(Path.of(variables.get("UV_TOOL_BIN_DIR").getValue())).isEqualTo(expectedPythonPath.resolve("bin")); + } +}