From 40c0e74bfda62c398db55af2497cdf9e8b277404 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Wed, 14 Aug 2024 22:00:07 +0200 Subject: [PATCH] Port more tasks --- build.gradle | 2 + gradle.properties | 6 +- .../multifilament/MultiFilamentExtension.java | 235 ++++++++++++++++-- .../MultiFilamentGradlePlugin.java | 8 +- 4 files changed, 231 insertions(+), 20 deletions(-) diff --git a/build.gradle b/build.gradle index 93969eb..87fdb8c 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,8 @@ dependencies { implementation "org.ow2.asm:asm-tree:${project.asm_version}" implementation "net.fabricmc.unpick:unpick-format-utils:${project.unpick_version}" implementation "net.fabricmc:mapping-io:0.5.1" + implementation "cuchaz:enigma-cli:${project.enigma_version}" + implementation "net.fabricmc:name-proposal:${project.name_proposal_version}" implementation "net.fabricmc:fabric-filament:0.7.1" implementation("net.fabricmc:fabric-loader:0.15.6") implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.4.2' diff --git a/gradle.properties b/gradle.properties index 0a367d6..3086932 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,6 @@ -multi_filament_version=0.3.0 +multi_filament_version=0.4.0 asm_version=9.6 -unpick_version=2.3.0 \ No newline at end of file +unpick_version=2.3.0 +enigma_version=2.4.1 +name_proposal_version=0.2.0 \ No newline at end of file diff --git a/src/main/java/net/legacyfabric/multifilament/MultiFilamentExtension.java b/src/main/java/net/legacyfabric/multifilament/MultiFilamentExtension.java index 847f94c..3b95822 100644 --- a/src/main/java/net/legacyfabric/multifilament/MultiFilamentExtension.java +++ b/src/main/java/net/legacyfabric/multifilament/MultiFilamentExtension.java @@ -1,8 +1,11 @@ package net.legacyfabric.multifilament; +import cuchaz.enigma.command.CheckMappingsCommand; import net.fabricmc.filament.FilamentExtension; +import net.fabricmc.filament.task.CombineUnpickDefinitionsTask; import net.fabricmc.filament.task.DownloadTask; import net.fabricmc.filament.task.MapJarTask; +import net.fabricmc.filament.task.UnpickJarTask; import net.fabricmc.filament.task.enigma.MapSpecializedMethodsTask; import net.fabricmc.filament.task.mappingio.CompleteMappingsTask; import net.fabricmc.filament.task.mappingio.ConvertMappingsTask; @@ -10,16 +13,19 @@ import net.fabricmc.filament.task.minecraft.ExtractBundledServerTask; import net.fabricmc.filament.task.minecraft.MergeMinecraftTask; import net.fabricmc.mappingio.format.MappingFormat; +import net.fabricmc.nameproposal.MappingNameCompleter; import net.legacyfabric.multifilament.provider.IntermediaryProvider; import net.legacyfabric.multifilament.provider.ProviderHandler; import net.legacyfabric.multifilament.task.*; import net.legacyfabric.multifilament.util.VersionHelper; import org.gradle.api.Action; import org.gradle.api.Project; +import org.gradle.api.Task; import org.gradle.api.artifacts.Configuration; import org.gradle.api.file.Directory; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.RegularFile; +import org.gradle.api.file.RegularFileProperty; import org.gradle.api.java.archives.Manifest; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; @@ -30,9 +36,34 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import java.util.zip.GZIPOutputStream; public abstract class MultiFilamentExtension { + + private DownloadTask downloadIntermediary; + private VersionifyFilterMappingsTask versionifyMappingsFilter; + private VersionifyExcludeMappingsTask versionifyMappingsExclude; + private DeduplicateMappingsTask deduplicateMappings; + private UnifyMappingsTask unifyMappings; + private UnifyMappingsTask unifyMappingsFix; + private MergeMinecraftTask mergeOriginalJars; + private MapJarTask mapIntermediaryJar; + private MapJarTask mapServerIntermediaryJar; + private MapSpecializedMethodsTask mapSpecializedMethods; + private CompleteMappingsTask completeMappings; + private ConvertMappingsTask convertToV1; + private MergeMappingsTask mergeTiny; + private Action manifestAction; + private Jar tinyJar; + private FileInputOutput compressTiny; +// private Task checkMappings; + private CombineUnpickDefinitionsTask combineUnpickDefinitions; +// private FileInputOutput insertAutoGeneratedEnumMappings; +// private FixedRemapUnpickDefinitionsTask fixedRemapUnpickDefinitionsIntermediary; +// private MergeMappingsTask mergeV2; + public static MultiFilamentExtension get(Project project) { return project.getExtensions().getByType(MultiFilamentExtension.class); } @@ -48,10 +79,22 @@ public static MultiFilamentExtension get(Project project) { public abstract Property getBuildMappingGroup(); public abstract Property getMapJarGroupGroup(); public abstract Property getVersion(); + public abstract DirectoryProperty getUnpickDefinitionsDir(); + public abstract RegularFileProperty getUnpickMetaFile(); + public abstract Property getUnpickVersion(); private IntermediaryProvider intermediaryProvider; private final Property minecraftVersion; + private Configuration + asm, + enigmaRuntime, + javadocClasspath, + decompileClasspath, + mappingPoetJar, + mappingPoet + ; + @Inject public MultiFilamentExtension() { minecraftVersion = FilamentExtension.get(getProject()).getMinecraftVersion(); @@ -62,10 +105,30 @@ public MultiFilamentExtension() { getYarnGroup().finalizeValueOnRead(); getBuildMappingGroup().finalizeValueOnRead(); getMapJarGroupGroup().finalizeValueOnRead(); + getVersion().finalizeValueOnRead(); + getUnpickDefinitionsDir().finalizeValueOnRead(); + getUnpickMetaFile().finalizeValueOnRead(); + getUnpickVersion().finalizeValueOnRead(); + } + + protected void createConfigurations() { + asm = getProject().getConfigurations().create("asm"); + enigmaRuntime = getProject().getConfigurations().create("enigmaRuntime", conf -> { + conf.extendsFrom(asm); + }); + javadocClasspath = getProject().getConfigurations().create("javadocClasspath"); + decompileClasspath = getProject().getConfigurations().create("decompileClasspath"); + mappingPoetJar = getProject().getConfigurations().create("mappingPoetJar", conf -> { + conf.setTransitive(false); + }); + mappingPoet = getProject().getConfigurations().create("mappingPoet", conf -> { + conf.extendsFrom(mappingPoetJar, asm); + conf.setTransitive(true); + }); } protected void createTasks() { - DownloadTask downloadIntermediary = getProject().getTasks().create("downloadIntermediary", DownloadTask.class, downloadTask -> { + downloadIntermediary = getProject().getTasks().create("downloadIntermediary", DownloadTask.class, downloadTask -> { // downloadTask.setGroup(getBuildMappingGroup().get()); downloadTask.setGroup("mapping build"); downloadTask.getUrl().set( @@ -76,7 +139,7 @@ protected void createTasks() { ); }); - VersionifyFilterMappingsTask versionifyMappingsFilter = getProject().getTasks().create("versionifyMappingsFilter", VersionifyFilterMappingsTask.class, task -> { + versionifyMappingsFilter = getProject().getTasks().create("versionifyMappingsFilter", VersionifyFilterMappingsTask.class, task -> { task.dependsOn(downloadIntermediary); task.getIntermediaryFile().set(downloadIntermediary.getOutputFile()); task.getInputDir().set(getMultiMappingsDir()); @@ -84,7 +147,7 @@ protected void createTasks() { task.getOutputs().upToDateWhen(c -> false); }); - VersionifyExcludeMappingsTask versionifyMappingsExclude = getProject().getTasks().create("versionifyMappingsExclude", VersionifyExcludeMappingsTask.class, task -> { + versionifyMappingsExclude = getProject().getTasks().create("versionifyMappingsExclude", VersionifyExcludeMappingsTask.class, task -> { task.dependsOn(downloadIntermediary, versionifyMappingsFilter); task.getIntermediaryFile().set(downloadIntermediary.getOutputFile()); task.getInputDir().set(getMultiMappingsDir()); @@ -92,12 +155,12 @@ protected void createTasks() { task.getOutputs().upToDateWhen(c -> false); }); - DeduplicateMappingsTask deduplicateMappings = getProject().getTasks().create("deduplicateMappings", DeduplicateMappingsTask.class, task -> { + deduplicateMappings = getProject().getTasks().create("deduplicateMappings", DeduplicateMappingsTask.class, task -> { task.getInputDir().set(getMultiMappingsDir()); task.getOutputDir().set(getTempMappingsDir()); }); - UnifyMappingsTask unifyMappings = getProject().getTasks().create("unifyMappings", UnifyMappingsTask.class, task -> { + unifyMappings = getProject().getTasks().create("unifyMappings", UnifyMappingsTask.class, task -> { task.dependsOn(versionifyMappingsExclude); task.getUnifiedDir().set(getTempMappingsDir()); task.getVersionedDir().set(getActiveMappingsDir()); @@ -105,14 +168,14 @@ protected void createTasks() { task.getOutputs().upToDateWhen(c -> false); }); - UnifyMappingsTask unifyMappingsFix = getProject().getTasks().create("unifyMappingsFix", UnifyMappingsTask.class, task -> { + unifyMappingsFix = getProject().getTasks().create("unifyMappingsFix", UnifyMappingsTask.class, task -> { task.getUnifiedDir().set(getTempMappingsDir()); task.getVersionedDir().set(getActiveMappingsDir()); task.getOutputDir().set(getMultiMappingsDir()); task.getOutputs().upToDateWhen(c -> false); }); - MergeMinecraftTask mergeOriginalJars = getProject().getTasks().create("mergeOriginalMinecraftJars", MergeMinecraftTask.class, task -> { + mergeOriginalJars = getProject().getTasks().create("mergeOriginalMinecraftJars", MergeMinecraftTask.class, task -> { DownloadTask clientJar = (DownloadTask) getProject().getTasks().getByName("downloadMinecraftClientJar"); DownloadTask serverJar = (DownloadTask) getProject().getTasks().getByName("downloadMinecraftServerJar"); @@ -123,7 +186,7 @@ protected void createTasks() { task.getOutput().set(FilamentExtension.get(getProject()).getMinecraftFile("merged.jar")); }); - MapJarTask mapIntermediaryJar = getProject().getTasks().create("mapIntermediaryJar", MapJarTask.class, task -> { + mapIntermediaryJar = getProject().getTasks().create("mapIntermediaryJar", MapJarTask.class, task -> { MergeMinecraftTask mergeJars = (MergeMinecraftTask) getProject().getTasks().getByName("mergeMinecraftJars"); task.dependsOn(isServerBundled() ? mergeJars : mergeOriginalJars); @@ -137,7 +200,7 @@ protected void createTasks() { task.getTo().set("intermediary"); }); - MapJarTask mapServerIntermediaryJar = getProject().getTasks().create("mapServerIntermediaryJar", MapJarTask.class, task -> { + mapServerIntermediaryJar = getProject().getTasks().create("mapServerIntermediaryJar", MapJarTask.class, task -> { ExtractBundledServerTask extractBundledServer = (ExtractBundledServerTask) getProject().getTasks().getByName("extractBundledServer"); DownloadTask serverJar = (DownloadTask) getProject().getTasks().getByName("downloadMinecraftServerJar"); @@ -152,7 +215,7 @@ protected void createTasks() { task.getTo().set("intermediary"); }); - MapSpecializedMethodsTask mapSpecializedMethods = getProject().getTasks().create("mapSpecializedMethods", MapSpecializedMethodsTask.class, task -> { + mapSpecializedMethods = getProject().getTasks().create("mapSpecializedMethods", MapSpecializedMethodsTask.class, task -> { task.dependsOn(versionifyMappingsExclude); task.getIntermediaryJarFile().set(mapIntermediaryJar.getOutput()); task.getMappings().set(getActiveMappingsDir()); @@ -162,19 +225,19 @@ protected void createTasks() { task.getOutputMappingsFormat().set("tinyv2:intermediary:named"); }); - CompleteMappingsTask completeMappings = getProject().getTasks().create("completeMappings", CompleteMappingsTask.class, task -> { + completeMappings = getProject().getTasks().create("completeMappings", CompleteMappingsTask.class, task -> { task.getInput().set(mapSpecializedMethods.getOutput()); task.getOutput().set(getTempDirectory().file("yarn-mappings-v2.tiny")); task.getOutputFormat().set(MappingFormat.TINY_2_FILE); }); - ConvertMappingsTask convertToV1 = getProject().getTasks().create("convertToV1", ConvertMappingsTask.class, task -> { + convertToV1 = getProject().getTasks().create("convertToV1", ConvertMappingsTask.class, task -> { task.getInput().set(mapSpecializedMethods.getOutput()); task.getOutput().set(getTempDirectory().file("yarn-mappings.tiny")); task.getOutputFormat().set(MappingFormat.TINY_FILE); }); - MergeMappingsTask mergeTiny = getProject().getTasks().create("mergeTiny", MergeMappingsTask.class, task -> { + mergeTiny = getProject().getTasks().create("mergeTiny", MergeMappingsTask.class, task -> { // task.setGroup(getBuildMappingGroup().get()); task.setGroup("mapping build"); task.getOutput().set(getTempDirectory().file("mappings.tiny")); @@ -183,12 +246,12 @@ protected void createTasks() { task.getOutputFormat().set(MappingFormat.TINY_FILE); }); - Action manifestAction = manifest -> { + manifestAction = manifest -> { manifest.getAttributes().put("Minecraft-Version-Id", minecraftVersionGetter().get()); // manifest.getAttributes().put("Intermediary-Version", getIntermediaryRevision().get()); }; - Jar tinyJar = getProject().getTasks().create("tinyJar", Jar.class, task -> { + tinyJar = getProject().getTasks().create("tinyJar", Jar.class, task -> { task.dependsOn(mergeTiny); // task.setGroup(getBuildMappingGroup().get()); task.setGroup("mapping build"); @@ -203,7 +266,7 @@ protected void createTasks() { task.manifest(manifestAction); }); - FileInputOutput compressTiny = getProject().getTasks().create("compressTiny", FileInputOutput.class, task -> { + compressTiny = getProject().getTasks().create("compressTiny", FileInputOutput.class, task -> { task.dependsOn(tinyJar, mergeTiny); // task.setGroup(getBuildMappingGroup().get()); task.setGroup("mapping build"); @@ -232,6 +295,146 @@ protected void createTasks() { } }); }); + +// checkMappings = getProject().getTasks().create("checkMappings", task -> { +// task.dependsOn(versionifyMappingsExclude); +//// task.setGroup(getBuildMappingGroup().get()); +// task.setGroup("mapping build"); +// task.getInputs().dir(getActiveMappingsDir()); +// task.getInputs().file(mapIntermediaryJar.getOutput()); +// +// task.doLast(currentTask -> { +// String[] args = new String[] { +// mapIntermediaryJar.getOutputFile().getAbsolutePath(), +// getActiveMappingsDir().getAsFile().get().getAbsolutePath() +// }; +// +// try { +// new CheckMappingsCommand().run(args); +// } catch (Exception ignored) { +// // just print, don't fail the task +// } +// }); +// }); + + combineUnpickDefinitions = (CombineUnpickDefinitionsTask) getProject().getTasks().getByName("combineUnpickDefinitions", gradleTask -> { + CombineUnpickDefinitionsTask task = (CombineUnpickDefinitionsTask) gradleTask; + task.setGroup("unpick"); + task.getInput().set(getUnpickDefinitionsDir()); + task.getOutput().set(getTempDirectory().file("definitions.unpick")); + }); + +// insertAutoGeneratedEnumMappings = getProject().getTasks().create("insertAutoGeneratedEnumMappings", FileInputOutput.class, task -> { +// task.dependsOn(mapIntermediaryJar, downloadIntermediary); +//// task.setGroup(getBuildMappingGroup().get()); +// task.setGroup("mapping build"); +// task.getInput().set(completeMappings.getOutput()); +// task.getOutput().set(getTempDirectory().file("unmerged-named-v2-with-enum.tiny")); +// +// task.getInputs().file(mapIntermediaryJar.getOutput()); +// task.getInputs().file(downloadIntermediary.getOutput()); +// +// task.doLast(currentTaskGradle -> { +// FileInputOutput currentTask = (FileInputOutput) currentTaskGradle; +// +// try { +// MappingNameCompleter.completeNames( +// mapIntermediaryJar.getOutputPath(), +// currentTask.getInputPath(), +// downloadIntermediary.getOutputPath(), +// currentTask.getOutputPath() +// ); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// }); +// }); + +// fixedRemapUnpickDefinitionsIntermediary = getProject().getTasks().create("fixedRemapUnpickDefinitionsIntermediary", FixedRemapUnpickDefinitionsTask.class, task -> { +// task.setGroup("unpick"); +// task.dependsOn(combineUnpickDefinitions); +// task.getInput().set(combineUnpickDefinitions.getOutput()); +// task.getSourceNamespace().set("named"); +// task.getTargetNamespace().set("intermediary"); +// +// task.getOutput().set(getTempDirectory().file("intermediary-definitions.unpick")); +// task.getMappings().set(insertAutoGeneratedEnumMappings.getOutput()); +// }); + +// mergeV2 = getProject().getTasks().create("mergeV2", MergeMappingsTask.class, task -> { +//// task.setGroup(getBuildMappingGroup().get()); +// task.setGroup("mapping build"); +// task.getOutput().set(getTempDirectory().file("merged-v2.tiny")); +// task.getMappingInputs().from(downloadIntermediary.getOutput()); +// task.getMappingInputs().from(insertAutoGeneratedEnumMappings.getOutput()); +// task.getOutputFormat().set(MappingFormat.TINY_2_FILE); +// }); + } + + protected void createTasksLate() { +// UnpickJarTask unpickIntermediaryJar = getProject().getTasks().create("unpickIntermediaryJar", UnpickJarTask.class, task -> { +// Jar constantsJar = (Jar) getProject().getTasks().getByName("constantsJar"); +// +// task.setGroup("unpick"); +// task.getInput().set(mapIntermediaryJar.getOutput()); +// task.getOutput().set(minecraftVersionGetter().flatMap(v -> getCacheFile(v + "-intermediary-unpicked.jar"))); +// task.getUnpickDefinition().set(fixedRemapUnpickDefinitionsIntermediary.getOutput()); +// task.getConstantsJarFile().set(constantsJar.getArchiveFile()); +// task.getClasspath().from(getMinecraftLibsConfiguration()); +// }); + + Jar v2UnmergedYarnJar = getProject().getTasks().create("v2UnmergedYarnJar", Jar.class, task -> { + FileInputOutput insertAutoGeneratedEnumMappings = (FileInputOutput) getProject().getTasks().getByName("insertAutoGeneratedEnumMappings"); + + yarnV2Jar( + task, + getVersion().map(v -> "yarn-" + v + "-v2.jar"), + insertAutoGeneratedEnumMappings.getOutput(), + combineUnpickDefinitions.getOutput(), + manifestAction, + + insertAutoGeneratedEnumMappings, combineUnpickDefinitions + ); + }); + + Jar v2MergedYarnJar = getProject().getTasks().create("v2MergedYarnJar", Jar.class, task -> { + MergeMappingsTask mergeV2 = (MergeMappingsTask) getProject().getTasks().getByName("mergeV2"); + + yarnV2Jar( + task, + getVersion().map(v -> "yarn-" + v + "-mergedv2.jar"), + mergeV2.getOutput(), + combineUnpickDefinitions.getOutput(), + manifestAction, + + mergeV2 + ); + }); + } + + private void yarnV2Jar(Jar task, Provider fileName, RegularFileProperty mappings, RegularFileProperty unpickDefinitions, Action manifestAction, Object... dependsOn) { + task.dependsOn(dependsOn); +// task.setGroup(getBuildMappingGroup().get()); + task.setGroup("mapping build"); + + task.getArchiveFileName().set(fileName); + + task.from(mappings, from -> { + from.rename(mappings.get().getAsFile().getName(), "mappings/mappings.tiny"); + }); + + task.from(unpickDefinitions, from -> { + from.rename(unpickDefinitions.get().getAsFile().getName(), "extras/definitions.unpick"); + }); + + task.from(getUnpickMetaFile(), from -> { + from.expand(new HashMap<>(Map.of("version", getUnpickVersion().get()))); + from.rename(getUnpickMetaFile().get().getAsFile().getName(), "extras/unpick.json"); + }); + + task.getDestinationDirectory().set(getLibsDirectory()); + + task.manifest(manifestAction); } private Property minecraftVersionGetter() { diff --git a/src/main/java/net/legacyfabric/multifilament/MultiFilamentGradlePlugin.java b/src/main/java/net/legacyfabric/multifilament/MultiFilamentGradlePlugin.java index f6a171f..27188fb 100644 --- a/src/main/java/net/legacyfabric/multifilament/MultiFilamentGradlePlugin.java +++ b/src/main/java/net/legacyfabric/multifilament/MultiFilamentGradlePlugin.java @@ -3,10 +3,9 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import net.fabricmc.filament.FilamentGradlePlugin; -import net.fabricmc.filament.task.CombineUnpickDefinitionsTask; +import net.fabricmc.filament.task.CombineUnpickDefinitionsTask; import net.legacyfabric.multifilament.task.FixedRemapUnpickDefinitionsTask; - import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.tasks.TaskContainer; @@ -19,6 +18,7 @@ public void apply(Project project) { project.getPlugins().apply(FilamentGradlePlugin.class); final MultiFilamentExtension extension = project.getExtensions().create("multiFilament", MultiFilamentExtension.class); + extension.createConfigurations(); extension.createTasks(); TaskContainer tasks = project.getTasks(); @@ -30,5 +30,9 @@ public void apply(Project project) { task.getSourceNamespace().set("named"); task.getTargetNamespace().set("intermediary"); }); + + project.afterEvaluate(p -> { + extension.createTasksLate(); + }); } }