Skip to content

Commit 1db950f

Browse files
committed
[MNG-7559] Fix version comparison with case insensitive lexical order
1 parent 3b15101 commit 1db950f

File tree

2 files changed

+120
-6
lines changed

2 files changed

+120
-6
lines changed

maven-resolver-util/src/main/java/org/eclipse/aether/util/version/GenericVersion.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,26 +176,31 @@ public String toString() {
176176

177177
static final class Tokenizer {
178178

179-
private static final Integer QUALIFIER_ALPHA = -5;
179+
private static final Integer QUALIFIER_ALPHA = -6;
180180

181-
private static final Integer QUALIFIER_BETA = -4;
181+
private static final Integer QUALIFIER_BETA = -5;
182182

183-
private static final Integer QUALIFIER_MILESTONE = -3;
183+
private static final Integer QUALIFIER_MILESTONE = -4;
184184

185185
private static final Map<String, Integer> QUALIFIERS;
186186

187187
static {
188188
QUALIFIERS = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
189+
// PRE RELEASE
189190
QUALIFIERS.put("alpha", QUALIFIER_ALPHA);
190191
QUALIFIERS.put("beta", QUALIFIER_BETA);
191192
QUALIFIERS.put("milestone", QUALIFIER_MILESTONE);
192-
QUALIFIERS.put("cr", -2);
193+
QUALIFIERS.put("preview", -3);
193194
QUALIFIERS.put("rc", -2);
195+
QUALIFIERS.put("cr", -2);
196+
QUALIFIERS.put("dev", -1);
194197
QUALIFIERS.put("snapshot", -1);
195-
QUALIFIERS.put("ga", 0);
198+
// RELEASE
199+
QUALIFIERS.put("", 0);
196200
QUALIFIERS.put("final", 0);
201+
QUALIFIERS.put("ga", 0);
197202
QUALIFIERS.put("release", 0);
198-
QUALIFIERS.put("", 0);
203+
// POST RELEASE
199204
QUALIFIERS.put("sp", 1);
200205
}
201206

maven-resolver-util/src/test/java/org/eclipse/aether/util/version/GenericVersionTest.java

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,4 +632,113 @@ private Stream<String> uuidVersionStringStream() {
632632
"f95e94f7-2443-4b2f-a10d-059d8d224dd9",
633633
"b558af80-78bc-43c7-b916-d635a23cc4b5");
634634
}
635+
636+
private void checkVersionsOrder(String[] versions) {
637+
assertSequence(versions);
638+
}
639+
640+
private void checkVersionsEqual(String v1, String v2) {
641+
assertOrder(X_EQ_Y, v1, v2);
642+
}
643+
644+
private void checkVersionsHaveSameOrder(String v1, String v2) {
645+
assertOrder(X_EQ_Y, v1, v2);
646+
}
647+
648+
private void checkVersionsOrder(String v1, String v2) {
649+
assertOrder(X_LT_Y, v1, v2);
650+
}
651+
652+
/**
653+
* Test <a href="https://issues.apache.org/jira/browse/MNG-5568">MNG-5568</a> edge case
654+
* which was showing transitive inconsistency: since A &gt; B and B &gt; C then we should have A &gt; C
655+
* otherwise sorting a list of ComparableVersions() will in some cases throw runtime exception;
656+
* see Netbeans issues <a href="https://netbeans.org/bugzilla/show_bug.cgi?id=240845">240845</a> and
657+
* <a href="https://netbeans.org/bugzilla/show_bug.cgi?id=226100">226100</a>
658+
*/
659+
@Test
660+
void testMng5568() {
661+
checkVersionsOrder("6.1.0rc3", "6.1H.5-beta");
662+
checkVersionsOrder("6.1.0rc3", "6.1.0"); // classical
663+
checkVersionsOrder("6.1.0", "6.1H.5-beta"); // transitivity
664+
}
665+
666+
/**
667+
* Test <a href="https://jira.apache.org/jira/browse/MNG-6572">MNG-6572</a> optimization.
668+
*/
669+
@Test
670+
void testMng6572() {
671+
String a = "20190126.230843"; // resembles a SNAPSHOT
672+
String b = "1234567890.12345"; // 10 digit number
673+
String c = "123456789012345.1H.5-beta"; // 15 digit number
674+
String d = "12345678901234567890.1H.5-beta"; // 20 digit number
675+
676+
checkVersionsOrder(a, b);
677+
checkVersionsOrder(b, c);
678+
checkVersionsOrder(a, c);
679+
checkVersionsOrder(c, d);
680+
checkVersionsOrder(b, d);
681+
checkVersionsOrder(a, d);
682+
}
683+
684+
/**
685+
* Test <a href="https://issues.apache.org/jira/browse/MNG-6964">MNG-6964</a> edge cases
686+
* for qualifiers that start with "-0.", which was showing A == C and B == C but A &lt; B.
687+
*/
688+
@Test
689+
void testMng6964() {
690+
String a = "1-0.alpha";
691+
String b = "1-0.beta";
692+
String c = "1";
693+
694+
checkVersionsOrder(a, c); // Now a < c, but before MNG-6964 they were equal
695+
checkVersionsOrder(b, c); // Now b < c, but before MNG-6964 they were equal
696+
checkVersionsOrder(a, b); // Should still be true
697+
}
698+
699+
/**
700+
* Test <a href="https://issues.apache.org/jira/browse/MNG-7559">MNG-7559</a> edge cases
701+
* -pfd < final, ga, release
702+
* 2.0.1.MR < 2.0.1
703+
* 9.4.1.jre16 > 9.4.1.jre16-preview
704+
*/
705+
@Test
706+
void testMng7559() {
707+
// checking general cases
708+
// checkVersionsOrder(new String[] {"ab", "alpha", "beta", "cd", "ea", "milestone", "pfd", "preview", "RC"});
709+
// checking identified issues respect the general case
710+
// checkVersionsOrder("2.3-pfd", "2.3");
711+
// checkVersionsOrder("2.0.1.MR", "2.0.1");
712+
checkVersionsOrder("9.4.1.jre16-preview", "9.4.1.jre16");
713+
checkVersionsOrder("1-ga-1", "1-sp-1");
714+
}
715+
716+
/**
717+
* Test <a href="https://issues.apache.org/jira/browse/MNG-7644">MNG-7644</a> edge cases
718+
* 1.0.0.RC1 &lt; 1.0.0-RC2 and more generally:
719+
* 1.0.0.X1 &lt; 1.0.0-X2 for any string X
720+
*/
721+
@Test
722+
void testMng7644() {
723+
for (String x : new String[] {"abc", "alpha", "a", "beta", "b", "def", "m", "preview", "RC"}) {
724+
// 1.0.0.X1 < 1.0.0-X2 for any string x
725+
checkVersionsOrder("1.0.0." + x + "1", "1.0.0-" + x + "2");
726+
// 2.0.X1 == 2-X1 == 2.0.0.X1 for any string x
727+
checkVersionsEqual("2-" + x + "1", "2.0." + x + "1"); // previously ordered, now equals
728+
checkVersionsEqual("2-" + x + "1", "2.0.0." + x + "1"); // previously ordered, now equals
729+
checkVersionsEqual("2.0." + x + "1", "2.0.0." + x + "1"); // previously ordered, now equals
730+
}
731+
}
732+
733+
@Test
734+
public void testMng7714() {
735+
String f = ("1.0.final-redhat");
736+
String sp1 = ("1.0-sp1-redhat");
737+
String sp2 = ("1.0-sp-1-redhat");
738+
String sp3 = ("1.0-sp.1-redhat");
739+
assertOrder(X_LT_Y, f, sp1);
740+
assertOrder(X_LT_Y, f, sp2);
741+
assertOrder(X_LT_Y, f, sp3);
742+
}
743+
635744
}

0 commit comments

Comments
 (0)