From 69caaccb0702ce21cc3eb2ec55e1af6ac238b562 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Fri, 16 Jul 2021 23:22:03 +0100 Subject: [PATCH] Fallback to fabric's experimental version manifest for versions that are not in the launchermeta. --- .../providers/MinecraftProviderImpl.java | 31 +++++++++- .../net/fabricmc/loom/util/Constants.java | 1 + .../ExperimentalVersionsTest.groovy | 61 +++++++++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/test/groovy/net/fabricmc/loom/test/integration/ExperimentalVersionsTest.groovy diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java index fe7e716..c4326a9 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java @@ -58,6 +58,7 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra private File minecraftServerJar; private File minecraftMergedJar; private File versionManifestJson; + private File experimentalVersionsJson; public MinecraftProviderImpl(Project project) { super(project); @@ -116,6 +117,7 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra minecraftServerJar = new File(getDirectories().getUserCache(), "minecraft-" + minecraftVersion + "-server.jar"); minecraftMergedJar = new File(getDirectories().getUserCache(), "minecraft-" + minecraftVersion + "-merged.jar"); versionManifestJson = new File(getDirectories().getUserCache(), "version_manifest.json"); + experimentalVersionsJson = new File(getDirectories().getUserCache(), "experimental_version_manifest.json"); } private void downloadMcJson(boolean offline) throws IOException { @@ -151,8 +153,12 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra getProject().getLogger().lifecycle("Using custom minecraft manifest"); } - if (!optionalVersion.isPresent()) { + if (optionalVersion.isEmpty()) { optionalVersion = mcManifest.versions().stream().filter(versions -> versions.id.equalsIgnoreCase(minecraftVersion)).findFirst(); + + if (optionalVersion.isEmpty()) { + optionalVersion = findExperimentalVersion(offline); + } } if (optionalVersion.isPresent()) { @@ -182,6 +188,29 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra } } + // This attempts to find the version from fabric's own fallback version manifest json. + private Optional findExperimentalVersion(boolean offline) throws IOException { + if (offline) { + if (!experimentalVersionsJson.exists()) { + getProject().getLogger().warn("Skipping download of experimental versions jsons due to being offline."); + return Optional.empty(); + } + } else { + DownloadUtil.downloadIfChanged(new URL(Constants.EXPERIMENTAL_VERSIONS), experimentalVersionsJson, getProject().getLogger()); + } + + String expVersionManifest = Files.asCharSource(experimentalVersionsJson, StandardCharsets.UTF_8).read(); + ManifestVersion expManifest = LoomGradlePlugin.OBJECT_MAPPER.readValue(expVersionManifest, ManifestVersion.class); + + var result = expManifest.versions().stream().filter(versions -> versions.id.equalsIgnoreCase(minecraftVersion)).findFirst(); + + if (result.isPresent()) { + getProject().getLogger().lifecycle("Using fallback experimental version {}", minecraftVersion); + } + + return result; + } + private boolean hasRecentValidManifest() throws IOException { if (getExtension().getCustomManifest() != null) { return false; diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index ddd229a..a2fed6b 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -36,6 +36,7 @@ public class Constants { public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/"; public static final String RESOURCES_BASE = "https://resources.download.minecraft.net/"; public static final String VERSION_MANIFESTS = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json"; + public static final String EXPERIMENTAL_VERSIONS = "https://maven.fabricmc.net/net/minecraft/experimental_versions.json"; public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32"; diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/ExperimentalVersionsTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/ExperimentalVersionsTest.groovy new file mode 100644 index 0000000..553cbd7 --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/test/integration/ExperimentalVersionsTest.groovy @@ -0,0 +1,61 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2021 FabricMC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.test.integration + +import net.fabricmc.loom.test.util.ProjectTestTrait +import spock.lang.Specification +import spock.lang.Unroll + +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +class ExperimentalVersionsTest extends Specification implements ProjectTestTrait { + @Override + String name() { + "minimalBase" + } + + @Override + def filesReady() { + buildGradle() << ''' + dependencies { + minecraft "com.mojang:minecraft:1.18_experimental-snapshot-1" + mappings "net.fabricmc:yarn:1.18_experimental-snapshot-1+build.2:v2" + modImplementation "net.fabricmc:fabric-loader:0.11.6" + } + ''' + } + + @Unroll + def "experimental versions (gradle #gradle)"() { + when: + def result = create("build", gradle) + then: + result.task(":build").outcome == SUCCESS + where: + gradle | _ + DEFAULT_GRADLE | _ + PRE_RELEASE_GRADLE | _ + } +}