Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ This file documents all notable changes to https://github.com/devonfw/IDEasy[IDE

Release with new features and bugfixes:

* https://github.com/devonfw/IDEasy/issues/1956[#1956]: Merging MAVEN_ARGS buggy
* https://github.com/devonfw/IDEasy/issues/1846[#1846]: Fixed macOS Gatekeeper workaround
* https://github.com/devonfw/IDEasy/issues/1906[#1906]: Fixed `ide uninstall` failing on macOS
* https://github.com/devonfw/IDEasy/issues/1985[#1985]: Fix path traversal errors when extracting ZIPs on Windows
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,20 +370,34 @@ private static record ResolveContext(Object rootSrc, String rootValue, boolean l
}

/**
* Merges user value with default, avoiding duplication if default already contains the user value.
* Appends IDEasy's default to the user value, stripping conflicting user {@code -s <path>} and {@code -Dsettings.security=} arguments so the default wins
* without duplicates. An empty default leaves the user value untouched.
*
* @param value the user-defined value
* @param defaultValue IDEasy's default value
* @return the merged value, or the user value if defaultValue is null or empty
* @param value the user-defined value.
* @param defaultValue IDEasy's default value.
* @return the merged value.
*/
static String mergeWithDefault(String value, String defaultValue) {
if (defaultValue == null || defaultValue.isEmpty()) {
return value;
}
if (defaultValue.contains(value)) {
return defaultValue;
StringBuilder sb = new StringBuilder();
String[] tokens = value.trim().split("\\s+");
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i];
if (token.equals("-s")) {
i++;
} else if (!token.startsWith("-Dsettings.security=")) {
if (!sb.isEmpty()) {
sb.append(' ');
}
sb.append(token);
}
}
if (!sb.isEmpty()) {
sb.append(' ');
}
return value + " " + defaultValue;
return sb.append(defaultValue).toString();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,24 @@ void testUserDefinedMavenArgsAlreadyInIdeasyDefaultsIsNotDuplicated() {
assertThat(AbstractEnvironmentVariables.mergeWithDefault("-s /path/to/settings.xml", defaultValue)).isEqualTo(defaultValue);
assertThat(AbstractEnvironmentVariables.mergeWithDefault("-s", defaultValue)).isEqualTo(defaultValue);
}

/**
* Test that conflicting user-defined {@code -s} and {@code -Dsettings.security=} arguments are stripped and overridden by IDEasy's computed values (without
* duplication), while unrelated user arguments are preserved. See https://github.com/devonfw/IDEasy/issues/1956[#1956].
*/
@Test
void testUserDefinedMavenArgsConflictingWithIdeasyDefaultsAreOverridden() {

String defaultValue = "-s /ide/settings.xml -Dsettings.security=/ide/settings-security.xml";
// user overrides both -s and -Dsettings.security= and keeps an unrelated argument
assertThat(AbstractEnvironmentVariables.mergeWithDefault("-Xmx8000m -s invalid/settings.xml -Dsettings.security=wrong", defaultValue))
.isEqualTo("-Xmx8000m " + defaultValue);
// user overrides only -Dsettings.security=
assertThat(AbstractEnvironmentVariables.mergeWithDefault("-Xmx8000m -Dsettings.security=wrong", defaultValue))
.isEqualTo("-Xmx8000m " + defaultValue);
// user has no conflicting argument, so all user arguments are kept
assertThat(AbstractEnvironmentVariables.mergeWithDefault("-T 4", defaultValue)).isEqualTo("-T 4 " + defaultValue);
// empty default leaves the user value untouched
assertThat(AbstractEnvironmentVariables.mergeWithDefault("-s invalid/settings.xml", "")).isEqualTo("-s invalid/settings.xml");
}
}
Loading