9
0
mirror of https://github.com/WiIIiam278/HuskSync.git synced 2025-12-19 14:59:21 +00:00

feat: support 1.21.8 alongside 1.21.7

adds support for version range expressions to the CompatibilityChecker. Also adds tests for this.
This commit is contained in:
William278
2025-07-20 14:37:05 +01:00
parent 64c81a9a5a
commit 879aef471a
20 changed files with 122 additions and 19 deletions

View File

@@ -48,7 +48,7 @@ HuskSync supports the following [compatible versions](https://william278.net/doc
| Minecraft | Latest HuskSync | Java Version | Platforms | Support Status | | Minecraft | Latest HuskSync | Java Version | Platforms | Support Status |
|:---------------:|:---------------:|:------------:|:--------------|:------------------------------| |:---------------:|:---------------:|:------------:|:--------------|:------------------------------|
| 1.21.7 | _latest_ | 21 | Paper | ✅ **Active Release** | | 1.21.7/8 | _latest_ | 21 | Paper | ✅ **Active Release** |
| 1.21.6 | 3.8.5 | 21 | Paper | 🗃️ Archived (July 2025) | | 1.21.6 | 3.8.5 | 21 | Paper | 🗃️ Archived (July 2025) |
| 1.21.5 | _latest_ | 21 | Paper | ✅ **January 2026** (Non-LTS) | | 1.21.5 | _latest_ | 21 | Paper | ✅ **January 2026** (Non-LTS) |
| 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (Non-LTS) | | 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (Non-LTS) |

View File

@@ -1,3 +1,4 @@
minecraft_version_range='1.20.1'
minecraft_version_numeric=12001 minecraft_version_numeric=12001
minecraft_api_version=1.20 minecraft_api_version=1.20
paper_api_version=1.20.1-R0.1-SNAPSHOT paper_api_version=1.20.1-R0.1-SNAPSHOT

View File

@@ -1,3 +1,4 @@
minecraft_version_range='1.21.1'
minecraft_version_numeric=12101 minecraft_version_numeric=12101
minecraft_api_version=1.21 minecraft_api_version=1.21
paper_api_version=1.21.1-R0.1-SNAPSHOT paper_api_version=1.21.1-R0.1-SNAPSHOT

View File

@@ -1,3 +1,4 @@
minecraft_version_range='1.21.4'
minecraft_version_numeric=12104 minecraft_version_numeric=12104
minecraft_api_version=1.21 minecraft_api_version=1.21
paper_api_version=1.21.4-R0.1-SNAPSHOT paper_api_version=1.21.4-R0.1-SNAPSHOT

View File

@@ -1,3 +1,4 @@
minecraft_version_range='1.21.5'
minecraft_version_numeric=12105 minecraft_version_numeric=12105
minecraft_api_version=1.21 minecraft_api_version=1.21
paper_api_version=1.21.5-R0.1-SNAPSHOT paper_api_version=1.21.5-R0.1-SNAPSHOT

View File

@@ -1,3 +1,4 @@
minecraft_version_numeric=12107 minecraft_version_range='>=1.21.7 <=1.21.8'
minecraft_version_numeric=12108
minecraft_api_version=1.21 minecraft_api_version=1.21
paper_api_version=1.21.7-R0.1-SNAPSHOT paper_api_version=1.21.8-R0.1-SNAPSHOT

View File

@@ -42,6 +42,7 @@ processResources {
version: version, version: version,
paper_api_version: paper_api_version, paper_api_version: paper_api_version,
minecraft_version: project.name, minecraft_version: project.name,
minecraft_version_range: minecraft_version_range,
minecraft_api_version: minecraft_api_version minecraft_api_version: minecraft_api_version
]) ])
} }

View File

@@ -1,2 +1,2 @@
# File used for checking Minecraft server compatibility with this version of HuskSync # File used for checking Minecraft server compatibility with this version of HuskSync
minecraft_version: '${minecraft_version}' minecraft_version_range: '${minecraft_version_range}'

