diff options
| author | Juuxel <6596629+Juuxel@users.noreply.github.com> | 2020-12-03 17:48:28 +0200 |
|---|---|---|
| committer | Juuxel <6596629+Juuxel@users.noreply.github.com> | 2020-12-03 17:48:28 +0200 |
| commit | 2d88e849ec702cde4ffe80d45712935f40434a66 (patch) | |
| tree | 92e6582d42ffe966e8368443a7f33cb52001cf2b /src/main | |
| parent | 2a10b7054649ff3c7fa3d360b37579684672d7e7 (diff) | |
| download | architectury-loom-2d88e849ec702cde4ffe80d45712935f40434a66.tar.gz architectury-loom-2d88e849ec702cde4ffe80d45712935f40434a66.tar.bz2 architectury-loom-2d88e849ec702cde4ffe80d45712935f40434a66.zip | |
Add support for project ATs
Diffstat (limited to 'src/main')
4 files changed, 102 insertions, 24 deletions
diff --git a/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java b/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java index 3b1b4e4b..d9cb7ab4 100644 --- a/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MappingsProvider.java @@ -178,7 +178,7 @@ public class MappingsProvider extends DependencyProvider { patchedProvider.provide(dependency, postPopulationScheduler); } - if (processorManager.active()) { + if (processorManager.active() || (extension.isForge() && patchedProvider.usesProjectCache())) { mappedProvider = new MinecraftProcessedProvider(getProject(), processorManager); getProject().getLogger().lifecycle("Using project based jar storage"); } else { diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java index aa590205..0fd3380e 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java @@ -81,7 +81,9 @@ public class MinecraftMappedProvider extends DependencyProvider { throw new RuntimeException("input merged jar not found"); } - if (!minecraftMappedJar.exists() || !getIntermediaryJar().exists() || isRefreshDeps()) { + boolean isForgeAtDirty = getExtension().isForge() && getExtension().getMappingsProvider().patchedProvider.isAtDirty(); + + if (!minecraftMappedJar.exists() || !getIntermediaryJar().exists() || isRefreshDeps() || isForgeAtDirty) { if (minecraftMappedJar.exists()) { minecraftMappedJar.delete(); } diff --git a/src/main/java/net/fabricmc/loom/providers/MinecraftPatchedProvider.java b/src/main/java/net/fabricmc/loom/providers/MinecraftPatchedProvider.java index 583c662e..4d41c861 100644 --- a/src/main/java/net/fabricmc/loom/providers/MinecraftPatchedProvider.java +++ b/src/main/java/net/fabricmc/loom/providers/MinecraftPatchedProvider.java @@ -25,6 +25,7 @@ package net.fabricmc.loom.providers; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; @@ -34,6 +35,7 @@ import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; import java.util.function.Function; @@ -46,9 +48,14 @@ import net.minecraftforge.binarypatcher.ConsoleTool; import net.minecraftforge.gradle.mcp.util.MCPRuntime; import net.minecraftforge.gradle.mcp.util.MCPWrapper; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.ArrayUtils; import org.gradle.api.Project; import org.gradle.api.logging.Logger; +import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.SourceSet; +import org.jetbrains.annotations.Nullable; +import net.fabricmc.loom.util.Checksum; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DependencyProvider; import net.fabricmc.loom.util.JarUtil; @@ -65,6 +72,10 @@ public class MinecraftPatchedProvider extends DependencyProvider { private File minecraftClientPatchedJar; private File minecraftServerPatchedJar; private File minecraftMergedPatchedJar; + private File modAtHash; + @Nullable + private File modAt = null; + private boolean atDirty = false; public MinecraftPatchedProvider(Project project) { super(project); @@ -74,12 +85,12 @@ public class MinecraftPatchedProvider extends DependencyProvider { public void provide(DependencyInfo dependency, Consumer<Runnable> postPopulationScheduler) throws Exception { initFiles(); - if (!minecraftClientPatchedJar.exists() || !minecraftServerPatchedJar.exists()) { + if (atDirty || !minecraftClientPatchedJar.exists() || !minecraftServerPatchedJar.exists()) { if (!minecraftClientSrgJar.exists() || !minecraftServerSrgJar.exists()) { createSrgJars(getProject().getLogger()); } - if (!minecraftClientPatchedSrgJar.exists() || !minecraftServerPatchedSrgJar.exists()) { + if (atDirty || !minecraftClientPatchedSrgJar.exists() || !minecraftServerPatchedSrgJar.exists()) { patchJars(getProject().getLogger()); injectForgeClasses(getProject().getLogger()); } @@ -87,25 +98,63 @@ public class MinecraftPatchedProvider extends DependencyProvider { remapPatchedJars(getProject().getLogger()); } - if (!minecraftMergedPatchedJar.exists()) { + if (atDirty || !minecraftMergedPatchedJar.exists()) { mergeJars(getProject().getLogger()); } } - private void initFiles() { + private void initFiles() throws IOException { + modAtHash = new File(getExtension().getProjectPersistentCache(), "at.sha256"); + + SourceSet main = getProject().getConvention().findPlugin(JavaPluginConvention.class).getSourceSets().getByName("main"); + + for (File srcDir : main.getResources().getSrcDirs()) { + File modAt = new File(srcDir, "META-INF/accesstransformer.cfg"); + + if (modAt.exists()) { + this.modAt = modAt; + break; + } + } + + if (!modAtHash.exists()) { + writeAtHash(); + atDirty = modAt != null; + } else { + byte[] expected = Files.asByteSource(modAtHash).read(); + byte[] current = modAt != null ? Checksum.sha256(modAt) : Checksum.sha256(""); + atDirty = !Arrays.equals(current, expected); + + if (atDirty) { + writeAtHash(); + } + } + MinecraftProvider minecraftProvider = getExtension().getMinecraftProvider(); PatchProvider patchProvider = getExtension().getPatchProvider(); String minecraftVersion = minecraftProvider.getMinecraftVersion(); String jarSuffix = "-patched-forge-" + patchProvider.forgeVersion; minecraftProvider.setJarSuffix(jarSuffix); - minecraftClientPatchedJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-client" + jarSuffix + ".jar"); - minecraftServerPatchedJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-server" + jarSuffix + ".jar"); - minecraftClientSrgJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-client-srg.jar"); - minecraftServerSrgJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-server-srg.jar"); - minecraftClientPatchedSrgJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-client-srg" + jarSuffix + ".jar"); - minecraftServerPatchedSrgJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-server-srg" + jarSuffix + ".jar"); - minecraftMergedPatchedJar = new File(getExtension().getUserCache(), "minecraft-" + minecraftVersion + "-merged" + jarSuffix + ".jar"); + File cache = usesProjectCache() ? getExtension().getProjectPersistentCache() : getExtension().getUserCache(); + + minecraftClientPatchedJar = new File(cache, "minecraft-" + minecraftVersion + "-client" + jarSuffix + ".jar"); + minecraftServerPatchedJar = new File(cache, "minecraft-" + minecraftVersion + "-server" + jarSuffix + ".jar"); + minecraftClientSrgJar = new File(cache, "minecraft-" + minecraftVersion + "-client-srg.jar"); + minecraftServerSrgJar = new File(cache, "minecraft-" + minecraftVersion + "-server-srg.jar"); + minecraftClientPatchedSrgJar = new File(cache, "minecraft-" + minecraftVersion + "-client-srg" + jarSuffix + ".jar"); + minecraftServerPatchedSrgJar = new File(cache, "minecraft-" + minecraftVersion + "-server-srg" + jarSuffix + ".jar"); + minecraftMergedPatchedJar = new File(cache, "minecraft-" + minecraftVersion + "-merged" + jarSuffix + ".jar"); + } + + private void writeAtHash() throws IOException { + try (FileOutputStream out = new FileOutputStream(modAtHash)) { + if (modAt != null) { + out.write(Checksum.sha256(modAt)); + } else { + out.write(Checksum.sha256("")); + } + } } private void createSrgJars(Logger logger) throws Exception { @@ -150,17 +199,30 @@ public class MinecraftPatchedProvider extends DependencyProvider { walkFileSystems(injection, minecraftClientPatchedSrgJar, it -> !it.getFileName().toString().equals("MANIFEST.MF"), this::copyReplacing); walkFileSystems(injection, minecraftServerPatchedSrgJar, it -> !it.getFileName().toString().equals("MANIFEST.MF"), this::copyReplacing); - logger.lifecycle(":access transforming"); - File clientAtJar = File.createTempFile("atclient", ".jar"); - File serverAtJar = File.createTempFile("atserver", ".jar"); - File clientAt = File.createTempFile("atclient", ".cfg"); - File serverAt = File.createTempFile("atserver", ".cfg"); - Files.copy(minecraftClientPatchedSrgJar, clientAtJar); - Files.copy(minecraftServerPatchedSrgJar, serverAtJar); - JarUtil.extractFile(clientAtJar, "META-INF/accesstransformer.cfg", clientAt); - JarUtil.extractFile(serverAtJar, "META-INF/accesstransformer.cfg", serverAt); - TransformerProcessor.main("--inJar", clientAtJar.getAbsolutePath(), "--outJar", minecraftClientPatchedSrgJar.getAbsolutePath(), "--atFile", clientAt.getAbsolutePath()); - TransformerProcessor.main("--inJar", serverAtJar.getAbsolutePath(), "--outJar", minecraftServerPatchedSrgJar.getAbsolutePath(), "--atFile", serverAt.getAbsolutePath()); + logger.lifecycle(":access transforming minecraft"); + + boolean[] bools = { true, false }; + + for (boolean isClient : bools) { + String side = isClient ? "client" : "server"; + File target = isClient ? minecraftClientPatchedSrgJar : minecraftServerPatchedSrgJar; + + File atJar = File.createTempFile("at" + side, ".jar"); + File at = File.createTempFile("at" + side, ".cfg"); + Files.copy(target, atJar); + JarUtil.extractFile(atJar, "META-INF/accesstransformer.cfg", at); + String[] args = new String[] { + "--inJar", atJar.getAbsolutePath(), + "--outJar", target.getAbsolutePath(), + "--atFile", at.getAbsolutePath() + }; + + if (modAt != null) { + args = ArrayUtils.addAll(args, "--atFile", modAt.getAbsolutePath()); + } + + TransformerProcessor.main(args); + } } private void remapPatchedJars(Logger logger) throws IOException { @@ -305,6 +367,14 @@ public class MinecraftPatchedProvider extends DependencyProvider { return minecraftMergedPatchedJar; } + public boolean usesProjectCache() { + return modAt != null; + } + + public boolean isAtDirty() { + return atDirty; + } + @Override public String getTargetConfig() { return Constants.Configurations.MINECRAFT; diff --git a/src/main/java/net/fabricmc/loom/util/Checksum.java b/src/main/java/net/fabricmc/loom/util/Checksum.java index c83623e2..2f0216c9 100644 --- a/src/main/java/net/fabricmc/loom/util/Checksum.java +++ b/src/main/java/net/fabricmc/loom/util/Checksum.java @@ -26,6 +26,7 @@ package net.fabricmc.loom.util; import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import com.google.common.hash.HashCode; import com.google.common.hash.Hashing; @@ -67,4 +68,9 @@ public class Checksum { throw new RuntimeException("Failed to get file hash"); } } + + public static byte[] sha256(String string) { + HashCode hash = Hashing.sha256().hashString(string, StandardCharsets.UTF_8); + return hash.asBytes(); + } } |
