Migrate ATs to JavaExec and make them quiet

This commit is contained in:
Juuz
2021-05-30 21:06:01 +03:00
parent 5692cb277c
commit af3f287fc4
4 changed files with 53 additions and 26 deletions

View File

@@ -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')

View File

@@ -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<String> 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,

View File

@@ -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() {
}

View File

@@ -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);
}
}