From af3f287fc4e623e2517f2b072aac2b732ad7fa3a Mon Sep 17 00:00:00 2001 From: Juuz <6596629+Juuxel@users.noreply.github.com> Date: Sun, 30 May 2021 21:06:01 +0300 Subject: [PATCH] Migrate ATs to JavaExec and make them quiet --- build.gradle | 1 - .../forge/MinecraftPatchedProvider.java | 52 ++++++++++--------- .../net/fabricmc/loom/util/Constants.java | 2 + .../loom/util/DependencyDownloader.java | 24 +++++++++ 4 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/util/DependencyDownloader.java diff --git a/build.gradle b/build.gradle index 9f0edc7f..9c1c7f36 100644 --- a/build.gradle +++ b/build.gradle @@ -106,7 +106,6 @@ dependencies { implementation ('net.minecraftforge:binarypatcher:1.1.1') implementation ('org.cadixdev:lorenz:0.5.3') implementation ('org.cadixdev:lorenz-asm:0.5.3') - implementation ('net.minecraftforge:accesstransformers:2.2.0') implementation ('de.oceanlabs.mcp:mcinjector:3.8.0') implementation ('com.opencsv:opencsv:5.4') diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java index 5440854f..29f72a70 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java @@ -32,7 +32,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.UncheckedIOException; -import java.lang.reflect.Field; import java.net.URI; import java.net.URL; import java.nio.charset.StandardCharsets; @@ -41,10 +40,11 @@ import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -57,14 +57,12 @@ import com.google.gson.JsonParser; import de.oceanlabs.mcp.mcinjector.adaptors.ParameterAnnotationFixer; import dev.architectury.tinyremapper.OutputConsumerPath; import dev.architectury.tinyremapper.TinyRemapper; -import net.minecraftforge.accesstransformer.AccessTransformerEngine; -import net.minecraftforge.accesstransformer.TransformerProcessor; -import net.minecraftforge.accesstransformer.parser.AccessTransformerList; import net.minecraftforge.binarypatcher.ConsoleTool; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.NullOutputStream; import org.gradle.api.Project; +import org.gradle.api.logging.LogLevel; import org.gradle.api.logging.Logger; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; @@ -80,6 +78,7 @@ import net.fabricmc.loom.configuration.providers.MinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; import net.fabricmc.loom.util.Checksum; import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.DependencyDownloader; import net.fabricmc.loom.util.DownloadUtil; import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.loom.util.JarUtil; @@ -360,6 +359,9 @@ public class MinecraftPatchedProvider extends DependencyProvider { } private void accessTransformForge(Logger logger) throws Exception { + var atDependency = Constants.Dependencies.ACCESS_TRANSFORMERS + Constants.Dependencies.Versions.ACCESS_TRANSFORMERS; + var classpath = DependencyDownloader.download(getProject(), atDependency); + for (Environment environment : Environment.values()) { String side = environment.side(); logger.lifecycle(":access transforming minecraft (" + side + ")"); @@ -371,34 +373,34 @@ public class MinecraftPatchedProvider extends DependencyProvider { target.delete(); File at = File.createTempFile("at" + side, ".cfg"); JarUtil.extractFile(inputCopied, "META-INF/accesstransformer.cfg", at); - String[] args = new String[] { - "--inJar", inputCopied.getAbsolutePath(), - "--outJar", target.getAbsolutePath(), - "--atFile", at.getAbsolutePath() - }; + + List args = new ArrayList<>(); + args.add("--inJar"); + args.add(inputCopied.getAbsolutePath()); + args.add("--outJar"); + args.add(target.getAbsolutePath()); + args.add("--atFile"); + args.add(at.getAbsolutePath()); if (usesProjectCache()) { - args = Arrays.copyOf(args, args.length + 2); - args[args.length - 2] = "--atFile"; - args[args.length - 1] = projectAt.getAbsolutePath(); + args.add("--atFile"); + args.add(projectAt.getAbsolutePath()); } - resetAccessTransformerEngine(); - TransformerProcessor.main(args); + getProject().javaexec(spec -> { + spec.setMain("net.minecraftforge.accesstransformer.TransformerProcessor"); + spec.setArgs(args); + spec.setClasspath(classpath); + + // if running with INFO or DEBUG logging + if (getProject().getGradle().getStartParameter().getLogLevel().compareTo(LogLevel.LIFECYCLE) < 0) { + spec.setStandardOutput(System.out); + } + }).rethrowFailure().assertNormalExitValue(); inputCopied.delete(); } } - private void resetAccessTransformerEngine() throws Exception { - // Thank you Forge, I love you - Field field = AccessTransformerEngine.class.getDeclaredField("masterList"); - field.setAccessible(true); - AccessTransformerList list = (AccessTransformerList) field.get(AccessTransformerEngine.INSTANCE); - field = AccessTransformerList.class.getDeclaredField("accessTransformers"); - field.setAccessible(true); - ((Map) field.get(list)).clear(); - } - public enum Environment { CLIENT(provider -> provider.minecraftClientSrgJar, provider -> provider.minecraftClientPatchedSrgJar, diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index f4d12355..249d8682 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -91,6 +91,7 @@ public class Constants { public static final String TERMINAL_CONSOLE_APPENDER = "net.minecrell:terminalconsoleappender:"; public static final String JETBRAINS_ANNOTATIONS = "org.jetbrains:annotations:"; public static final String JAVAX_ANNOTATIONS = "com.google.code.findbugs:jsr305:"; // I hate that I have to add these. + public static final String ACCESS_TRANSFORMERS = "net.minecraftforge:accesstransformers:"; private Dependencies() { } @@ -104,6 +105,7 @@ public class Constants { public static final String TERMINAL_CONSOLE_APPENDER = "1.2.0"; public static final String JETBRAINS_ANNOTATIONS = "19.0.0"; public static final String JAVAX_ANNOTATIONS = "3.0.2"; + public static final String ACCESS_TRANSFORMERS = "2.2.0"; private Versions() { } diff --git a/src/main/java/net/fabricmc/loom/util/DependencyDownloader.java b/src/main/java/net/fabricmc/loom/util/DependencyDownloader.java new file mode 100644 index 00000000..7915073d --- /dev/null +++ b/src/main/java/net/fabricmc/loom/util/DependencyDownloader.java @@ -0,0 +1,24 @@ +package net.fabricmc.loom.util; + +import org.gradle.api.Project; +import org.gradle.api.file.FileCollection; + +/** + * Simplified dependency downloading. + * + * @author Juuz + */ +public final class DependencyDownloader { + /** + * Resolves a dependency as well as its transitive dependencies into a {@link FileCollection}. + * + * @param project the project needing these files + * @param dependencyNotation the dependency notation + * @return the resolved files + */ + public static FileCollection download(Project project, String dependencyNotation) { + var dependency = project.getDependencies().create(dependencyNotation); + var config = project.getConfigurations().detachedConfiguration(dependency); + return config.fileCollection(dep -> true); + } +}