From 0a668632724753c923afde12df9e46552bc23f83 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sun, 26 Oct 2025 20:21:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=20TerracottaMetadata=20(#471?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/terracotta/TerracottaMetadata.java | 66 +++++++++---------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java index d2a8a7e9f..c448fa364 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java @@ -44,7 +44,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.regex.Pattern; import static org.jackhuang.hmcl.util.logging.Logger.LOG; @@ -66,7 +65,15 @@ public final class TerracottaMetadata { @SerializedName("downloads_CN") List downloadsCN, @SerializedName("links") List links ) { - private TerracottaNative of(String classifier) { + private @Nullable TerracottaNative of(String classifier) { + String hash = this.classifiers.get(classifier); + if (hash == null) + return null; + + if (!hash.startsWith("sha256:")) + throw new IllegalArgumentException(String.format("Invalid hash value %s for classifier %s.", hash, classifier)); + hash = hash.substring("sha256:".length()); + List links = new ArrayList<>(this.downloads.size() + this.downloadsCN.size()); for (String download : LocaleUtils.IS_CHINA_MAINLAND ? Lang.merge(this.downloadsCN, this.downloads) @@ -74,12 +81,6 @@ public final class TerracottaMetadata { links.add(URI.create(download.replace("${version}", this.latest).replace("${classifier}", classifier))); } - String hash = Objects.requireNonNull(this.classifiers.get(classifier), String.format("Classifier %s doesn't exist.", classifier)); - if (!hash.startsWith("sha256:")) { - throw new IllegalArgumentException(String.format("Invalid hash value %s for classifier %s.", hash, classifier)); - } - hash = hash.substring("sha256:".length()); - return new TerracottaNative( Collections.unmodifiableList(links), Metadata.DEPENDENCIES_DIRECTORY.resolve( @@ -143,36 +144,31 @@ public final class TerracottaMetadata { @Nullable private static ProviderContext locateProvider(Config config) { - String architecture = switch (Architecture.SYSTEM_ARCH) { - case X86_64 -> "x86_64"; - case ARM64 -> "arm64"; - default -> null; - }; - if (architecture == null) { - return null; - } - + String arch = Architecture.SYSTEM_ARCH.getCheckedName(); return switch (OperatingSystem.CURRENT_OS) { case WINDOWS -> { - if (OperatingSystem.SYSTEM_VERSION.isAtLeast(OSVersion.WINDOWS_8_1)) { - yield new ProviderContext( - new GeneralProvider(config.of(String.format("windows-%s.exe", architecture))), - "windows", architecture - ); - } - yield null; + if (!OperatingSystem.SYSTEM_VERSION.isAtLeast(OSVersion.WINDOWS_8_1)) + yield null; + + TerracottaNative target = config.of("windows-%s.exe".formatted(arch)); + yield target != null + ? new ProviderContext(new GeneralProvider(target), "windows", arch) + : null; + } + case LINUX -> { + TerracottaNative target = config.of("linux-%s".formatted(arch)); + yield target != null + ? new ProviderContext(new GeneralProvider(target), "linux", arch) + : null; + } + case MACOS -> { + TerracottaNative installer = config.of("macos-%s.pkg".formatted(arch)); + TerracottaNative binary = config.of("macos-%s".formatted(arch)); + + yield installer != null && binary != null + ? new ProviderContext(new MacOSProvider(installer, binary), "macos", arch) + : null; } - case LINUX -> new ProviderContext( - new GeneralProvider(config.of(String.format("linux-%s", architecture))), - "linux", architecture - ); - case MACOS -> new ProviderContext( - new MacOSProvider( - config.of(String.format("macos-%s.pkg", architecture)), - config.of(String.format("macos-%s", architecture)) - ), - "macos", architecture - ); default -> null; }; }