Centralise userdev config reading, support missing SAS

This commit is contained in:
Juuz
2023-11-01 01:02:43 +02:00
parent 29fbc7d736
commit 74151c1171
8 changed files with 83 additions and 51 deletions

View File

@@ -0,0 +1,45 @@
package dev.architectury.loom.forge;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.fabricmc.loom.configuration.providers.forge.ForgeRunTemplate;
public record UserdevConfig(
String mcp,
String universal,
String sources,
String patches,
Optional<String> patchesOriginalPrefix,
Optional<String> patchesModifiedPrefix,
String binpatches,
BinaryPatcherConfig binpatcher,
List<String> libraries,
Map<String, ForgeRunTemplate> runs,
List<String> sass
) {
public static final Codec<UserdevConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
Codec.STRING.fieldOf("mcp").forGetter(UserdevConfig::mcp),
Codec.STRING.fieldOf("universal").forGetter(UserdevConfig::universal),
Codec.STRING.fieldOf("sources").forGetter(UserdevConfig::sources),
Codec.STRING.fieldOf("patches").forGetter(UserdevConfig::patches),
Codec.STRING.optionalFieldOf("patchesOriginalPrefix").forGetter(UserdevConfig::patchesOriginalPrefix),
Codec.STRING.optionalFieldOf("patchesModifiedPrefix").forGetter(UserdevConfig::patchesModifiedPrefix),
Codec.STRING.fieldOf("binpatches").forGetter(UserdevConfig::binpatches),
BinaryPatcherConfig.CODEC.fieldOf("binpatcher").forGetter(UserdevConfig::binpatcher),
Codec.STRING.listOf().fieldOf("libraries").forGetter(UserdevConfig::libraries),
ForgeRunTemplate.MAP_CODEC.fieldOf("runs").forGetter(UserdevConfig::runs),
Codec.STRING.listOf().optionalFieldOf("sass", List.of()).forGetter(UserdevConfig::sass)
).apply(instance, UserdevConfig::new));
public record BinaryPatcherConfig(String dependency, List<String> args) {
public static final Codec<BinaryPatcherConfig> CODEC = RecordCodecBuilder.create(instance -> instance.group(
Codec.STRING.fieldOf("version").forGetter(BinaryPatcherConfig::dependency),
Codec.STRING.listOf().fieldOf("args").forGetter(BinaryPatcherConfig::args)
).apply(instance, BinaryPatcherConfig::new));
}
}

View File

