From ec0026113618583ee2c58858d76f56fb71e0f5c1 Mon Sep 17 00:00:00 2001 From: modmuss Date: Fri, 7 Nov 2025 21:54:51 +0000 Subject: [PATCH] Find and apply installer data (#1428) --- .../configuration/DebofInstallerData.java | 82 +++++++++++++++++++ .../loom/configuration/InstallerData.java | 8 ++ .../configuration/LoomConfigurations.java | 5 ++ .../configuration/LoomDependencyManager.java | 2 +- .../configuration/mods/ArtifactMetadata.java | 10 +-- .../speccontext/DeobfSpecContext.java | 2 - .../noRemap/SimpleDebofTest.groovy | 3 + 7 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/configuration/DebofInstallerData.java diff --git a/src/main/java/net/fabricmc/loom/configuration/DebofInstallerData.java b/src/main/java/net/fabricmc/loom/configuration/DebofInstallerData.java new file mode 100644 index 00000000..84ee0f31 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/configuration/DebofInstallerData.java @@ -0,0 +1,82 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2025 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.configuration; + +import java.io.File; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.Objects; +import java.util.Optional; + +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.fabricmc.loom.configuration.processors.speccontext.DebofConfiguration; +import net.fabricmc.loom.util.ZipUtils; +import net.fabricmc.loom.util.fmj.FabricModJson; +import net.fabricmc.loom.util.fmj.FabricModJsonFactory; + +public class DebofInstallerData { + private static final Logger LOGGER = LoggerFactory.getLogger(DebofInstallerData.class); + + public static void findAndApply(Project project) { + for (DebofConfiguration debofConfiguration : DebofConfiguration.ALL) { + for (Configuration configuration : debofConfiguration.getConfigurations(project)) { + Optional installerData = configuration.getFiles().parallelStream() + .map(DebofInstallerData::getInstaller) + .filter(Objects::nonNull) + .findFirst(); + + if (installerData.isPresent()) { + LOGGER.info("Applying installer data from configuration '{}'", configuration.getName()); + installerData.get().applyToProject(project); + return; + } + } + } + + LOGGER.info("No installer data found in any configuration."); + } + + @Nullable + private static InstallerData getInstaller(File file) { + try { + byte[] installerData = ZipUtils.unpackNullable(file.toPath(), InstallerData.INSTALLER_PATH); + + if (installerData == null) { + return null; + } + + FabricModJson fabricModJson = FabricModJsonFactory.createFromZip(file.toPath()); + LOGGER.info("Found installer in mod {} version {}", fabricModJson.getId(), fabricModJson.getModVersion()); + return InstallerData.fromBytes(installerData, fabricModJson.getModVersion()); + } catch (IOException e) { + throw new UncheckedIOException("Failed to read " + file, e); + } + } +} diff --git a/src/main/java/net/fabricmc/loom/configuration/InstallerData.java b/src/main/java/net/fabricmc/loom/configuration/InstallerData.java index ce8da78d..639e7b30 100644 --- a/src/main/java/net/fabricmc/loom/configuration/InstallerData.java +++ b/src/main/java/net/fabricmc/loom/configuration/InstallerData.java @@ -24,6 +24,8 @@ package net.fabricmc.loom.configuration; +import java.nio.charset.StandardCharsets; + import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -36,13 +38,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.LoomRepositoryPlugin; import net.fabricmc.loom.configuration.ide.idea.IdeaUtils; import net.fabricmc.loom.util.Constants; public record InstallerData(String version, JsonObject installerJson) { + public static final String INSTALLER_PATH = "fabric-installer.json"; private static final Logger LOGGER = LoggerFactory.getLogger(InstallerData.class); + public static InstallerData fromBytes(byte[] bytes, String version) { + return new InstallerData(version, LoomGradlePlugin.GSON.fromJson(new String(bytes, StandardCharsets.UTF_8), JsonObject.class)); + } + public void applyToProject(Project project) { LoomGradleExtension extension = LoomGradleExtension.get(project); diff --git a/src/main/java/net/fabricmc/loom/configuration/LoomConfigurations.java b/src/main/java/net/fabricmc/loom/configuration/LoomConfigurations.java index fad2cb1a..c3c098ab 100644 --- a/src/main/java/net/fabricmc/loom/configuration/LoomConfigurations.java +++ b/src/main/java/net/fabricmc/loom/configuration/LoomConfigurations.java @@ -45,6 +45,7 @@ import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.provider.Provider; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.configuration.processors.speccontext.DebofConfiguration; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.LoomVersions; import net.fabricmc.loom.util.gradle.SourceSetHelper; @@ -161,6 +162,10 @@ public abstract class LoomConfigurations implements Runnable { extendsFrom(Constants.Configurations.MINECRAFT_TEST_CLIENT_RUNTIME_LIBRARIES, Constants.Configurations.LOADER_DEPENDENCIES); register(Constants.Configurations.PRODUCTION_RUNTIME_MODS, Role.RESOLVABLE); + + if (extension.disableObfuscation()) { + DebofConfiguration.create(getProject()); + } } private NamedDomainObjectProvider register(String name, Role role) { diff --git a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java index 17610851..2237933d 100644 --- a/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java @@ -56,6 +56,6 @@ public record LoomDependencyManager(Project project, ServiceFactory serviceFacto } private void handleNonRemapDependencies() { - // TODO debof - do we need to do anything? + DebofInstallerData.findAndApply(project); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/ArtifactMetadata.java b/src/main/java/net/fabricmc/loom/configuration/mods/ArtifactMetadata.java index 4ee3c72d..de6e81fd 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ArtifactMetadata.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ArtifactMetadata.java @@ -26,7 +26,6 @@ package net.fabricmc.loom.configuration.mods; import java.io.ByteArrayInputStream; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -37,18 +36,14 @@ import java.util.function.Predicate; import java.util.jar.Attributes; import java.util.jar.Manifest; -import com.google.gson.JsonObject; import org.jetbrains.annotations.Nullable; -import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.configuration.InstallerData; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.loom.util.fmj.FabricModJsonFactory; public record ArtifactMetadata(boolean isFabricMod, RemapRequirements remapRequirements, @Nullable InstallerData installerData, MixinRemapType mixinRemapType, List knownIdyBsms) { - private static final String INSTALLER_PATH = "fabric-installer.json"; - public static ArtifactMetadata create(ArtifactRef artifact, String currentLoomVersion) throws IOException { boolean isFabricMod; RemapRequirements remapRequirements = RemapRequirements.DEFAULT; @@ -90,11 +85,10 @@ public record ArtifactMetadata(boolean isFabricMod, RemapRequirements remapRequi } } - final Path installerPath = fs.getPath(INSTALLER_PATH); + final Path installerPath = fs.getPath(InstallerData.INSTALLER_PATH); if (isFabricMod && Files.exists(installerPath)) { - final JsonObject jsonObject = LoomGradlePlugin.GSON.fromJson(Files.readString(installerPath, StandardCharsets.UTF_8), JsonObject.class); - installerData = new InstallerData(artifact.version(), jsonObject); + installerData = InstallerData.fromBytes(Files.readAllBytes(installerPath), artifact.version()); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/DeobfSpecContext.java b/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/DeobfSpecContext.java index 78b9b307..2982046f 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/DeobfSpecContext.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/speccontext/DeobfSpecContext.java @@ -53,8 +53,6 @@ public record DeobfSpecContext(List modDependencies, List modDependenciesCompileRuntimeClient ) implements SpecContext { public static DeobfSpecContext create(Project project) { - DebofConfiguration.create(project); - return create(new DeobfProjectView.Impl(project)); } diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/noRemap/SimpleDebofTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/noRemap/SimpleDebofTest.groovy index 0f7fb59c..0574e411 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/noRemap/SimpleDebofTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/noRemap/SimpleDebofTest.groovy @@ -41,6 +41,7 @@ class SimpleDebofTest extends Specification implements GradleProjectTestTrait { gradle.buildGradle << ''' dependencies { minecraft 'com.mojang:minecraft:25w45a_unobfuscated' + implementation "net.fabricmc:fabric-loader:0.17.3" } ''' def sourceFile = new File(gradle.projectDir, "src/main/java/example/Test.java") @@ -50,6 +51,8 @@ class SimpleDebofTest extends Specification implements GradleProjectTestTrait { import net.minecraft.resources.Identifier; + import org.spongepowered.asm.mixin.Mixin; // Make sure we applied loaders deps via the installer data + public class Test { public static void main(String[] args) { Identifier id = Identifier.fromNamespaceAndPath("loom", "test");