View File

@@ -327,7 +327,7 @@ public class Settings {
private Map<String, String> eventPriorities = EventListener.ListenerType.getDefaults(); private Map<String, String> eventPriorities = EventListener.ListenerType.getDefaults();
@Comment("Enable check-in petitions for data syncing (don't change this unless you know what you're doing)") @Comment("Enable check-in petitions for data syncing (don't change this unless you know what you're doing)")
private boolean checkinPetitions = true; private boolean checkinPetitions = false;
public boolean doAutoPin(@NotNull DataSnapshot.SaveCause cause) { public boolean doAutoPin(@NotNull DataSnapshot.SaveCause cause) {
return autoPinnedSaveCauses.contains(cause.name()); return autoPinnedSaveCauses.contains(cause.name());

View File

@@ -22,12 +22,13 @@ package net.william278.husksync.util;
import de.exlll.configlib.Configuration; import de.exlll.configlib.Configuration;
import de.exlll.configlib.YamlConfigurationProperties; import de.exlll.configlib.YamlConfigurationProperties;
import de.exlll.configlib.YamlConfigurationStore; import de.exlll.configlib.YamlConfigurationStore;
import lombok.AllArgsConstructor;
import net.william278.desertwell.util.Version; import net.william278.desertwell.util.Version;
import net.william278.husksync.HuskSync; import net.william278.husksync.HuskSync;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.InputStream; import java.io.InputStream;
import java.util.Objects; import java.util.function.BiFunction;
import java.util.logging.Level; import java.util.logging.Level;
import static net.william278.husksync.config.ConfigProvider.YAML_CONFIGURATION_PROPERTIES; import static net.william278.husksync.config.ConfigProvider.YAML_CONFIGURATION_PROPERTIES;
@@ -38,23 +39,22 @@ public interface CompatibilityChecker {
default void checkCompatibility() throws HuskSync.FailedToLoadException { default void checkCompatibility() throws HuskSync.FailedToLoadException {
final YamlConfigurationProperties p = YAML_CONFIGURATION_PROPERTIES.build(); final YamlConfigurationProperties p = YAML_CONFIGURATION_PROPERTIES.build();
final Version compatible; final CompatibilityConfig compat;
// Load compatibility file // Load compatibility file
try (InputStream input = getResource(COMPATIBILITY_FILE)) { try (InputStream input = getResource(COMPATIBILITY_FILE)) {
final CompatibilityConfig compat = new YamlConfigurationStore<>(CompatibilityConfig.class, p).read(input); compat = new YamlConfigurationStore<>(CompatibilityConfig.class, p).read(input);
compatible = Objects.requireNonNull(compat.getCompatibleWith());
} catch (Throwable e) { } catch (Throwable e) {
getPlugin().log(Level.WARNING, "Failed to load compatibility config, skipping check.", e); getPlugin().log(Level.WARNING, "Failed to load compatibility config, skipping check.", e);
return; return;
} }
// Check compatibility // Check compatibility
if (compatible.compareTo(getPlugin().getMinecraftVersion()) != 0) { if (!compat.isCompatibleWith(getPlugin().getMinecraftVersion())) {
throw new HuskSync.FailedToLoadException(""" throw new HuskSync.FailedToLoadException("""
Incompatible Minecraft version. This version of HuskSync is designed for Minecraft %s. Incompatible Minecraft version. This version of HuskSync is designed for Minecraft %s.
Please download the correct version of HuskSync for your server's Minecraft version (%s).""" Please download the correct version of HuskSync for your server's Minecraft version (%s)."""
.formatted(compatible.toString(), getPlugin().getMinecraftVersion().toString())); .formatted(compat.minecraftVersionRange(), getPlugin().getMinecraftVersion().toString()));
} }
} }
@@ -64,11 +64,38 @@ public interface CompatibilityChecker {
HuskSync getPlugin(); HuskSync getPlugin();
@Configuration @Configuration
record CompatibilityConfig(@NotNull String minecraftVersion) { record CompatibilityConfig(@NotNull String minecraftVersionRange) {
@NotNull @AllArgsConstructor
public Version getCompatibleWith() { enum ExpressionType {
return Version.fromString(minecraftVersion); GTE(">=", (v, s) -> v.compareTo(Version.fromString(s.substring(2))) >= 0),
LTE("<=", (v, s) -> v.compareTo(Version.fromString(s.substring(2))) <= 0),
GT(">", (v, s) -> v.compareTo(Version.fromString(s.substring(1))) > 0),
LT("<", (v, s) -> v.compareTo(Version.fromString(s.substring(1))) < 0),
NOT("!", (v, s) -> v.compareTo(Version.fromString(s.substring(1))) != 0),
E("=", (v, s) -> v.compareTo(Version.fromString(s.substring(1))) == 0);
private final String match;
private final BiFunction<Version, String, Boolean> function;
private static boolean check(@NotNull String versionRange, @NotNull Version mcVer) {
boolean passes = true;
versions:
for (String exp : versionRange.split(" ")) {
for (ExpressionType type : values()) {
if (exp.trim().startsWith(type.match)) {
passes = passes && type.function.apply(mcVer, exp.trim());
continue versions;
}
}
passes = passes && mcVer.compareTo(Version.fromString(exp.trim())) == 0;
}
return passes;
}
}
public boolean isCompatibleWith(@NotNull Version version) {
return ExpressionType.check(minecraftVersionRange, version);
} }
} }

View File

@@ -0,0 +1,59 @@
/*
* This file is part of HuskSync, licensed under the Apache License 2.0.
*
* Copyright (c) William278 <will27528@gmail.com>
* Copyright (c) contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.william278.husksync.util;
import net.william278.desertwell.util.Version;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
@DisplayName("Compatibility Checker Tests")
public class CompatibilityCheckerTests {
@ParameterizedTest(name = "Ver: {0}, Range: {1}")
@DisplayName("Test Compatibility Checker")
@CsvSource({
"1.20.1, 1.21.1, false",
"1.21.1, 1.20.1, false",
"1.7.2, 1.21.5, false",
"1.19.4, 1.21.1, false",
"1.21.3, 1.21.3, true",
"1.20.1, 1.20.1, true",
"1.21.7, 1.21.7, true",
"1.21.8, >=1.21.7, true",
"1.21.8, >1.21.7, true",
"1.0, <1.21.7, true",
"1.17.1, !1.17.1, false",
"1.21.7, '>=1.21.7 <=1.21.8', true",
"1.21.8, '>=1.21.7 <=1.21.8', true",
"1.21.5, '>=1.21.7 <=1.21.8', false",
})
public void testCompatibilityChecker(@NotNull String mcVer, @NotNull String range, boolean exp) {
final Version version = Version.fromString(mcVer);
Assertions.assertNotNull(version, "Version should not be null");
final CompatibilityChecker.CompatibilityConfig config = new CompatibilityChecker.CompatibilityConfig(range);
Assertions.assertEquals(exp, config.isCompatibleWith(version), "Checker should return " + exp);
}
}

View File

@@ -2,7 +2,7 @@ HuskSync supports the following versions of Minecraft. Since v3.7, you must down
| Minecraft | Latest HuskSync | Java Version | Platforms | Support Status | | Minecraft | Latest HuskSync | Java Version | Platforms | Support Status |
|:---------------:|:---------------:|:------------:|:--------------|:------------------------------| |:---------------:|:---------------:|:------------:|:--------------|:------------------------------|
| 1.21.7 | _latest_ | 21 | Paper | ✅ **Active Release** | | 1.21.7/8 | _latest_ | 21 | Paper | ✅ **Active Release** |
| 1.21.6 | 3.8.5 | 21 | Paper | 🗃️ Archived (July 2025) | | 1.21.6 | 3.8.5 | 21 | Paper | 🗃️ Archived (July 2025) |
| 1.21.5 | _latest_ | 21 | Paper | ✅ **January 2026** (Non-LTS) | | 1.21.5 | _latest_ | 21 | Paper | ✅ **January 2026** (Non-LTS) |
| 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (Non-LTS) | | 1.21.4 | _latest_ | 21 | Paper, Fabric | ✅ **November 2025** (Non-LTS) |

View File

@@ -1,5 +1,7 @@
essential.defaults.loom.mappings=net.fabricmc:yarn:1.20.1+build.10:v2 essential.defaults.loom.mappings=net.fabricmc:yarn:1.20.1+build.10:v2
minecraft_version_range='1.20.1'
fabric_loader_version=0.15.11 fabric_loader_version=0.15.11
fabric_api_version=0.92.2+1.20.1 fabric_api_version=0.92.2+1.20.1
fabric_permissions_api_version=0.2-SNAPSHOT fabric_permissions_api_version=0.2-SNAPSHOT

View File

@@ -1,5 +1,7 @@
essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.1+build.3:v2 essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.1+build.3:v2
minecraft_version_range='1.21.1'
fabric_loader_version=0.16.10 fabric_loader_version=0.16.10
fabric_api_version=0.107.0+1.21.1 fabric_api_version=0.107.0+1.21.1
fabric_permissions_api_version=0.3.1 fabric_permissions_api_version=0.3.1

View File

@@ -1,5 +1,7 @@
essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.4+build.4:v2 essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.4+build.4:v2
minecraft_version_range='1.21.4'
fabric_loader_version=0.16.10 fabric_loader_version=0.16.10
fabric_api_version=0.116.1+1.21.4 fabric_api_version=0.116.1+1.21.4
fabric_permissions_api_version=0.3.3 fabric_permissions_api_version=0.3.3

View File

@@ -1,5 +1,7 @@
essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.5+build.1:v2 essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.5+build.1:v2
minecraft_version_range='1.21.5'
fabric_loader_version=0.16.14 fabric_loader_version=0.16.14
fabric_api_version=0.122.0+1.21.5 fabric_api_version=0.122.0+1.21.5
fabric_permissions_api_version=0.3.3 fabric_permissions_api_version=0.3.3

View File

@@ -1,5 +1,7 @@
essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.7+build.2:v2 essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.7+build.2:v2
minecraft_version_range='>=1.21.7 <=1.21.8'
fabric_loader_version=0.16.14 fabric_loader_version=0.16.14
fabric_api_version=0.128.1+1.21.7 fabric_api_version=0.128.1+1.21.7
fabric_permissions_api_version=0.4.1 fabric_permissions_api_version=0.4.1

View File

@@ -49,7 +49,8 @@ processResources {
expand([ expand([
version: version, version: version,
fabric_loader_version: fabric_loader_version, fabric_loader_version: fabric_loader_version,
fabric_minecraft_version: project.name fabric_minecraft_version: project.name,
minecraft_version_range: minecraft_version_range
]) ])
} }
} }

View File

@@ -40,7 +40,7 @@
}, },
"depends": { "depends": {
"fabricloader": ">=${fabric_loader_version}", "fabricloader": ">=${fabric_loader_version}",
"minecraft": "${fabric_minecraft_version}", "minecraft": "${minecraft_version_range}",
"fabric-api": "*" "fabric-api": "*"
}, },
"suggests": { "suggests": {

View File

@@ -4,7 +4,7 @@ org.gradle.daemon=true
javaVersion=21 javaVersion=21
# Plugin metadata # Plugin metadata
plugin_version=3.8.6 plugin_version=3.8.7
plugin_archive=husksync plugin_archive=husksync
plugin_description=A modern, cross-server player data synchronization system plugin_description=A modern, cross-server player data synchronization system