This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch maven-4.0.x-test-fixes
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/maven-4.0.x-test-fixes by this
push:
new 1aadf33438 Use ComparableVersion for mvnup plugin version comparison
1aadf33438 is described below
commit 1aadf3343829d81b678017ef2fb8b9709f7ee923
Author: Guillaume Nodet <[email protected]>
AuthorDate: Mon May 18 08:45:28 2026 +0200
Use ComparableVersion for mvnup plugin version comparison
Replace hand-rolled version comparison with ComparableVersion which
correctly handles milestone/pre-release qualifiers. The previous
implementation stripped qualifiers (e.g., 3.0.0-M1 → 3.0.0) causing
pre-release versions to be incorrectly considered sufficient.
This fixes 19 projects (flink-connectors, sling) using enforcer
3.0.0-M1 that mvnup failed to upgrade to 3.0.0.
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
---
.../invoker/mvnup/goals/PluginUpgradeStrategy.java | 29 ++--------------
.../mvnup/goals/PluginUpgradeStrategyTest.java | 40 ++++++++++++++++++++++
2 files changed, 42 insertions(+), 27 deletions(-)
diff --git
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategy.java
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategy.java
index 9a3a7f86c1..a52b439a91 100644
---
a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategy.java
+++
b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategy.java
@@ -50,6 +50,7 @@
import org.apache.maven.api.services.ModelBuilderResult;
import org.apache.maven.api.services.RepositoryFactory;
import org.apache.maven.api.services.Sources;
+import org.apache.maven.artifact.versioning.ComparableVersion;
import org.apache.maven.cling.invoker.mvnup.UpgradeContext;
import org.apache.maven.impl.standalone.ApiRunner;
import org.codehaus.plexus.components.secdispatcher.Dispatcher;
@@ -441,33 +442,7 @@ private boolean isVersionBelow(String currentVersion,
String minVersion) {
if (currentVersion == null || minVersion == null) {
return false;
}
-
- // Remove any qualifiers like -SNAPSHOT, -alpha, etc. for comparison
- String cleanCurrent = currentVersion.split("-")[0];
- String cleanMin = minVersion.split("-")[0];
-
- try {
- String[] currentParts = cleanCurrent.split("\\.");
- String[] minParts = cleanMin.split("\\.");
-
- int maxLength = Math.max(currentParts.length, minParts.length);
-
- for (int i = 0; i < maxLength; i++) {
- int currentPart = i < currentParts.length ?
Integer.parseInt(currentParts[i]) : 0;
- int minPart = i < minParts.length ?
Integer.parseInt(minParts[i]) : 0;
-
- if (currentPart < minPart) {
- return true;
- } else if (currentPart > minPart) {
- return false;
- }
- }
-
- return false; // Versions are equal
- } catch (NumberFormatException e) {
- // Fallback to string comparison if parsing fails
- return currentVersion.compareTo(minVersion) < 0;
- }
+ return new ComparableVersion(currentVersion).compareTo(new
ComparableVersion(minVersion)) < 0;
}
/**
diff --git
a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategyTest.java
b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategyTest.java
index 09a24a6e2c..ee4846b11e 100644
---
a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategyTest.java
+++
b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/PluginUpgradeStrategyTest.java
@@ -195,6 +195,46 @@ void shouldNotModifyPluginWhenVersionAlreadySufficient()
throws Exception {
// POM might still be marked as modified due to other plugin
management additions
}
+ @Test
+ @DisplayName("should upgrade milestone version below release minimum")
+ void shouldUpgradeMilestoneVersionBelowRelease() throws Exception {
+ String pomXml = """
+ <?xml version="1.0" encoding="UTF-8"?>
+ <project xmlns="http://maven.apache.org/POM/4.0.0">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>test</groupId>
+ <artifactId>test</artifactId>
+ <version>1.0.0</version>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>3.0.0-M1</version>
+ </plugin>
+ </plugins>
+ </build>
+ </project>
+ """;
+
+ Document document = saxBuilder.build(new StringReader(pomXml));
+ Map<Path, Document> pomMap = Map.of(Paths.get("pom.xml"),
document);
+
+ UpgradeContext context = createMockContext();
+ UpgradeResult result = strategy.doApply(context, pomMap);
+
+ assertTrue(result.success(), "Plugin upgrade should succeed");
+ assertTrue(result.modifiedCount() > 0, "Should have upgraded
3.0.0-M1 to 3.0.0");
+
+ Element root = document.getRootElement();
+ Namespace namespace = root.getNamespace();
+ String version = root.getChild("build", namespace)
+ .getChild("plugins", namespace)
+ .getChild("plugin", namespace)
+ .getChildText("version", namespace);
+ assertEquals("3.0.0", version, "3.0.0-M1 should be upgraded to
3.0.0");
+ }
+
@Test
@DisplayName("should upgrade plugin in pluginManagement")
void shouldUpgradePluginInPluginManagement() throws Exception {