@@ -31,18 +31,16 @@ public final class ForgeLoggerConfig {
throw new UncheckedIOException(e);
}
final JsonArray libraries = LoomGradleExtension.get(project)
final List<String> libraries = LoomGradleExtension.get(project)
.getForgeUserdevProvider()
.getJson()
.getAsJsonArray("libraries");
.getConfig()
.libraries();
boolean found = false;
for (JsonElement library : libraries) {
final String notation = library.getAsString();
if (LOGGER_CONFIG_ARTIFACTS.stream().anyMatch(artifact -> artifact.matches(notation))) {
for (String library : libraries) {
if (LOGGER_CONFIG_ARTIFACTS.stream().anyMatch(artifact -> artifact.matches(library))) {
final File libraryFile = project.getConfigurations()
.detachedConfiguration(project.getDependencies().create(notation))
.detachedConfiguration(project.getDependencies().create(library))
.setTransitive(false)
.getSingleFile();

View File

@@ -32,7 +32,6 @@ import java.util.ArrayList;
import java.util.List;
import com.google.common.hash.Hashing;
import com.google.gson.JsonElement;
import dev.architectury.loom.neoforge.MojangMappingsMerger;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Dependency;
@@ -67,15 +66,15 @@ public class ForgeLibrariesProvider {
final List<Dependency> dependencies = new ArrayList<>();
// Collect all dependencies with possible relocations, such as Mixin.
for (JsonElement lib : extension.getForgeUserdevProvider().getJson().get("libraries").getAsJsonArray()) {
for (String lib : extension.getForgeUserdevProvider().getConfig().libraries()) {
String dep = null;
if (lib.getAsString().startsWith("org.spongepowered:mixin:")) {
if (lib.startsWith("org.spongepowered:mixin:")) {
if (PropertyUtil.getAndFinalize(extension.getForge().getUseCustomMixin())) {
if (lib.getAsString().contains("0.8.2")) {
if (lib.contains("0.8.2")) {
dep = "net.fabricmc:sponge-mixin:0.8.2+build.24";
} else {
String version = lib.getAsString().substring(lib.getAsString().lastIndexOf(":"));
String version = lib.substring(lib.lastIndexOf(":"));
// Used for the file extension, for example @jar
int atIndex = version.indexOf('@');
@@ -90,7 +89,7 @@ public class ForgeLibrariesProvider {
}
if (dep == null) {
dep = lib.getAsString();
dep = lib;
}
dependencies.add(project.getDependencies().create(dep));

View File

@@ -40,6 +40,7 @@ import com.google.common.collect.MultimapBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.mojang.serialization.JsonOps;
import dev.architectury.loom.forge.UserdevConfig;
import org.gradle.api.NamedDomainObjectContainer;
import org.gradle.api.NamedDomainObjectSet;
import org.gradle.api.Project;
@@ -59,20 +60,12 @@ public class ForgeRunsProvider {
private final JsonObject json;
private final NamedDomainObjectSet<ForgeRunTemplate> templates;
public ForgeRunsProvider(Project project, JsonObject json) {
public ForgeRunsProvider(Project project, JsonObject json, UserdevConfig userdevConfig) {
this.project = project;
this.extension = LoomGradleExtension.get(project);
this.json = json;
this.templates = project.getObjects().namedDomainObjectSet(ForgeRunTemplate.class);
readTemplates();
}
private void readTemplates() {
final JsonObject runJson = json.getAsJsonObject("runs");
final Collection<ForgeRunTemplate> templates = ForgeRunTemplate.MAP_CODEC.parse(JsonOps.INSTANCE, runJson)
.getOrThrow(false, error -> project.getLogger().error("Couldn't read run config templates, {}", error))
.values();
this.templates.addAll(templates);
this.templates.addAll(userdevConfig.runs().values());
}
public NamedDomainObjectSet<ForgeRunTemplate> getTemplates() {
@@ -80,8 +73,8 @@ public class ForgeRunsProvider {
}
public static ForgeRunsProvider create(Project project) {
JsonObject json = LoomGradleExtension.get(project).getForgeUserdevProvider().getJson();
return new ForgeRunsProvider(project, json);
final ForgeUserdevProvider userdevProvider = LoomGradleExtension.get(project).getForgeUserdevProvider();
return new ForgeRunsProvider(project, userdevProvider.getJson(), userdevProvider.getConfig());
}
public ConfigValue.Resolver getResolver(@Nullable RunConfigSettings runConfig) {

View File

@@ -1,7 +1,7 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2020-2022 FabricMC
* Copyright (c) 2020-2023 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
@@ -29,13 +29,13 @@ import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.mojang.serialization.JsonOps;
import dev.architectury.loom.forge.UserdevConfig;
import org.gradle.api.Project;
import net.fabricmc.loom.LoomGradlePlugin;
import net.fabricmc.loom.configuration.DependencyInfo;
import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.ZipUtils;
@@ -43,8 +43,8 @@ import net.fabricmc.loom.util.ZipUtils;
public class ForgeUserdevProvider extends DependencyProvider {
private File userdevJar;
private JsonObject json;
private UserdevConfig config;
Path joinedPatches;
BinaryPatcherConfig binaryPatcherConfig;
public ForgeUserdevProvider(Project project) {
super(project);
@@ -64,21 +64,21 @@ public class ForgeUserdevProvider extends DependencyProvider {
try (Reader reader = Files.newBufferedReader(configJson)) {
json = new Gson().fromJson(reader, JsonObject.class);
config = UserdevConfig.CODEC.parse(JsonOps.INSTANCE, json)
.getOrThrow(false, msg -> getProject().getLogger().error("Couldn't read userdev config, {}", msg));
}
addDependency(json.get("mcp").getAsString(), Constants.Configurations.MCP_CONFIG);
addDependency(config.mcp(), Constants.Configurations.MCP_CONFIG);
if (!getExtension().isNeoForge()) {
addDependency(json.get("mcp").getAsString(), Constants.Configurations.SRG);
addDependency(config.mcp(), Constants.Configurations.SRG);
}
addDependency(json.get("universal").getAsString(), Constants.Configurations.FORGE_UNIVERSAL);
addDependency(config.universal(), Constants.Configurations.FORGE_UNIVERSAL);
if (Files.notExists(joinedPatches)) {
Files.write(joinedPatches, ZipUtils.unpack(userdevJar.toPath(), json.get("binpatches").getAsString()));
Files.write(joinedPatches, ZipUtils.unpack(userdevJar.toPath(), config.binpatches()));
}
binaryPatcherConfig = BinaryPatcherConfig.fromJson(json.getAsJsonObject("binpatcher"));
}
public File getUserdevJar() {
@@ -94,11 +94,7 @@ public class ForgeUserdevProvider extends DependencyProvider {
return json;
}
public record BinaryPatcherConfig(String dependency, List<String> args) {
public static BinaryPatcherConfig fromJson(JsonObject json) {
String dependency = json.get("version").getAsString();
List<String> args = List.of(LoomGradlePlugin.GSON.fromJson(json.get("args"), String[].class));
return new BinaryPatcherConfig(dependency, args);
}
public UserdevConfig getConfig() {
return config;
}
}

View File

@@ -52,6 +52,7 @@ import java.util.stream.Stream;
import com.google.common.base.Preconditions;
import com.google.common.base.Stopwatch;
import de.oceanlabs.mcp.mcinjector.adaptors.ParameterAnnotationFixer;
import dev.architectury.loom.forge.UserdevConfig;
import dev.architectury.loom.util.MappingOption;
import dev.architectury.loom.util.TempFiles;
import dev.architectury.tinyremapper.InputTag;
@@ -451,7 +452,7 @@ public class MinecraftPatchedProvider {
private void patchJars(Path clean, Path output, Path patches) {
ForgeToolExecutor.exec(project, spec -> {
ForgeUserdevProvider.BinaryPatcherConfig config = getExtension().getForgeUserdevProvider().binaryPatcherConfig;
UserdevConfig.BinaryPatcherConfig config = getExtension().getForgeUserdevProvider().getConfig().binpatcher();
spec.classpath(DependencyDownloader.download(project, config.dependency()));
spec.getMainClass().set("net.minecraftforge.binarypatcher.ConsoleTool");

View File

@@ -115,7 +115,7 @@ public class ForgeSourcesRemapper {
public static void provideForgeSources(Project project, SharedServiceManager serviceManager, BiConsumer<String, byte[]> consumer) throws IOException {
LoomGradleExtension extension = LoomGradleExtension.get(project);
String sourceDependency = extension.getForgeUserdevProvider().getJson().getAsJsonPrimitive("sources").getAsString();
String sourceDependency = extension.getForgeUserdevProvider().getConfig().sources();
List<Path> forgeInstallerSources = new ArrayList<>();
for (File file : DependencyDownloader.download(project, sourceDependency)) {

View File

@@ -137,7 +137,7 @@ public abstract class GenerateForgePatchedSourcesTask extends AbstractLoomTask {
private Path sourcePatch(Path cache, Path rawDecompiled) throws IOException {
ForgeUserdevProvider userdev = getExtension().getForgeUserdevProvider();
String patchPathInZip = userdev.getJson().getAsJsonPrimitive("patches").getAsString();
String patchPathInZip = userdev.getConfig().patches();
Path output = cache.resolve("patched.jar");
Path rejects = cache.resolve("rejects");
@@ -149,8 +149,8 @@ public abstract class GenerateForgePatchedSourcesTask extends AbstractLoomTask {
.outputPath(output)
.mode(PatchMode.ACCESS)
.rejectsPath(rejects)
.aPrefix(userdev.getJson().getAsJsonPrimitive("patchesOriginalPrefix").getAsString())
.bPrefix(userdev.getJson().getAsJsonPrimitive("patchesModifiedPrefix").getAsString())
.aPrefix(userdev.getConfig().patchesOriginalPrefix().orElseThrow())
.bPrefix(userdev.getConfig().patchesModifiedPrefix().orElseThrow())
.build()
.operate();
@@ -174,18 +174,18 @@ public abstract class GenerateForgePatchedSourcesTask extends AbstractLoomTask {
try (var tempFiles = new TempFiles()) {
final ForgeUserdevProvider userdevProvider = getExtension().getForgeUserdevProvider();
final JsonArray sass = userdevProvider.getJson().getAsJsonArray("sass");
final List<String> sass = userdevProvider.getConfig().sass();
final List<Path> sasPaths = new ArrayList<>();
try (FileSystemUtil.Delegate fs = FileSystemUtil.getJarFileSystem(userdevProvider.getUserdevJar(), false)) {
for (JsonElement sasPath : sass) {
for (String sasPath : sass) {
try {
final Path from = fs.getPath(sasPath.getAsString());
final Path from = fs.getPath(sasPath);
final Path to = tempFiles.file(null, ".sas");
Files.copy(from, to, StandardCopyOption.REPLACE_EXISTING);
sasPaths.add(to);
} catch (IOException e) {
throw new IOException("Could not extract SAS " + sasPath.getAsString());
throw new IOException("Could not extract SAS " + sasPath);
}
}
}