diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/VersionNumber.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/VersionNumber.java
index 0753d0250..2192392b4 100644
--- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/VersionNumber.java
+++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/VersionNumber.java
@@ -18,17 +18,14 @@
package org.jackhuang.hmcl.util.versioning;
import java.math.BigInteger;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Deque;
-import java.util.Iterator;
-import java.util.Objects;
+import java.util.*;
/**
* Copied from org.apache.maven.artifact.versioning.ComparableVersion
* Apache License 2.0
- *
+ *
* Maybe we can migrate to org.jenkins-ci:version-number:1.7?
+ *
* @see Specification
*/
public final class VersionNumber implements Comparable {
@@ -220,9 +217,17 @@ public final class VersionNumber implements Comparable {
*/
private static final class StringItem implements Item {
private final String value;
+ private final boolean pre;
StringItem(String value) {
this.value = value;
+
+ String lower = value.trim().toLowerCase(Locale.ROOT);
+ this.pre = lower.startsWith("alpha")
+ || lower.startsWith("beta")
+ || lower.startsWith("pre")
+ || lower.startsWith("rc")
+ || lower.startsWith("experimental");
}
public int getType() {
@@ -235,8 +240,8 @@ public final class VersionNumber implements Comparable {
public int compareTo(Item item) {
if (item == null) {
- // 1-string > 1
- return 1;
+ // 1-beta < 1 < 1-string
+ return pre ? -1 : 1;
}
switch (item.getType()) {
case LONG_ITEM:
diff --git a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/versioning/VersionNumberTest.java b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/versioning/VersionNumberTest.java
index 7f4ac3325..b30b23055 100644
--- a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/versioning/VersionNumberTest.java
+++ b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/versioning/VersionNumberTest.java
@@ -90,12 +90,17 @@ public class VersionNumberTest {
assertLessThan("1.99999999999999999999", "1.199999999999999999999");
assertLessThan("1.99999999999999999999", "2");
assertLessThan("1.99999999999999999999", "2.0");
+ assertLessThan("1.0", "1.0-zzz");
+ assertLessThan("1.0-beta.1", "1.0");
+ assertLessThan("1.0-alpha.1", "1.0-beta.1");
+ assertLessThan("3.6.15", "3.6.15.289");
+ assertLessThan("3.6.15.289", "3.6.16");
}
@Test
public void testSorting() {
final Comparator comparator = ((Comparator) VersionNumber::compare).thenComparing(String::compareTo);
- final List input = Collections.unmodifiableList(Arrays.asList(
+ final List input = List.of(
"0",
"0.10.0",
"1.6.4",
@@ -120,6 +125,9 @@ public class VersionNumberTest {
"1.8.9",
"1.8.9-forge1902",
"1.9",
+ "1.10-alpha.2",
+ "1.10-beta.1",
+ "1.10-beta.2",
"1.10",
"1.10.2",
"1.10.2-AOE",
@@ -140,7 +148,8 @@ public class VersionNumberTest {
"1.99999999999999999999",
"2",
"2.0",
- "2.1"));
+ "2.1"
+ );
List output = new ArrayList<>(input);
output.sort(comparator);