Fix an error about version comparision in development environment (#1039)

* Let unknown version as maximum version

* Fix VersionUtilTest error

* Remove deprecated version comparision method and related test
pull/1041/head
John Niang 2020-08-23 17:47:52 +08:00 committed by GitHub
parent a318abcdc2
commit 60ad4dad80
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 10 additions and 93 deletions

View File

@ -47,6 +47,11 @@ public class Version implements Comparable<Version> {
*/ */
private static final Version EMPTY_VERSION = new Version(0, 0, 0); private static final Version EMPTY_VERSION = new Version(0, 0, 0);
/**
* Maximum version.
*/
private static final Version MAXIMUM_VERSION = new Version(Long.MAX_VALUE, Long.MAX_VALUE, Long.MAX_VALUE);
/** /**
* Major number. * Major number.
*/ */
@ -128,7 +133,7 @@ public class Version implements Comparable<Version> {
} }
// handle unknown version // handle unknown version
if (StringUtils.equalsIgnoreCase(version, HaloConst.UNKNOWN_VERSION)) { if (StringUtils.equalsIgnoreCase(version, HaloConst.UNKNOWN_VERSION)) {
return Optional.of(new Version()); return Optional.of(MAXIMUM_VERSION);
} }
// get matcher for version // get matcher for version
Matcher matcher = PATTERN.matcher(version); Matcher matcher = PATTERN.matcher(version);

View File

@ -1,11 +1,6 @@
package run.halo.app.utils; package run.halo.app.utils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert;
import run.halo.app.model.support.HaloConst;
import java.util.Objects;
import java.util.StringTokenizer;
/** /**
* Version utility. * Version utility.
@ -16,85 +11,11 @@ import java.util.StringTokenizer;
* @date 2020-08-03 * @date 2020-08-03
*/ */
@Slf4j @Slf4j
public class VersionUtil { public final class VersionUtil {
private static final String UNDERLINE = "_";
private VersionUtil() { private VersionUtil() {
} }
@Deprecated
public static int[] getCanonicalVersion(String version) {
Assert.hasText(version, "Version must not be blank");
if (Objects.equals(version, HaloConst.UNKNOWN_VERSION)) {
log.warn("Unknown version will be converted to {}.{}.{}.{}",
Integer.MAX_VALUE,
Integer.MAX_VALUE,
Integer.MAX_VALUE,
Integer.MAX_VALUE);
return new int[] {Integer.MAX_VALUE,
Integer.MAX_VALUE,
Integer.MAX_VALUE,
Integer.MAX_VALUE};
}
int[] canonicalVersion = new int[] {1, 1, 0, 0};
StringTokenizer tokenizer = new StringTokenizer(version, ".");
String token = tokenizer.nextToken();
canonicalVersion[0] = Integer.parseInt(token);
token = tokenizer.nextToken();
StringTokenizer subTokenizer;
if (!token.contains(UNDERLINE)) {
canonicalVersion[1] = Integer.parseInt(token);
} else {
subTokenizer = new StringTokenizer(token, UNDERLINE);
canonicalVersion[1] = Integer.parseInt(subTokenizer.nextToken());
canonicalVersion[3] = Integer.parseInt(subTokenizer.nextToken());
}
if (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken();
if (!token.contains(UNDERLINE)) {
canonicalVersion[2] = Integer.parseInt(token);
if (tokenizer.hasMoreTokens()) {
canonicalVersion[3] = Integer.parseInt(tokenizer.nextToken());
}
} else {
subTokenizer = new StringTokenizer(token, UNDERLINE);
canonicalVersion[2] = Integer.parseInt(subTokenizer.nextToken());
canonicalVersion[3] = Integer.parseInt(subTokenizer.nextToken());
}
}
return canonicalVersion;
}
@Deprecated
public static int compare(String version1, String version2) {
log.debug("Comparing version [{}] with [{}]", version1, version2);
int[] canonicalVersion1 = getCanonicalVersion(version1);
int[] canonicalVersion2 = getCanonicalVersion(version2);
if (canonicalVersion1[0] < canonicalVersion2[0]) {
return -1;
} else if (canonicalVersion1[0] > canonicalVersion2[0]) {
return 1;
} else if (canonicalVersion1[1] < canonicalVersion2[1]) {
return -1;
} else if (canonicalVersion1[1] > canonicalVersion2[1]) {
return 1;
} else if (canonicalVersion1[2] < canonicalVersion2[2]) {
return -1;
} else if (canonicalVersion1[2] > canonicalVersion2[2]) {
return 1;
} else if (canonicalVersion1[3] < canonicalVersion2[3]) {
return -1;
} else {
return canonicalVersion1[3] > canonicalVersion2[3] ? 1 : 0;
}
}
/** /**
* Compare version. * Compare version.
* *

View File

@ -4,7 +4,8 @@ import org.apache.commons.lang3.RandomStringUtils;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import run.halo.app.model.support.HaloConst; import run.halo.app.model.support.HaloConst;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
/** /**
* @author ryanwang * @author ryanwang
@ -29,17 +30,7 @@ class VersionUtilTest {
RandomStringUtils.randomNumeric(1), RandomStringUtils.randomNumeric(1),
RandomStringUtils.randomNumeric(2), RandomStringUtils.randomNumeric(2),
RandomStringUtils.randomNumeric(3)); RandomStringUtils.randomNumeric(3));
assertFalse(VersionUtil.compareVersion(HaloConst.UNKNOWN_VERSION, randomVersion)); assertTrue(VersionUtil.compareVersion(HaloConst.UNKNOWN_VERSION, randomVersion));
} }
@Test
void unknownOrEmptyCanonicalVersionTest() {
assertThrows(IllegalArgumentException.class, () -> VersionUtil.getCanonicalVersion(null));
int[] version = VersionUtil.getCanonicalVersion(HaloConst.UNKNOWN_VERSION);
assertNotNull(version);
assertEquals(4, version.length);
for (int v : version) {
assertEquals(Integer.MAX_VALUE, v);
}
}
} }