You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2022/12/21 22:39:11 UTC

[maven] branch maven-3.8.x updated: [MNG-7644] Fix version comparison where .X1 < -X2 for any string qualifier X

This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a commit to branch maven-3.8.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-3.8.x by this push:
     new da4246ad2 [MNG-7644] Fix version comparison where .X1 < -X2 for any string qualifier X
da4246ad2 is described below

commit da4246ad2677f3a91353b6f3024832e4a5aff7b4
Author: Swell <57...@users.noreply.github.com>
AuthorDate: Tue Dec 20 18:32:27 2022 +0100

    [MNG-7644] Fix version comparison where .X1 < -X2 for any string qualifier X
    
    This closes #930
---
 .../artifact/versioning/ComparableVersion.java      | 21 ++++++++++++++++++++-
 .../artifact/versioning/ComparableVersionTest.java  | 21 +++++++++++++++++++--
 2 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java b/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java
index 41a9ad153..17aa8cc7a 100644
--- a/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java
+++ b/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java
@@ -53,7 +53,10 @@ import java.util.Properties;
  *     </ul>
  *     Unknown qualifiers are considered after known qualifiers, with lexical order (always case insensitive),
  *   </li>
- * <li>a hyphen usually precedes a qualifier, and is always less important than something preceded with a dot.</li>
+ * <li>a hyphen usually precedes a qualifier, and is always less important than digits/number, for example
+ *   {@code 1.0.RC2 < 1.0-RC3 < 1.0.1}; but prefer {@code 1.0.0-RC1} over {@code 1.0.0.RC1}, and more
+ *   generally: {@code 1.0.X2 < 1.0-X3 < 1.0.1} for any string {@code X}; but prefer {@code 1.0.0-X1}
+ *   over {@code 1.0.0.X1}.</li>
  * </ul>
  *
  * @see <a href="https://cwiki.apache.org/confluence/display/MAVENOLD/Versioning">"Versioning" on Maven Wiki</a>
@@ -676,6 +679,14 @@ public class ComparableVersion
             {
                 if ( !isDigit && i > startIndex )
                 {
+                    // 1.0.0.X1 < 1.0.0-X2
+                    // treat .X as -X for any string qualifier X
+                    if ( !list.isEmpty() )
+                    {
+                        list.add( list = new ListItem() );
+                        stack.push( list );
+                    }
+
                     list.add( new StringItem( version.substring( startIndex, i ), true ) );
                     startIndex = i;
 
@@ -702,6 +713,14 @@ public class ComparableVersion
 
         if ( version.length() > startIndex )
         {
+            // 1.0.0.X1 < 1.0.0-X2
+            // treat .X as -X for any string qualifier X
+            if ( !isDigit && !list.isEmpty() )
+            {
+                list.add( list = new ListItem() );
+                stack.push( list );
+            }
+
             list.add( parseItem( isDigit, version.substring( startIndex ) ) );
         }
 
diff --git a/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/ComparableVersionTest.java b/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/ComparableVersionTest.java
index 97fb46d55..832ab179b 100644
--- a/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/ComparableVersionTest.java
+++ b/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/ComparableVersionTest.java
@@ -51,8 +51,8 @@ public class ComparableVersionTest
             "1-1", "1-2", "1-123" };
 
     private static final String[] VERSIONS_NUMBER =
-        { "2.0", "2-1", "2.0.a", "2.0.0.a", "2.0.2", "2.0.123", "2.1.0", "2.1-a", "2.1b", "2.1-c", "2.1-1", "2.1.0.1",
-            "2.2", "2.123", "11.a2", "11.a11", "11.b2", "11.b11", "11.m2", "11.m11", "11", "11.a", "11b", "11c", "11m" };
+        { "2.0", "2.0.a", "2-1", "2.0.2", "2.0.123", "2.1.0", "2.1-a", "2.1b", "2.1-c", "2.1-1", "2.1.0.1", "2.2",
+            "2.123", "11.a2", "11.a11", "11.b2", "11.b11", "11.m2", "11.m11", "11", "11.a", "11b", "11c", "11m" };
 
     private void checkVersionsOrder( String[] versions )
     {
@@ -337,4 +337,21 @@ public class ComparableVersionTest
 
         assertEquals( "reused instance should be equivalent to new instance", c1, c2 );
     }
+
+    /**
+     * Test <a href="https://issues.apache.org/jira/browse/MNG-7644">MNG-7644</a> edge cases
+     * 1.0.0.RC1 < 1.0.0-RC2 and more generally:
+     * 1.0.0.X1 < 1.0.0-X2 for any string X
+     */
+    public void testMng7644()
+    {
+        for ( String x : new String[]{ "abc", "alpha", "a", "beta", "b", "def", "milestone", "m", "RC" } ) {
+            // 1.0.0.X1 < 1.0.0-X2 for any string x
+            checkVersionsOrder( "1.0.0." + x + "1", "1.0.0-" + x + "2" );
+            // 2.0.X == 2-X == 2.0.0.X for any string x
+            checkVersionsEqual( "2-" + x, "2.0." + x ); // previously ordered, now equals
+            checkVersionsEqual( "2-" + x, "2.0.0." + x ); // previously ordered, now equals
+            checkVersionsEqual( "2.0." + x, "2.0.0." + x ); // previously ordered, now equals
+        }
+    }
 }