You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2014/11/30 23:26:18 UTC
maven git commit: [MNG-5568] fixed edge case version parsing bug
causing inconsistent comparison results
Repository: maven
Updated Branches:
refs/heads/master 09d64bdf5 -> 14e4885de
[MNG-5568] fixed edge case version parsing bug causing inconsistent
comparison results
Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/14e4885d
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/14e4885d
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/14e4885d
Branch: refs/heads/master
Commit: 14e4885de9729c88715b4036a740733c0476e472
Parents: 09d64bd
Author: Hervé Boutemy <hb...@apache.org>
Authored: Sun Nov 30 23:26:12 2014 +0100
Committer: Hervé Boutemy <hb...@apache.org>
Committed: Sun Nov 30 23:26:12 2014 +0100
----------------------------------------------------------------------
.../artifact/versioning/ComparableVersion.java | 33 ++++++++----------
.../versioning/ComparableVersionTest.java | 36 +++++++++++++++-----
2 files changed, 42 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/maven/blob/14e4885d/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java
----------------------------------------------------------------------
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 df8543b..bc9797c 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
@@ -269,14 +269,16 @@ public class ComparableVersion
void normalize()
{
- for ( ListIterator<Item> iterator = listIterator( size() ); iterator.hasPrevious(); )
+ for ( int i = size() - 1; i >= 0; i-- )
{
- Item item = iterator.previous();
- if ( item.isNull() )
+ Item lastItem = get( i );
+
+ if ( lastItem.isNull() )
{
- iterator.remove(); // remove null trailing items: 0, "", empty list
+ // remove null trailing items: 0, "", empty list
+ remove( i );
}
- else
+ else if ( !( lastItem instanceof ListItem ) )
{
break;
}
@@ -393,19 +395,8 @@ public class ComparableVersion
}
startIndex = i + 1;
- if ( isDigit )
- {
- list.normalize(); // 1.0-* = 1-*
-
- if ( ( i + 1 < version.length() ) && Character.isDigit( version.charAt( i + 1 ) ) )
- {
- // new ListItem only if previous were digits and new char is a digit,
- // ie need to differentiate only 1.1 from 1-1
- list.add( list = new ListItem() );
-
- stack.push( list );
- }
- }
+ list.add( list = new ListItem() );
+ stack.push( list );
}
else if ( Character.isDigit( c ) )
{
@@ -413,6 +404,9 @@ public class ComparableVersion
{
list.add( new StringItem( version.substring( startIndex, i ), true ) );
startIndex = i;
+
+ list.add( list = new ListItem() );
+ stack.push( list );
}
isDigit = true;
@@ -423,6 +417,9 @@ public class ComparableVersion
{
list.add( parseItem( true, version.substring( startIndex, i ) ) );
startIndex = i;
+
+ list.add( list = new ListItem() );
+ stack.push( list );
}
isDigit = false;
http://git-wip-us.apache.org/repos/asf/maven/blob/14e4885d/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/ComparableVersionTest.java
----------------------------------------------------------------------
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 7e37625..6cf372f 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
@@ -38,6 +38,7 @@ public class ComparableVersionTest
String canonical = ret.getCanonical();
String parsedCanonical = new ComparableVersion( canonical ).getCanonical();
+ System.out.println( "canonical( " + version + " ) = " + canonical );
assertEquals( "canonical( " + version + " ) = " + canonical + " -> canonical: " + parsedCanonical, canonical,
parsedCanonical );
@@ -104,6 +105,7 @@ public class ComparableVersionTest
public void testVersionsEqual()
{
+ newComparable( "1.0-alpha" );
checkVersionsEqual( "1", "1" );
checkVersionsEqual( "1", "1.0" );
checkVersionsEqual( "1", "1.0.0" );
@@ -112,18 +114,16 @@ public class ComparableVersionTest
checkVersionsEqual( "1", "1.0-0" );
checkVersionsEqual( "1.0", "1.0-0" );
// no separator between number and character
- checkVersionsEqual( "1a", "1.a" );
checkVersionsEqual( "1a", "1-a" );
checkVersionsEqual( "1a", "1.0-a" );
checkVersionsEqual( "1a", "1.0.0-a" );
- checkVersionsEqual( "1.0a", "1.0.a" );
- checkVersionsEqual( "1.0.0a", "1.0.0.a" );
- checkVersionsEqual( "1x", "1.x" );
+ checkVersionsEqual( "1.0a", "1-a" );
+ checkVersionsEqual( "1.0.0a", "1-a" );
checkVersionsEqual( "1x", "1-x" );
checkVersionsEqual( "1x", "1.0-x" );
checkVersionsEqual( "1x", "1.0.0-x" );
- checkVersionsEqual( "1.0x", "1.0.x" );
- checkVersionsEqual( "1.0.0x", "1.0.0.x" );
+ checkVersionsEqual( "1.0x", "1-x" );
+ checkVersionsEqual( "1.0.0x", "1-x" );
// aliases
checkVersionsEqual( "1ga", "1" );
@@ -131,9 +131,9 @@ public class ComparableVersionTest
checkVersionsEqual( "1cr", "1rc" );
// special "aliases" a, b and m for alpha, beta and milestone
- checkVersionsEqual( "1a1", "1alpha1" );
- checkVersionsEqual( "1b2", "1beta2" );
- checkVersionsEqual( "1m3", "1milestone3" );
+ checkVersionsEqual( "1a1", "1-alpha-1" );
+ checkVersionsEqual( "1b2", "1-beta-2" );
+ checkVersionsEqual( "1m3", "1-milestone-3" );
// case insensitive
checkVersionsEqual( "1X", "1x" );
@@ -183,6 +183,24 @@ public class ComparableVersionTest
checkVersionsOrder( "2.0.1-xyz", "2.0.1-123" );
}
+ /**
+ * Test <a href="https://jira.codehaus.org/browse/MNG-5568">MNG-5568</a> edge case
+ * which was showing transitive inconsistency: since A > B and B > C then we should have A > C
+ * otherwise sorting a list of ComparableVersions() will in some cases throw runtime exception;
+ * see Netbeans issues <a href="https://netbeans.org/bugzilla/show_bug.cgi?id=240845">240845</a> and
+ * <a href="https://netbeans.org/bugzilla/show_bug.cgi?id=226100">226100</a>
+ */
+ public void testMng5568()
+ {
+ String a = "6.1.0";
+ String b = "6.1.0rc3";
+ String c = "6.1H.5-beta"; // this is the unusual version string, with 'H' in the middle
+
+ checkVersionsOrder( b, a ); // classical
+ checkVersionsOrder( b, c ); // now b < c, but before MNG-5568, we had b > c
+ checkVersionsOrder( a, c );
+ }
+
public void testLocaleIndependent()
{
Locale orig = Locale.getDefault();