From 450b9b741d4964a4dbdabac56be8f6903084f501 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Mon, 4 May 2026 17:43:40 +0200 Subject: [PATCH 1/9] #1849: Add support for VSCodium --- .../devonfw/tools/ide/tool/vscode/Vscode.java | 59 +++++++++++++- .../url/tool/vscode/VsCodiumUrlUpdater.java | 77 +++++++++++++++++++ .../tools/ide/url/updater/UpdateManager.java | 3 +- 3 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 url-updater/src/main/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdater.java diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java index 9cfc99407c..4e61acb44e 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java @@ -1,5 +1,6 @@ package com.devonfw.tools.ide.tool.vscode; +import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; @@ -14,6 +15,7 @@ import com.devonfw.tools.ide.io.IdeProgressBar; import com.devonfw.tools.ide.log.IdeLogLevel; import com.devonfw.tools.ide.process.ProcessContext; +import com.devonfw.tools.ide.process.ProcessErrorHandling; import com.devonfw.tools.ide.process.ProcessMode; import com.devonfw.tools.ide.process.ProcessResult; import com.devonfw.tools.ide.step.Step; @@ -28,6 +30,12 @@ public class Vscode extends IdeToolCommandlet { private static final Logger LOG = LoggerFactory.getLogger(Vscode.class); + /** The {@link #getConfiguredEdition() edition} for VSCodium. */ + public static final String EDITION_VSCODIUM = "vscodium"; + + /** Plugin IDs collected during {@link #installPlugins} that the VSCodium build refused to install. */ + private final List vscodiumUnavailablePlugins = new ArrayList<>(); + /** * The constructor. * @@ -41,11 +49,21 @@ public Vscode(IdeContext context) { @Override protected String getBinaryName() { + if (EDITION_VSCODIUM.equals(getConfiguredEdition())) { + return "codium"; + } return "code"; } @Override protected void installPlugins(Collection plugins, ProcessContext pc) { + boolean isVscodium = EDITION_VSCODIUM.equals(getConfiguredEdition()); + if (isVscodium) { + this.vscodiumUnavailablePlugins.clear(); + // VSCodium uses open-vsx and is missing some plugins. Bypass the per-plugin Step framework + // (no "Start: ..." / "ended ..." logs) and silence per-process errors; we report failures once at the end. + pc.errorHandling(ProcessErrorHandling.NONE); + } this.context.runWithoutLogging(() -> { IdeProgressBar pb = this.context.newProgressBarForPlugins(plugins.size()); pc.setOutputListener((msg, err) -> { @@ -53,9 +71,43 @@ protected void installPlugins(Collection plugins, ProcessC pb.stepBy(1); } }); - super.installPlugins(plugins, pc); + if (isVscodium) { + installPluginsSilently(plugins, pc); + } else { + super.installPlugins(plugins, pc); + } pb.close(); }); + if (isVscodium && !this.vscodiumUnavailablePlugins.isEmpty()) { + LOG.warn("{} plugin(s) could not be installed on the VSCodium open-source build, " + + "either because they are Microsoft-proprietary or are not published to open-vsx:\n - {}\n" + + "For full plugin support, set VSCODE_EDITION=vscode to use Microsoft's distribution.", + this.vscodiumUnavailablePlugins.size(), + String.join("\n - ", this.vscodiumUnavailablePlugins)); + } + } + + private void installPluginsSilently(Collection plugins, ProcessContext pc) { + for (ToolPluginDescriptor plugin : plugins) { + if (!plugin.active()) { + continue; + } + Path markerFile = retrievePluginMarkerFilePath(plugin); + boolean markerExists = markerFile != null && Files.exists(markerFile); + if (markerExists && !this.context.isForcePlugins()) { + continue; + } + List args = new ArrayList<>(); + args.add("--force"); + args.add("--install-extension"); + args.add(plugin.id()); + ProcessResult result = runTool(pc, ProcessMode.DEFAULT_CAPTURE, args); + if (result.isSuccessful()) { + createPluginMarkerFile(plugin); + } else { + this.vscodiumUnavailablePlugins.add(plugin.id()); + } + } } @Override @@ -70,10 +122,9 @@ public boolean installPlugin(ToolPluginDescriptor plugin, Step step, ProcessCont IdeLogLevel.SUCCESS.log(LOG, "Successfully installed plugin: {}", plugin.name()); step.success(); return true; - } else { - LOG.warn("An error occurred while installing plugin: {}", plugin.name()); - return false; } + LOG.warn("An error occurred while installing plugin: {}", plugin.name()); + return false; } @Override diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdater.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdater.java new file mode 100644 index 0000000000..423c0254a8 --- /dev/null +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdater.java @@ -0,0 +1,77 @@ +package com.devonfw.tools.ide.url.tool.vscode; + +import com.devonfw.tools.ide.url.model.folder.UrlVersion; +import com.devonfw.tools.ide.url.updater.GithubUrlTagUpdater; + +/** + * {@link GithubUrlTagUpdater} for the "vscodium" edition of vscode (VSCodium). + */ +public class VsCodiumUrlUpdater extends GithubUrlTagUpdater { + + private static final String DOWNLOAD_BASE_URL = "https://github.com/VSCodium/vscodium/releases/download"; + + @Override + public String getTool() { + + return "vscode"; + } + + @Override + protected String getEdition() { + + return "vscodium"; + } + + @Override + protected String getGithubOrganization() { + + return "VSCodium"; + } + + @Override + protected String getGithubRepository() { + + return "vscodium"; + } + + @Override + protected String getDownloadBaseUrl() { + + return DOWNLOAD_BASE_URL; + } + + @Override + protected void addVersion(UrlVersion urlVersion) { + + String baseUrl = getDownloadBaseUrl() + "/${version}/VSCodium-"; + doAddVersion(urlVersion, baseUrl + "linux-x64-${version}.tar.gz", LINUX, X64); + doAddVersion(urlVersion, baseUrl + "linux-arm64-${version}.tar.gz", LINUX, ARM64); + doAddVersion(urlVersion, baseUrl + "darwin-x64-${version}.zip", MAC, X64); + doAddVersion(urlVersion, baseUrl + "darwin-arm64-${version}.zip", MAC, ARM64); + doAddVersion(urlVersion, baseUrl + "win32-x64-${version}.zip", WINDOWS, X64); + doAddVersion(urlVersion, baseUrl + "win32-arm64-${version}.zip", WINDOWS, ARM64); + } + + @Override + public String mapVersion(String version) { + + // VSCodium tag schemes seen in history: 3-segment "1.55.0", 4-segment "1.84.2.23319", and current 3-segment with + // build-encoded patch like "1.116.02821". Accept any 3- or 4-segment numeric tag. + if (version.matches("\\d+\\.\\d+\\.\\d+(\\.\\d+)?")) { + return super.mapVersion(version); + } else { + return null; + } + } + + @Override + public String getCpeVendor() { + return "vscodium"; + } + + @Override + public String getCpeProduct() { + return "vscodium"; + } + +} diff --git a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java index 5dc08f8e7a..66f418dc83 100644 --- a/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java +++ b/url-updater/src/main/java/com/devonfw/tools/ide/url/updater/UpdateManager.java @@ -55,6 +55,7 @@ import com.devonfw.tools.ide.url.tool.tomcat.TomcatUrlUpdater; import com.devonfw.tools.ide.url.tool.uv.UvUrlUpdater; import com.devonfw.tools.ide.url.tool.vscode.VsCodeUrlUpdater; +import com.devonfw.tools.ide.url.tool.vscode.VsCodiumUrlUpdater; /** * The {@code UpdateManager} class manages the update process for various tools by using a list of {@link AbstractUrlUpdater}s to update the @@ -78,7 +79,7 @@ public class UpdateManager extends AbstractProcessorWithTimeout { new KotlincNativeUrlUpdater(), new LazyDockerUrlUpdater(), new MvnUrlUpdater(), new NgUrlUpdater(), new NodeUrlUpdater(), new NpmUrlUpdater(), new OcUrlUpdater(), new PgAdminUrlUpdater(), new PipUrlUpdater(), new PycharmUrlUpdater(), new PythonUrlUpdater(), new QuarkusUrlUpdater(), new RustUrlUpdater(), new DockerRancherDesktopUrlUpdater(), new SonarUrlUpdater(), new SquirrelSqlUrlUpdater(), - new TerraformUrlUpdater(), new TomcatUrlUpdater(), new UvUrlUpdater(), new VsCodeUrlUpdater()); + new TerraformUrlUpdater(), new TomcatUrlUpdater(), new UvUrlUpdater(), new VsCodeUrlUpdater(), new VsCodiumUrlUpdater()); /** * The constructor. From 24015b6969e2e2318e045deac803c352d09ebdc1 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Tue, 5 May 2026 08:18:34 +0200 Subject: [PATCH 2/9] Rebase, fix conflict in CHANGELOG.adoc --- CHANGELOG.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index a8dcae4f64..f6c814abea 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -17,8 +17,12 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/1834[#1834]: Fix fix-vpn-tls-problem NullPointerException * https://github.com/devonfw/IDEasy/issues/1724[#1724]: Add gui commandlet * https://github.com/devonfw/IDEasy/issues/1853[#1853]: Add ARM releases for VSCode on Mac +<<<<<<< HEAD * 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/issues/1849[#1849]: Add VSCodium support +>>>>>>> e679b003 (#1849: Add to CHANGELOG.adoc) The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/44?closed=1[milestone 2026.05.001]. From 67e9ce088a2e4446b7fa26f551ab60d53b3302c0 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Tue, 5 May 2026 08:21:53 +0200 Subject: [PATCH 3/9] #1849: Fix CHANGELOG.adoc --- CHANGELOG.adoc | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index f6c814abea..3043d37fac 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -17,12 +17,9 @@ Release with new features and bugfixes: * https://github.com/devonfw/IDEasy/issues/1834[#1834]: Fix fix-vpn-tls-problem NullPointerException * https://github.com/devonfw/IDEasy/issues/1724[#1724]: Add gui commandlet * https://github.com/devonfw/IDEasy/issues/1853[#1853]: Add ARM releases for VSCode on Mac -<<<<<<< HEAD * 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/issues/1849[#1849]: Add VSCodium support ->>>>>>> e679b003 (#1849: Add to CHANGELOG.adoc) The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/44?closed=1[milestone 2026.05.001]. From ff2b8de5f511701082840f0566f4bc2c5bf0e97f Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Tue, 5 May 2026 08:41:07 +0200 Subject: [PATCH 4/9] #1849: Changes to Vscode.java --- .../com/devonfw/tools/ide/tool/vscode/Vscode.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java index 4e61acb44e..ec768a20d6 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java @@ -31,7 +31,7 @@ public class Vscode extends IdeToolCommandlet { private static final Logger LOG = LoggerFactory.getLogger(Vscode.class); /** The {@link #getConfiguredEdition() edition} for VSCodium. */ - public static final String EDITION_VSCODIUM = "vscodium"; + private static final String EDITION_VSCODIUM = "vscodium"; /** Plugin IDs collected during {@link #installPlugins} that the VSCodium build refused to install. */ private final List vscodiumUnavailablePlugins = new ArrayList<>(); @@ -59,9 +59,9 @@ protected String getBinaryName() { protected void installPlugins(Collection plugins, ProcessContext pc) { boolean isVscodium = EDITION_VSCODIUM.equals(getConfiguredEdition()); if (isVscodium) { + // VSCodium does not support all the plugins VSCode offers, therefore we implement + // a custom error handling strategy for plugin installation this.vscodiumUnavailablePlugins.clear(); - // VSCodium uses open-vsx and is missing some plugins. Bypass the per-plugin Step framework - // (no "Start: ..." / "ended ..." logs) and silence per-process errors; we report failures once at the end. pc.errorHandling(ProcessErrorHandling.NONE); } this.context.runWithoutLogging(() -> { @@ -122,9 +122,10 @@ public boolean installPlugin(ToolPluginDescriptor plugin, Step step, ProcessCont IdeLogLevel.SUCCESS.log(LOG, "Successfully installed plugin: {}", plugin.name()); step.success(); return true; + } else { + LOG.warn("An error occurred while installing plugin: {}", plugin.name()); + return false; } - LOG.warn("An error occurred while installing plugin: {}", plugin.name()); - return false; } @Override From 7f5dea9baf7c7335b7c719d1860f7f487723cdac Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Tue, 5 May 2026 08:49:09 +0200 Subject: [PATCH 5/9] #1849: Removed extra VSCodium plugin installation method --- .../devonfw/tools/ide/tool/vscode/Vscode.java | 49 +++++-------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java index ec768a20d6..86e33bfa5f 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java @@ -1,6 +1,5 @@ package com.devonfw.tools.ide.tool.vscode; -import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; @@ -59,8 +58,6 @@ protected String getBinaryName() { protected void installPlugins(Collection plugins, ProcessContext pc) { boolean isVscodium = EDITION_VSCODIUM.equals(getConfiguredEdition()); if (isVscodium) { - // VSCodium does not support all the plugins VSCode offers, therefore we implement - // a custom error handling strategy for plugin installation this.vscodiumUnavailablePlugins.clear(); pc.errorHandling(ProcessErrorHandling.NONE); } @@ -71,11 +68,7 @@ protected void installPlugins(Collection plugins, ProcessC pb.stepBy(1); } }); - if (isVscodium) { - installPluginsSilently(plugins, pc); - } else { - super.installPlugins(plugins, pc); - } + super.installPlugins(plugins, pc); pb.close(); }); if (isVscodium && !this.vscodiumUnavailablePlugins.isEmpty()) { @@ -87,45 +80,25 @@ protected void installPlugins(Collection plugins, ProcessC } } - private void installPluginsSilently(Collection plugins, ProcessContext pc) { - for (ToolPluginDescriptor plugin : plugins) { - if (!plugin.active()) { - continue; - } - Path markerFile = retrievePluginMarkerFilePath(plugin); - boolean markerExists = markerFile != null && Files.exists(markerFile); - if (markerExists && !this.context.isForcePlugins()) { - continue; - } - List args = new ArrayList<>(); - args.add("--force"); - args.add("--install-extension"); - args.add(plugin.id()); - ProcessResult result = runTool(pc, ProcessMode.DEFAULT_CAPTURE, args); - if (result.isSuccessful()) { - createPluginMarkerFile(plugin); - } else { - this.vscodiumUnavailablePlugins.add(plugin.id()); - } - } - } - @Override public boolean installPlugin(ToolPluginDescriptor plugin, Step step, ProcessContext pc) { - List extensionsCommands = new ArrayList<>(); - extensionsCommands.add("--force"); - extensionsCommands.add("--install-extension"); - extensionsCommands.add(plugin.id()); - ProcessResult result = runTool(pc, ProcessMode.DEFAULT_CAPTURE, extensionsCommands); + List args = new ArrayList<>(); + args.add("--force"); + args.add("--install-extension"); + args.add(plugin.id()); + ProcessResult result = runTool(pc, ProcessMode.DEFAULT_CAPTURE, args); if (result.isSuccessful()) { IdeLogLevel.SUCCESS.log(LOG, "Successfully installed plugin: {}", plugin.name()); step.success(); return true; - } else { - LOG.warn("An error occurred while installing plugin: {}", plugin.name()); + } + if (EDITION_VSCODIUM.equals(getConfiguredEdition())) { + this.vscodiumUnavailablePlugins.add(plugin.id()); return false; } + LOG.warn("An error occurred while installing plugin: {}", plugin.name()); + return false; } @Override From 0d9c0128a8c9f667e1ccfb4db64dd0d8a1212745 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Tue, 5 May 2026 08:52:14 +0200 Subject: [PATCH 6/9] #1849: Clean up installPlugin --- .../java/com/devonfw/tools/ide/tool/vscode/Vscode.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java index 86e33bfa5f..c952d4c204 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java @@ -83,11 +83,11 @@ protected void installPlugins(Collection plugins, ProcessC @Override public boolean installPlugin(ToolPluginDescriptor plugin, Step step, ProcessContext pc) { - List args = new ArrayList<>(); - args.add("--force"); - args.add("--install-extension"); - args.add(plugin.id()); - ProcessResult result = runTool(pc, ProcessMode.DEFAULT_CAPTURE, args); + List extensionsCommands = new ArrayList<>(); + extensionsCommands.add("--force"); + extensionsCommands.add("--install-extension"); + extensionsCommands.add(plugin.id()); + ProcessResult result = runTool(pc, ProcessMode.DEFAULT_CAPTURE, extensionsCommands); if (result.isSuccessful()) { IdeLogLevel.SUCCESS.log(LOG, "Successfully installed plugin: {}", plugin.name()); step.success(); From 5dddf08eca0d852dea98e9e3ad6c7b62026be8b4 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Tue, 5 May 2026 09:20:56 +0200 Subject: [PATCH 7/9] #1849: Cleaner logging for missing extensions --- .../java/com/devonfw/tools/ide/tool/vscode/Vscode.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java index c952d4c204..5cb55ae5cf 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java @@ -70,11 +70,11 @@ protected void installPlugins(Collection plugins, ProcessC }); super.installPlugins(plugins, pc); pb.close(); - }); + }, IdeLogLevel.WARNING); if (isVscodium && !this.vscodiumUnavailablePlugins.isEmpty()) { - LOG.warn("{} plugin(s) could not be installed on the VSCodium open-source build, " - + "either because they are Microsoft-proprietary or are not published to open-vsx:\n - {}\n" - + "For full plugin support, set VSCODE_EDITION=vscode to use Microsoft's distribution.", + LOG.warn("{} plugin(s) could not be installed on VSCodium due to not being available on open-vsx or other errors:\n - {}\n" + + "For full plugin support, set VSCODE_EDITION=vscode to use Microsoft's distribution.\n" + + "For more detailed information on why plugins failed to install, check the IDEasy logfile at $IDE_ROOT/_ide/logs/.", this.vscodiumUnavailablePlugins.size(), String.join("\n - ", this.vscodiumUnavailablePlugins)); } From 55a84f1d032100d968bc9318f02ee1472191f30e Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Tue, 5 May 2026 09:47:10 +0200 Subject: [PATCH 8/9] #1849: Cleaner logging for missing extensions, fixes failed test --- .../main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java index 5cb55ae5cf..c1debf3916 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/vscode/Vscode.java @@ -61,6 +61,7 @@ protected void installPlugins(Collection plugins, ProcessC this.vscodiumUnavailablePlugins.clear(); pc.errorHandling(ProcessErrorHandling.NONE); } + IdeLogLevel suppressLevel = isVscodium ? IdeLogLevel.WARNING : IdeLogLevel.STEP; this.context.runWithoutLogging(() -> { IdeProgressBar pb = this.context.newProgressBarForPlugins(plugins.size()); pc.setOutputListener((msg, err) -> { @@ -70,7 +71,7 @@ protected void installPlugins(Collection plugins, ProcessC }); super.installPlugins(plugins, pc); pb.close(); - }, IdeLogLevel.WARNING); + }, suppressLevel); if (isVscodium && !this.vscodiumUnavailablePlugins.isEmpty()) { LOG.warn("{} plugin(s) could not be installed on VSCodium due to not being available on open-vsx or other errors:\n - {}\n" + "For full plugin support, set VSCODE_EDITION=vscode to use Microsoft's distribution.\n" From e8218978e0cd2ee4853e5da8c9d589639f55c1e8 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Tue, 5 May 2026 09:56:58 +0200 Subject: [PATCH 9/9] #1849: Add tests for VSCodium --- .../urls/vscode/vscodium/1.116.02821/urls | 1 + .../vscodium/project/settings/ide.properties | 2 + .../vscode/vscodium/default/bin/codium | 2 + .../vscode/vscodium/default/bin/codium.cmd | 1 + .../tool/vscode/VsCodiumUrlUpdaterMock.java | 27 ++++++++++ .../tool/vscode/VsCodiumUrlUpdaterTest.java | 50 +++++++++++++++++++ .../VsCodiumUrlUpdater/vscodium-tags.json | 8 +++ 7 files changed, 91 insertions(+) create mode 100644 cli/src/test/resources/ide-projects/vscodium/_ide/urls/vscode/vscodium/1.116.02821/urls create mode 100644 cli/src/test/resources/ide-projects/vscodium/project/settings/ide.properties create mode 100755 cli/src/test/resources/ide-projects/vscodium/repository/vscode/vscodium/default/bin/codium create mode 100644 cli/src/test/resources/ide-projects/vscodium/repository/vscode/vscodium/default/bin/codium.cmd create mode 100644 url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterMock.java create mode 100644 url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterTest.java create mode 100644 url-updater/src/test/resources/integrationtest/VsCodiumUrlUpdater/vscodium-tags.json diff --git a/cli/src/test/resources/ide-projects/vscodium/_ide/urls/vscode/vscodium/1.116.02821/urls b/cli/src/test/resources/ide-projects/vscodium/_ide/urls/vscode/vscodium/1.116.02821/urls new file mode 100644 index 0000000000..ce0f1b90af --- /dev/null +++ b/cli/src/test/resources/ide-projects/vscodium/_ide/urls/vscode/vscodium/1.116.02821/urls @@ -0,0 +1 @@ +${testbaseurl}/download/vscode/vscodium/1.116.02821/VSCodium-1.116.02821.tgz diff --git a/cli/src/test/resources/ide-projects/vscodium/project/settings/ide.properties b/cli/src/test/resources/ide-projects/vscodium/project/settings/ide.properties new file mode 100644 index 0000000000..6b53acf2ae --- /dev/null +++ b/cli/src/test/resources/ide-projects/vscodium/project/settings/ide.properties @@ -0,0 +1,2 @@ +VSCODE_EDITION=vscodium +VSCODE_VERSION=1.116.02821 diff --git a/cli/src/test/resources/ide-projects/vscodium/repository/vscode/vscodium/default/bin/codium b/cli/src/test/resources/ide-projects/vscodium/repository/vscode/vscodium/default/bin/codium new file mode 100755 index 0000000000..73d55c2221 --- /dev/null +++ b/cli/src/test/resources/ide-projects/vscodium/repository/vscode/vscodium/default/bin/codium @@ -0,0 +1,2 @@ +#!/bin/bash +echo "Test for linux and Mac" \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/vscodium/repository/vscode/vscodium/default/bin/codium.cmd b/cli/src/test/resources/ide-projects/vscodium/repository/vscode/vscodium/default/bin/codium.cmd new file mode 100644 index 0000000000..5fc84a8640 --- /dev/null +++ b/cli/src/test/resources/ide-projects/vscodium/repository/vscode/vscodium/default/bin/codium.cmd @@ -0,0 +1 @@ +@echo test for windows \ No newline at end of file diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterMock.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterMock.java new file mode 100644 index 0000000000..cd2f947362 --- /dev/null +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterMock.java @@ -0,0 +1,27 @@ +package com.devonfw.tools.ide.url.tool.vscode; + +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; + +/** + * Mock of {@link VsCodiumUrlUpdater} to allow integration testing with wiremock. + */ +public class VsCodiumUrlUpdaterMock extends VsCodiumUrlUpdater { + + private final String baseUrl; + + VsCodiumUrlUpdaterMock(WireMockRuntimeInfo wireMockRuntimeInfo) { + super(); + this.baseUrl = wireMockRuntimeInfo.getHttpBaseUrl(); + } + + @Override + protected String getDownloadBaseUrl() { + return this.baseUrl; + } + + @Override + protected String doGetVersionUrl() { + + return this.baseUrl + "/repos/" + getGithubOrganization() + "/" + getGithubRepository() + "/git/refs/tags"; + } +} diff --git a/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterTest.java b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterTest.java new file mode 100644 index 0000000000..ffe3344442 --- /dev/null +++ b/url-updater/src/test/java/com/devonfw/tools/ide/url/tool/vscode/VsCodiumUrlUpdaterTest.java @@ -0,0 +1,50 @@ +package com.devonfw.tools.ide.url.tool.vscode; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.head; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import com.devonfw.tools.ide.url.model.folder.UrlRepository; +import com.devonfw.tools.ide.url.updater.AbstractUrlUpdaterTest; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; + +/** + * Test of {@link VsCodiumUrlUpdater}. + */ +@WireMockTest +class VsCodiumUrlUpdaterTest extends AbstractUrlUpdaterTest { + + /** + * verifies that update creates expected files for VSCodium versions. + */ + @Test + void testVsCodiumUrlUpdaterCreatesDownloadUrlsAndChecksums(@TempDir Path tempDir, WireMockRuntimeInfo wmRuntimeInfo) throws IOException { + // given + stubFor(get(urlMatching("/repos/VSCodium/vscodium/git/refs/tags")).willReturn(aResponse().withStatus(200) + .withBody(Files.readAllBytes(PATH_INTEGRATION_TEST.resolve("VsCodiumUrlUpdater").resolve("vscodium-tags.json"))))); + stubFor(head(urlMatching("/.*/VSCodium-(linux|darwin|win32)-(x64|arm64)-.*\\.(tar\\.gz|zip)")).willReturn(aResponse().withStatus(200))); + stubFor(get(urlMatching("/.*/VSCodium-(linux|darwin|win32)-(x64|arm64)-.*\\.(tar\\.gz|zip)")).willReturn(aResponse().withStatus(200).withBody(DOWNLOAD_CONTENT))); + + UrlRepository urlRepository = UrlRepository.load(tempDir); + VsCodiumUrlUpdaterMock updater = new VsCodiumUrlUpdaterMock(wmRuntimeInfo); + // when + updater.update(urlRepository); + + Path vscodium1 = tempDir.resolve("vscode").resolve("vscodium").resolve("1.92.1.24228"); + Path vscodium2 = tempDir.resolve("vscode").resolve("vscodium").resolve("1.116.02821"); + + // then + assertUrlVersionOsArch(vscodium1); + assertUrlVersionOsArch(vscodium2); + } +} diff --git a/url-updater/src/test/resources/integrationtest/VsCodiumUrlUpdater/vscodium-tags.json b/url-updater/src/test/resources/integrationtest/VsCodiumUrlUpdater/vscodium-tags.json new file mode 100644 index 0000000000..c1818375ba --- /dev/null +++ b/url-updater/src/test/resources/integrationtest/VsCodiumUrlUpdater/vscodium-tags.json @@ -0,0 +1,8 @@ +[ + { + "ref": "refs/tags/1.92.1.24228" + }, + { + "ref": "refs/tags/1.116.02821" + } +]