aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorJuuxel <6596629+Juuxel@users.noreply.github.com>2020-12-03 17:48:28 +0200
committerJuuxel <6596629+Juuxel@users.noreply.github.com>2020-12-03 17:48:28 +0200
commit2d88e849ec702cde4ffe80d45712935f40434a66 (patch)
tree92e6582d42ffe966e8368443a7f33cb52001cf2b /src/main
parent2a10b7054649ff3c7fa3d360b37579684672d7e7 (diff)
downloadarchitectury-loom-2d88e849ec702cde4ffe80d45712935f40434a66.tar.gz
architectury-loom-2d88e849ec702cde4ffe80d45712935f40434a66.tar.bz2
architectury-loom-2d88e849ec702cde4ffe80d45712935f40434a66.zip
Add support for project ATs
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/net/fabricmc/loom/providers/MappingsProvider.java2
-rw-r--r--src/main/java/net/fabricmc/loom/providers/MinecraftMappedProvider.java4
-rw-r--r--src/main/java/net/fabricmc/loom/providers/MinecraftPatchedProvider.java114
-rw-r--r--src/main/java/net/fabricmc/loom/util/Checksum.java6
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();
+ }
}