mirror of
https://github.com/architectury/architectury-loom.git
synced 2026-03-28 04:07:01 -05:00
Centralise userdev config reading, support missing SAS
This commit is contained in:
45
src/main/java/dev/architectury/loom/forge/UserdevConfig.java
Normal file
45
src/main/java/dev/architectury/loom/forge/UserdevConfig.java
Normal 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));
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user