mirror of https://github.com/halo-dev/halo
fix: Fix startup exception and theme imports in dev environment (#916)
* Log error instead of throwing while starting halo * Provide unknown version support * Fix code formatpull/917/head
parent
73362869b7
commit
658f0a2b3f
|
@ -74,7 +74,6 @@ public class StartedListener implements ApplicationListener<ApplicationStartedEv
|
||||||
|
|
||||||
private void printStartInfo() {
|
private void printStartInfo() {
|
||||||
String blogUrl = optionService.getBlogBaseUrl();
|
String blogUrl = optionService.getBlogBaseUrl();
|
||||||
|
|
||||||
log.info(AnsiOutput.toString(AnsiColor.BRIGHT_BLUE, "Halo started at ", blogUrl));
|
log.info(AnsiOutput.toString(AnsiColor.BRIGHT_BLUE, "Halo started at ", blogUrl));
|
||||||
log.info(AnsiOutput.toString(AnsiColor.BRIGHT_BLUE, "Halo admin started at ", blogUrl, "/", haloProperties.getAdminPath()));
|
log.info(AnsiOutput.toString(AnsiColor.BRIGHT_BLUE, "Halo admin started at ", blogUrl, "/", haloProperties.getAdminPath()));
|
||||||
if (!haloProperties.isDocDisabled()) {
|
if (!haloProperties.isDocDisabled()) {
|
||||||
|
@ -149,7 +148,7 @@ public class StartedListener implements ApplicationListener<ApplicationStartedEv
|
||||||
log.debug("Skipped copying theme folder due to existence of theme folder");
|
log.debug("Skipped copying theme folder due to existence of theme folder");
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException("Initialize internal theme to user path error", e);
|
log.error("Initialize internal theme to user path error!", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,7 +187,6 @@ public class StartedListener implements ApplicationListener<ApplicationStartedEv
|
||||||
Files.createDirectories(dataExportPath);
|
Files.createDirectories(dataExportPath);
|
||||||
log.info("Created data export directory: [{}]", dataExportPath);
|
log.info("Created data export directory: [{}]", dataExportPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (IOException ie) {
|
} catch (IOException ie) {
|
||||||
throw new RuntimeException("Failed to initialize directories", ie);
|
throw new RuntimeException("Failed to initialize directories", ie);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package run.halo.app.model.support;
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <pre>
|
* <pre>
|
||||||
|
@ -139,6 +140,12 @@ public class HaloConst {
|
||||||
* Version constant. (Available in production environment)
|
* Version constant. (Available in production environment)
|
||||||
*/
|
*/
|
||||||
public static final String HALO_VERSION;
|
public static final String HALO_VERSION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unknown version: unknown
|
||||||
|
*/
|
||||||
|
public static final String UNKNOWN_VERSION = "unknown";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database product name.
|
* Database product name.
|
||||||
*/
|
*/
|
||||||
|
@ -150,6 +157,6 @@ public class HaloConst {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
// Set version
|
// Set version
|
||||||
HALO_VERSION = HaloConst.class.getPackage().getImplementationVersion();
|
HALO_VERSION = Optional.ofNullable(HaloConst.class.getPackage().getImplementationVersion()).orElse(UNKNOWN_VERSION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,43 +1,63 @@
|
||||||
package run.halo.app.utils;
|
package run.halo.app.utils;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
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;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ryanwang
|
* @author ryanwang
|
||||||
* @date 2020-02-03
|
* @date 2020-02-03
|
||||||
* @see com.sun.xml.internal.ws.util.VersionUtil
|
* @see "com.sun.xml.internal.ws.util.VersionUtil"
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
public class VersionUtil {
|
public class VersionUtil {
|
||||||
|
|
||||||
public VersionUtil() {
|
private static final String UNDERLINE = "_";
|
||||||
|
|
||||||
|
private VersionUtil() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int[] getCanonicalVersion(String version) {
|
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};
|
int[] canonicalVersion = new int[] {1, 1, 0, 0};
|
||||||
StringTokenizer tokenizer = new StringTokenizer(version, ".");
|
StringTokenizer tokenizer = new StringTokenizer(version, ".");
|
||||||
String token = tokenizer.nextToken();
|
String token = tokenizer.nextToken();
|
||||||
canonicalVersion[0] = Integer.parseInt(token);
|
canonicalVersion[0] = Integer.parseInt(token);
|
||||||
token = tokenizer.nextToken();
|
token = tokenizer.nextToken();
|
||||||
StringTokenizer subTokenizer;
|
StringTokenizer subTokenizer;
|
||||||
if (!token.contains(StrUtil.UNDERLINE)) {
|
if (!token.contains(UNDERLINE)) {
|
||||||
canonicalVersion[1] = Integer.parseInt(token);
|
canonicalVersion[1] = Integer.parseInt(token);
|
||||||
} else {
|
} else {
|
||||||
subTokenizer = new StringTokenizer(token, "_");
|
subTokenizer = new StringTokenizer(token, UNDERLINE);
|
||||||
canonicalVersion[1] = Integer.parseInt(subTokenizer.nextToken());
|
canonicalVersion[1] = Integer.parseInt(subTokenizer.nextToken());
|
||||||
canonicalVersion[3] = Integer.parseInt(subTokenizer.nextToken());
|
canonicalVersion[3] = Integer.parseInt(subTokenizer.nextToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tokenizer.hasMoreTokens()) {
|
if (tokenizer.hasMoreTokens()) {
|
||||||
token = tokenizer.nextToken();
|
token = tokenizer.nextToken();
|
||||||
if (!token.contains(StrUtil.UNDERLINE)) {
|
if (!token.contains(UNDERLINE)) {
|
||||||
canonicalVersion[2] = Integer.parseInt(token);
|
canonicalVersion[2] = Integer.parseInt(token);
|
||||||
if (tokenizer.hasMoreTokens()) {
|
if (tokenizer.hasMoreTokens()) {
|
||||||
canonicalVersion[3] = Integer.parseInt(tokenizer.nextToken());
|
canonicalVersion[3] = Integer.parseInt(tokenizer.nextToken());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
subTokenizer = new StringTokenizer(token, "_");
|
subTokenizer = new StringTokenizer(token, UNDERLINE);
|
||||||
canonicalVersion[2] = Integer.parseInt(subTokenizer.nextToken());
|
canonicalVersion[2] = Integer.parseInt(subTokenizer.nextToken());
|
||||||
canonicalVersion[3] = Integer.parseInt(subTokenizer.nextToken());
|
canonicalVersion[3] = Integer.parseInt(subTokenizer.nextToken());
|
||||||
}
|
}
|
||||||
|
@ -47,6 +67,8 @@ public class VersionUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int compare(String version1, String version2) {
|
public static int compare(String version1, String version2) {
|
||||||
|
log.debug("Comparing version [{}] with [{}]", version1, version2);
|
||||||
|
|
||||||
int[] canonicalVersion1 = getCanonicalVersion(version1);
|
int[] canonicalVersion1 = getCanonicalVersion(version1);
|
||||||
int[] canonicalVersion2 = getCanonicalVersion(version2);
|
int[] canonicalVersion2 = getCanonicalVersion(version2);
|
||||||
if (canonicalVersion1[0] < canonicalVersion2[0]) {
|
if (canonicalVersion1[0] < canonicalVersion2[0]) {
|
||||||
|
|
|
@ -1,26 +1,45 @@
|
||||||
package run.halo.app.utils;
|
package run.halo.app.utils;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
import org.junit.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import run.halo.app.model.support.HaloConst;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ryanwang
|
* @author ryanwang
|
||||||
* @date 2020-02-03
|
* @date 2020-02-03
|
||||||
*/
|
*/
|
||||||
public class VersionUtilTest {
|
class VersionUtilTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void compareVersion() {
|
void compareVersion() {
|
||||||
Assert.assertTrue(VersionUtil.compareVersion("1.2.0", "1.1.1"));
|
assertTrue(VersionUtil.compareVersion("1.2.0", "1.1.1"));
|
||||||
|
assertTrue(VersionUtil.compareVersion("1.2.1", "1.2.0"));
|
||||||
|
assertTrue(VersionUtil.compareVersion("1.2.0", "1.1.1.0"));
|
||||||
|
assertTrue(VersionUtil.compareVersion("1.2.0", "0.4.4"));
|
||||||
|
assertFalse(VersionUtil.compareVersion("1.1.1", "1.2.0"));
|
||||||
|
assertFalse(VersionUtil.compareVersion("0.0.1", "1.2.0"));
|
||||||
|
}
|
||||||
|
|
||||||
Assert.assertTrue(VersionUtil.compareVersion("1.2.1", "1.2.0"));
|
@Test
|
||||||
|
void unknownVersionCompareTest() {
|
||||||
|
// build a random version
|
||||||
|
String randomVersion = String.join(".",
|
||||||
|
RandomStringUtils.randomNumeric(1),
|
||||||
|
RandomStringUtils.randomNumeric(2),
|
||||||
|
RandomStringUtils.randomNumeric(3));
|
||||||
|
VersionUtil.compareVersion(HaloConst.UNKNOWN_VERSION, randomVersion);
|
||||||
|
}
|
||||||
|
|
||||||
Assert.assertTrue(VersionUtil.compareVersion("1.2.0", "1.1.1.0"));
|
@Test
|
||||||
|
void unknownOrEmptyCanonicalVersionTest() {
|
||||||
Assert.assertTrue(VersionUtil.compareVersion("1.2.0", "0.4.4"));
|
assertThrows(IllegalArgumentException.class, () -> VersionUtil.getCanonicalVersion(null));
|
||||||
|
int[] version = VersionUtil.getCanonicalVersion(HaloConst.UNKNOWN_VERSION);
|
||||||
Assert.assertFalse(VersionUtil.compareVersion("1.1.1", "1.2.0"));
|
assertNotNull(version);
|
||||||
|
assertEquals(4, version.length);
|
||||||
Assert.assertFalse(VersionUtil.compareVersion("0.0.1", "1.2.0"));
|
for (int v : version) {
|
||||||
|
assertEquals(Integer.MAX_VALUE, v);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue