From 4f6992430fa9954d81d7b34570c14bd195c91425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=20=E9=9B=A8=E8=90=BD?= <53731501+qyl27@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:47:17 +0800 Subject: [PATCH 01/11] Fix `transformJson` mis-encoding. (#1181) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋雨落 --- src/main/java/net/fabricmc/loom/util/ZipUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/util/ZipUtils.java b/src/main/java/net/fabricmc/loom/util/ZipUtils.java index 714dce83..9d73a4c2 100644 --- a/src/main/java/net/fabricmc/loom/util/ZipUtils.java +++ b/src/main/java/net/fabricmc/loom/util/ZipUtils.java @@ -205,7 +205,7 @@ public class ZipUtils { } public static int transformJson(Class typeOfT, Path zip, Map> transforms) throws IOException { - return transformMapped(zip, transforms, bytes -> LoomGradlePlugin.GSON.fromJson(new InputStreamReader(new ByteArrayInputStream(bytes)), typeOfT), + return transformMapped(zip, transforms, bytes -> LoomGradlePlugin.GSON.fromJson(new InputStreamReader(new ByteArrayInputStream(bytes), StandardCharsets.UTF_8), typeOfT), s -> LoomGradlePlugin.GSON.toJson(s, typeOfT).getBytes(StandardCharsets.UTF_8)); } From e5b785ab4141a5ee70fa77032ede217373a78c39 Mon Sep 17 00:00:00 2001 From: Space Walker <48224626+SpaceWalkerRS@users.noreply.github.com> Date: Mon, 30 Sep 2024 15:37:25 +0200 Subject: [PATCH 02/11] Select jar configuration based on which sides are present (#1182) * auto select jar configuration based on which sides are present * move logic into jar configuration property convention --- .../fabricmc/loom/LoomGradleExtension.java | 5 +++++ .../configuration/CompileConfiguration.java | 7 +------ .../extension/LoomGradleExtensionApiImpl.java | 20 ++++++++++++++++++- .../extension/LoomGradleExtensionImpl.java | 12 +++++++++++ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index b21de99a..22c59b11 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -41,6 +41,7 @@ import net.fabricmc.loom.configuration.LoomDependencyManager; import net.fabricmc.loom.configuration.accesswidener.AccessWidenerFile; import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsFactory; import net.fabricmc.loom.configuration.providers.mappings.MappingConfiguration; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMetadataProvider; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.library.LibraryProcessorManager; import net.fabricmc.loom.configuration.providers.minecraft.mapped.IntermediaryMinecraftProvider; @@ -68,6 +69,10 @@ public interface LoomGradleExtension extends LoomGradleExtensionAPI { LoomDependencyManager getDependencyManager(); + MinecraftMetadataProvider getMetadataProvider(); + + void setMetadataProvider(MinecraftMetadataProvider metadataProvider); + MinecraftProvider getMinecraftProvider(); void setMinecraftProvider(MinecraftProvider minecraftProvider); diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index 743091ac..5cf753ec 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -60,7 +60,6 @@ import net.fabricmc.loom.configuration.processors.MinecraftJarProcessorManager; import net.fabricmc.loom.configuration.processors.ModJavadocProcessor; import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsFactory; import net.fabricmc.loom.configuration.providers.mappings.MappingConfiguration; -import net.fabricmc.loom.configuration.providers.minecraft.MinecraftJarConfiguration; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMetadataProvider; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftSourceSets; @@ -69,7 +68,6 @@ import net.fabricmc.loom.configuration.providers.minecraft.mapped.IntermediaryMi import net.fabricmc.loom.configuration.providers.minecraft.mapped.NamedMinecraftProvider; import net.fabricmc.loom.extension.MixinExtension; import net.fabricmc.loom.util.Checksum; -import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.ExceptionUtil; import net.fabricmc.loom.util.ProcessUtil; import net.fabricmc.loom.util.gradle.GradleUtils; @@ -154,13 +152,10 @@ public abstract class CompileConfiguration implements Runnable { final LoomGradleExtension extension = configContext.extension(); final MinecraftMetadataProvider metadataProvider = MinecraftMetadataProvider.create(configContext); + extension.setMetadataProvider(metadataProvider); var jarConfiguration = extension.getMinecraftJarConfiguration().get(); - if (jarConfiguration == MinecraftJarConfiguration.MERGED && !metadataProvider.getVersionMeta().isVersionOrNewer(Constants.RELEASE_TIME_1_3)) { - jarConfiguration = MinecraftJarConfiguration.LEGACY_MERGED; - } - // Provide the vanilla mc jars final MinecraftProvider minecraftProvider = jarConfiguration.createMinecraftProvider(metadataProvider, configContext); extension.setMinecraftProvider(minecraftProvider); diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java index 170188e6..64d7524e 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java @@ -68,8 +68,10 @@ import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuil import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsFactory; import net.fabricmc.loom.configuration.providers.minecraft.ManifestLocations; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftJarConfiguration; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMetadataProvider; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftSourceSets; import net.fabricmc.loom.task.GenerateSourcesTask; +import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DeprecationHelper; import net.fabricmc.loom.util.MirrorUtil; import net.fabricmc.loom.util.fmj.FabricModJson; @@ -151,7 +153,23 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA this.minecraftJarProcessors.finalizeValueOnRead(); //noinspection unchecked - this.minecraftJarConfiguration = project.getObjects().property((Class>) (Class) MinecraftJarConfiguration.class).convention(MinecraftJarConfiguration.MERGED); + this.minecraftJarConfiguration = project.getObjects().property((Class>) (Class) MinecraftJarConfiguration.class) + .convention(project.provider(() -> { + final LoomGradleExtension extension = LoomGradleExtension.get(project); + final MinecraftMetadataProvider metadataProvider = extension.getMetadataProvider(); + + // if no configuration is selected by the user, attempt to select one + // based on the mc version and which sides are present for it + if (!metadataProvider.getVersionMeta().downloads().containsKey("server")) { + return MinecraftJarConfiguration.CLIENT_ONLY; + } else if (!metadataProvider.getVersionMeta().downloads().containsKey("client")) { + return MinecraftJarConfiguration.SERVER_ONLY; + } else if (metadataProvider.getVersionMeta().isVersionOrNewer(Constants.RELEASE_TIME_1_3)) { + return MinecraftJarConfiguration.MERGED; + } else { + return MinecraftJarConfiguration.LEGACY_MERGED; + } + })); this.minecraftJarConfiguration.finalizeValueOnRead(); this.accessWidener.finalizeValueOnRead(); diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java index 18920a00..94dabe73 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java @@ -50,6 +50,7 @@ import net.fabricmc.loom.configuration.providers.mappings.IntermediaryMappingsPr import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsFactory; import net.fabricmc.loom.configuration.providers.mappings.MappingConfiguration; import net.fabricmc.loom.configuration.providers.mappings.NoOpIntermediateMappingsProvider; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMetadataProvider; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.library.LibraryProcessorManager; import net.fabricmc.loom.configuration.providers.minecraft.mapped.IntermediaryMinecraftProvider; @@ -66,6 +67,7 @@ public abstract class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl private final List transitiveAccessWideners = new ArrayList<>(); private LoomDependencyManager dependencyManager; + private MinecraftMetadataProvider metadataProvider; private MinecraftProvider minecraftProvider; private MappingConfiguration mappingConfiguration; private NamedMinecraftProvider namedMinecraftProvider; @@ -130,6 +132,16 @@ public abstract class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl return Objects.requireNonNull(dependencyManager, "Cannot get LoomDependencyManager before it has been setup"); } + @Override + public MinecraftMetadataProvider getMetadataProvider() { + return Objects.requireNonNull(metadataProvider, "Cannot get MinecraftMetadataProvider before it has been setup"); + } + + @Override + public void setMetadataProvider(MinecraftMetadataProvider metadataProvider) { + this.metadataProvider = metadataProvider; + } + @Override public MinecraftProvider getMinecraftProvider() { return Objects.requireNonNull(minecraftProvider, "Cannot get MinecraftProvider before it has been setup"); From e70ca3d7c1672c5e21b1e8742a9eebe539f1f214 Mon Sep 17 00:00:00 2001 From: modmuss Date: Mon, 30 Sep 2024 23:33:40 +0100 Subject: [PATCH 03/11] Fix and test no cache gen sources (#1183) * Fix and test no cache gen sources * Spotless --- .../loom/task/GenerateSourcesTask.java | 39 ++++++++----------- .../loom/test/integration/UnpickTest.groovy | 16 ++++++-- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java index 1758cc50..2577b8bf 100644 --- a/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenerateSourcesTask.java @@ -250,6 +250,8 @@ public abstract class GenerateSourcesTask extends AbstractLoomTask { } if (!getUseCache().get()) { + getLogger().info("Not using decompile cache."); + try (var timer = new Timer("Decompiled sources")) { runWithoutCache(); } catch (Exception e) { @@ -340,19 +342,7 @@ public abstract class GenerateSourcesTask extends AbstractLoomTask { final ClassLineNumbers existingLinenumbers = workRequest.lineNumbers(); final ClassLineNumbers lineNumbers = ClassLineNumbers.merge(existingLinenumbers, outputLineNumbers); - if (lineNumbers == null) { - getLogger().info("No line numbers to remap, skipping remapping"); - return; - } - - Path tempJar = Files.createTempFile("loom", "linenumber-remap.jar"); - Files.delete(tempJar); - - try (var timer = new Timer("Remap line numbers")) { - remapLineNumbers(lineNumbers, classesInputJar, tempJar); - } - - Files.move(tempJar, classesOutputJar, StandardCopyOption.REPLACE_EXISTING); + applyLineNumbers(lineNumbers, classesInputJar, classesOutputJar); try (var timer = new Timer("Prune cache")) { decompileCache.prune(); @@ -360,29 +350,34 @@ public abstract class GenerateSourcesTask extends AbstractLoomTask { } private void runWithoutCache() throws IOException { - Path inputJar = getClassesInputJar().getSingleFile().toPath(); - final Path outputJar = getSourcesOutputJar().get().getAsFile().toPath(); + final Path classesInputJar = getClassesInputJar().getSingleFile().toPath(); + final Path sourcesOutputJar = getSourcesOutputJar().get().getAsFile().toPath(); + final Path classesOutputJar = getClassesOutputJar().getSingleFile().toPath(); - // The final output sources jar + Path workClassesJar = classesInputJar; if (getUnpickDefinitions().isPresent()) { try (var timer = new Timer("Unpick")) { - inputJar = unpickJar(inputJar, null); + workClassesJar = unpickJar(workClassesJar, null); } } ClassLineNumbers lineNumbers; try (var timer = new Timer("Decompile")) { - lineNumbers = runDecompileJob(inputJar, outputJar, null); + lineNumbers = runDecompileJob(workClassesJar, sourcesOutputJar, null); } - if (Files.notExists(outputJar)) { + if (Files.notExists(sourcesOutputJar)) { throw new RuntimeException("Failed to decompile sources"); } - getLogger().info("Decompiled sources written to {}", outputJar); + getLogger().info("Decompiled sources written to {}", sourcesOutputJar); + applyLineNumbers(lineNumbers, classesInputJar, classesOutputJar); + } + + private void applyLineNumbers(@Nullable ClassLineNumbers lineNumbers, Path classesInputJar, Path classesOutputJar) throws IOException { if (lineNumbers == null) { getLogger().info("No line numbers to remap, skipping remapping"); return; @@ -392,10 +387,10 @@ public abstract class GenerateSourcesTask extends AbstractLoomTask { Files.delete(tempJar); try (var timer = new Timer("Remap line numbers")) { - remapLineNumbers(lineNumbers, inputJar, tempJar); + remapLineNumbers(lineNumbers, classesInputJar, tempJar); } - Files.move(tempJar, outputJar, StandardCopyOption.REPLACE_EXISTING); + Files.move(tempJar, classesOutputJar, StandardCopyOption.REPLACE_EXISTING); } private String getCacheKey() { diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/UnpickTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/UnpickTest.groovy index fa09aee9..40d684cc 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/UnpickTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/UnpickTest.groovy @@ -37,17 +37,27 @@ import static org.gradle.testkit.runner.TaskOutcome.SUCCESS class UnpickTest extends Specification implements GradleProjectTestTrait { static final String MAPPINGS = "21w13a-net.fabricmc.yarn.21w13a.21w13a+build.30-v2" - def "unpick decompile"() { + def "unpick decompile #version #useCache"() { setup: def gradle = gradleProject(project: "unpick", version: version) when: - def result = gradle.run(task: "genSources") + def result = gradle.run(tasks: useCache ? [ + "genSourcesWithVineflower", + "--info" + ] : [ + "genSourcesWithVineflower", + "--no-use-cache", + "--info" + ]) then: - result.task(":genSources").outcome == SUCCESS + result.task(":genSourcesWithVineflower").outcome == SUCCESS getClassSource(gradle, "net/minecraft/block/CakeBlock.java").contains("Block.DEFAULT_SET_BLOCK_STATE_FLAG") + result.output.contains(useCache ? "Using decompile cache." : "Not using decompile cache.") + where: version << STANDARD_TEST_VERSIONS + useCache << [true, false] } def "unpick build"() { From 8c2d5525e8cca7e0c6445e9e6940eda940567936 Mon Sep 17 00:00:00 2001 From: modmuss Date: Wed, 2 Oct 2024 09:43:37 +0100 Subject: [PATCH 04/11] Fix #1184 : GradleUtils.getDependencyProject not working for typesafe project accessors (#1185) --- .../loom/util/gradle/GradleUtils.java | 36 ++++++++--- .../loom/test/unit/GradleUtilsTest.groovy | 59 +++++++++++++++++++ 2 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 src/test/groovy/net/fabricmc/loom/test/unit/GradleUtilsTest.groovy diff --git a/src/main/java/net/fabricmc/loom/util/gradle/GradleUtils.java b/src/main/java/net/fabricmc/loom/util/gradle/GradleUtils.java index e700a870..6de98bff 100644 --- a/src/main/java/net/fabricmc/loom/util/gradle/GradleUtils.java +++ b/src/main/java/net/fabricmc/loom/util/gradle/GradleUtils.java @@ -32,10 +32,15 @@ import org.gradle.api.Project; import org.gradle.api.artifacts.ProjectDependency; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency; +import org.gradle.api.internal.catalog.DelegatingProjectDependency; import org.gradle.api.invocation.Gradle; import org.gradle.api.provider.Provider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public final class GradleUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(GradleUtils.class); + private GradleUtils() { } @@ -95,14 +100,29 @@ public final class GradleUtils { // Get the project from the field with reflection to suppress the deprecation warning. // If you hate it find a solution yourself and make a PR, I'm getting a bit tired of chasing Gradle updates public static Project getDependencyProject(ProjectDependency projectDependency) { - try { - final Class clazz = DefaultProjectDependency.class; - final Field dependencyProject = clazz.getDeclaredField("dependencyProject"); - dependencyProject.setAccessible(true); - return (Project) dependencyProject.get(projectDependency); - } catch (NoSuchFieldException | IllegalAccessException ignored) { - // Just fallback and trigger the warning, this will break in Gradle 9 - return projectDependency.getDependencyProject(); + if (projectDependency instanceof DefaultProjectDependency) { + try { + final Class clazz = DefaultProjectDependency.class; + final Field dependencyProject = clazz.getDeclaredField("dependencyProject"); + dependencyProject.setAccessible(true); + return (Project) dependencyProject.get(projectDependency); + } catch (NoSuchFieldException | IllegalAccessException e) { + LOGGER.warn("Failed to reflect DefaultProjectDependency", e); + } + } else if (projectDependency instanceof DelegatingProjectDependency) { + try { + final Class clazz = DelegatingProjectDependency.class; + final Field delgeate = clazz.getDeclaredField("delegate"); + delgeate.setAccessible(true); + return getDependencyProject((ProjectDependency) delgeate.get(projectDependency)); + } catch (NoSuchFieldException | IllegalAccessException e) { + LOGGER.warn("Failed to reflect DelegatingProjectDependency", e); + } } + + // Just fallback and trigger the warning, this will break in Gradle 9 + final Project project = projectDependency.getDependencyProject(); + LOGGER.warn("Loom was unable to suppress the deprecation warning for ProjectDependency#getDependencyProject, if you are on the latest version of Loom please report this issue to the Loom developers and provide the error above, this WILL stop working in a future Gradle version."); + return project; } } diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/GradleUtilsTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/GradleUtilsTest.groovy new file mode 100644 index 00000000..20f9c96f --- /dev/null +++ b/src/test/groovy/net/fabricmc/loom/test/unit/GradleUtilsTest.groovy @@ -0,0 +1,59 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2024 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 + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.fabricmc.loom.test.unit + +import org.gradle.api.internal.artifacts.dependencies.DefaultProjectDependency +import org.gradle.api.internal.catalog.DelegatingProjectDependency +import org.gradle.api.internal.project.ProjectInternal +import spock.lang.Specification + +import net.fabricmc.loom.util.gradle.GradleUtils + +class GradleUtilsTest extends Specification { + def "get default project dependency"() { + given: + def project = Mock(ProjectInternal) + def dependency = new DefaultProjectDependency(project, false) + + when: + def result = GradleUtils.getDependencyProject(dependency) + + then: + result == project + } + + def "get delegated project dependency"() { + given: + def project = Mock(ProjectInternal) + def dependency = new DefaultProjectDependency(project, true) + def delegate = new DelegatingProjectDependency(null, dependency) + + when: + def result = GradleUtils.getDependencyProject(delegate) + + then: + result == project + } +} From c6e4025a0f831626bb677d413ea77b593d872e7b Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 9 Oct 2024 09:32:15 +0100 Subject: [PATCH 05/11] Fix #1186 Incorrect location of launch.json for vscode task --- src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java b/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java index 444f7e57..6684e5ce 100644 --- a/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java +++ b/src/main/java/net/fabricmc/loom/task/GenVsCodeProjectTask.java @@ -73,7 +73,7 @@ public abstract class GenVsCodeProjectTask extends AbstractLoomTask { public GenVsCodeProjectTask() { setGroup(Constants.TaskGroup.IDE); getLaunchConfigurations().set(getProject().provider(this::getConfigurations)); - getLaunchJson().convention(getProject().getRootProject().getLayout().getProjectDirectory().file("vscode/launch.json")); + getLaunchJson().convention(getProject().getRootProject().getLayout().getProjectDirectory().file(".vscode/launch.json")); } private List getConfigurations() { From ca9ed4764d76e233d7f58cf8f41ae3928cdee60f Mon Sep 17 00:00:00 2001 From: modmuss Date: Thu, 10 Oct 2024 08:52:04 +0100 Subject: [PATCH 06/11] Update to ASM 9.7.1 (#1188) * Update to ASM 9.7.1 * Fix Gradle 8.12 nightlies --- gradle/libs.versions.toml | 2 +- gradle/test.libs.versions.toml | 2 +- .../WorkerDaemonClientsManagerHelper.java | 27 ++++++++++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dc1402b6..c807301c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] kotlin = "1.9.24" -asm = "9.6" +asm = "9.7.1" commons-io = "2.15.1" gson = "2.10.1" guava = "33.0.0-jre" diff --git a/gradle/test.libs.versions.toml b/gradle/test.libs.versions.toml index c3c92e8b..2b091d91 100644 --- a/gradle/test.libs.versions.toml +++ b/gradle/test.libs.versions.toml @@ -6,7 +6,7 @@ mockito = "5.13.0" java-debug = "0.52.0" mixin = "0.15.3+mixin.0.8.7" -gradle-nightly = "8.11-20240926001708+0000" +gradle-nightly = "8.12-20241009055624+0000" fabric-loader = "0.16.5" fabric-installer = "1.0.1" diff --git a/src/main/java/net/fabricmc/loom/util/gradle/WorkerDaemonClientsManagerHelper.java b/src/main/java/net/fabricmc/loom/util/gradle/WorkerDaemonClientsManagerHelper.java index d51f7920..07d2f037 100644 --- a/src/main/java/net/fabricmc/loom/util/gradle/WorkerDaemonClientsManagerHelper.java +++ b/src/main/java/net/fabricmc/loom/util/gradle/WorkerDaemonClientsManagerHelper.java @@ -32,6 +32,7 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import org.gradle.api.Transformer; +import org.gradle.process.internal.JvmOptions; import org.gradle.workers.internal.DaemonForkOptions; import org.gradle.workers.internal.WorkerDaemonClientsManager; @@ -45,7 +46,7 @@ public class WorkerDaemonClientsManagerHelper { Transformer, List> transformer = workerDaemonClients -> { for (Object /* WorkerDaemonClient */ client : workerDaemonClients) { DaemonForkOptions forkOptions = getForkOptions(client); - Map systemProperties = forkOptions.getJavaForkOptions().getSystemProperties(); + Map systemProperties = getSystemProperties(forkOptions); if (systemProperties == null || !jvmMarkerValue.equals(systemProperties.get(MARKER_PROP))) { // Not the JVM we are looking for @@ -70,6 +71,30 @@ public class WorkerDaemonClientsManagerHelper { return stopped.get(); } + private static Map getSystemProperties(DaemonForkOptions forkOptions) { + try { + Method getJavaForkOptionsMethod = forkOptions.getClass().getDeclaredMethod("getJavaForkOptions"); + getJavaForkOptionsMethod.setAccessible(true); + Object /* JavaForkOptions */ javaForkOptions = getJavaForkOptionsMethod.invoke(forkOptions); + Method getSystemPropertiesMethod = javaForkOptions.getClass().getDeclaredMethod("getSystemProperties"); + getSystemPropertiesMethod.setAccessible(true); + //noinspection unchecked + return (Map) getSystemPropertiesMethod.invoke(javaForkOptions); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + // Gradle 8.11 and below + } + + // Gradle 8.12+ + try { + Method getJvmOptions = forkOptions.getClass().getDeclaredMethod("getJvmOptions"); + getJvmOptions.setAccessible(true); + JvmOptions jvmOptions = (JvmOptions) getJvmOptions.invoke(forkOptions); + return jvmOptions.getMutableSystemProperties(); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Failed to daemon system properties", e); + } + } + private static DaemonForkOptions getForkOptions(Object /* WorkerDaemonClient */ client) { try { Method getForkOptionsMethod = client.getClass().getDeclaredMethod("getForkOptions"); From 23f30737be25122b0f5508bd49ed0addeaec1352 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Fri, 11 Oct 2024 20:13:06 +0100 Subject: [PATCH 07/11] Fix idea run configs from not generating --- .../net/fabricmc/loom/configuration/ide/idea/IdeaSyncTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/idea/IdeaSyncTask.java b/src/main/java/net/fabricmc/loom/configuration/ide/idea/IdeaSyncTask.java index d7eb67bd..4fae7e3b 100644 --- a/src/main/java/net/fabricmc/loom/configuration/ide/idea/IdeaSyncTask.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/idea/IdeaSyncTask.java @@ -109,6 +109,7 @@ public abstract class IdeaSyncTask extends AbstractLoomTask { irc.getRunConfigXml().set(runConfigXml); irc.getExcludedLibraryPaths().set(excludedLibraryPaths); irc.getLaunchFile().set(runConfigFile); + configs.add(irc); } return configs; From 6b18a7b4b0a7a8d0e5d217d59c11313af15191e1 Mon Sep 17 00:00:00 2001 From: modmuss Date: Mon, 14 Oct 2024 19:55:49 +0100 Subject: [PATCH 08/11] Fix dependency source remapping + update Mercury (#1194) --- gradle/libs.versions.toml | 2 +- .../net/fabricmc/loom/task/service/LorenzMappingService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c807301c..0719412b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ tiny-remapper = "0.10.4" access-widener = "2.1.0" mapping-io = "0.6.1" lorenz-tiny = "4.0.2" -mercury = "0.4.1" +mercury = "0.4.2" kotlinx-metadata = "0.9.0" loom-native = "0.2.0" diff --git a/src/main/java/net/fabricmc/loom/task/service/LorenzMappingService.java b/src/main/java/net/fabricmc/loom/task/service/LorenzMappingService.java index efb065e3..40cc1b0b 100644 --- a/src/main/java/net/fabricmc/loom/task/service/LorenzMappingService.java +++ b/src/main/java/net/fabricmc/loom/task/service/LorenzMappingService.java @@ -55,8 +55,8 @@ public final class LorenzMappingService extends Service Date: Sat, 26 Oct 2024 18:43:49 +0100 Subject: [PATCH 09/11] Handle idea modules not using the project build path. (#1201) --- .../loom/util/gradle/SourceSetHelper.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/net/fabricmc/loom/util/gradle/SourceSetHelper.java b/src/main/java/net/fabricmc/loom/util/gradle/SourceSetHelper.java index 209703d6..a49cac45 100644 --- a/src/main/java/net/fabricmc/loom/util/gradle/SourceSetHelper.java +++ b/src/main/java/net/fabricmc/loom/util/gradle/SourceSetHelper.java @@ -128,6 +128,7 @@ public final class SourceSetHelper { final List classpath = getGradleClasspath(reference, project); classpath.addAll(getIdeaClasspath(reference, project)); + classpath.addAll(getIdeaModuleCompileOutput(reference)); classpath.addAll(getEclipseClasspath(reference, project)); classpath.addAll(getVscodeClasspath(reference, project)); @@ -192,6 +193,25 @@ public final class SourceSetHelper { return Collections.singletonList(outputDir); } + private static List getIdeaModuleCompileOutput(SourceSetReference reference) { + final File dotIdea = new File(reference.project().getRootDir(), ".idea"); + + if (!dotIdea.exists()) { + // Not an intellij project + return Collections.emptyList(); + } + + final String name = reference.sourceSet().getName(); + final File projectDir = reference.project().getProjectDir(); + final File outDir = new File(projectDir, "out"); + final File sourceSetOutDir = new File(outDir, name.equals(SourceSet.MAIN_SOURCE_SET_NAME) ? "production" : name); + + return List.of( + new File(sourceSetOutDir, "classes"), + new File(sourceSetOutDir, "resources") + ); + } + @Nullable private static String evaluateXpath(File file, @Language("xpath") String expression) { final XPath xpath = XPathFactory.newInstance().newXPath(); From 495aae338f60e9b7ff4d9d3a6bfcfc21fb9a65c7 Mon Sep 17 00:00:00 2001 From: modmuss Date: Fri, 1 Nov 2024 15:14:41 +0000 Subject: [PATCH 10/11] Fix #1205 (#1207) --- .../decompile/SplitDecompileConfiguration.java | 11 +++++++++-- .../loom/test/integration/SplitProjectTest.groovy | 13 +++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/decompile/SplitDecompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/decompile/SplitDecompileConfiguration.java index e47f7ddc..9735fdb7 100644 --- a/src/main/java/net/fabricmc/loom/configuration/decompile/SplitDecompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/decompile/SplitDecompileConfiguration.java @@ -79,12 +79,19 @@ public final class SplitDecompileConfiguration extends DecompileConfiguration { + task.mustRunAfter(commonTask); + }); + project.getTasks().register("genSourcesWith" + decompilerName, task -> { task.setDescription("Decompile minecraft using %s.".formatted(decompilerName)); task.setGroup(Constants.TaskGroup.FABRIC); - task.dependsOn(project.getTasks().named("gen%sSourcesWith%s".formatted("Common", decompilerName))); - task.dependsOn(project.getTasks().named("gen%sSourcesWith%s".formatted("ClientOnly", decompilerName))); + task.dependsOn(commonTask); + task.dependsOn(clientOnlyTask); }); } diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/SplitProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/SplitProjectTest.groovy index d0b476ca..4c21db61 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/SplitProjectTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/SplitProjectTest.groovy @@ -29,6 +29,7 @@ import spock.lang.Unroll import net.fabricmc.loom.test.util.GradleProjectTestTrait +import static net.fabricmc.loom.test.LoomTestConstants.PRE_RELEASE_GRADLE import static net.fabricmc.loom.test.LoomTestConstants.STANDARD_TEST_VERSIONS import static org.gradle.testkit.runner.TaskOutcome.SUCCESS @@ -48,4 +49,16 @@ class SplitProjectTest extends Specification implements GradleProjectTestTrait { where: version << STANDARD_TEST_VERSIONS } + + @Unroll + def "genSources (gradle #version)"() { + setup: + def gradle = gradleProject(project: "splitSources", version: PRE_RELEASE_GRADLE) + + when: + def result = gradle.run(tasks: ["genSources"]) + + then: + result.task(":genSources").outcome == SUCCESS + } } From 39e292fe40a29a58f3fe23402f1d5675d6861c42 Mon Sep 17 00:00:00 2001 From: modmuss Date: Tue, 26 Nov 2024 11:24:43 +0000 Subject: [PATCH 11/11] Cache source mappings (#1220) (#1221) --- .../MinecraftJarProcessorManager.java | 4 + .../task/service/SourceMappingsService.java | 86 +++++++++---------- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftJarProcessorManager.java b/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftJarProcessorManager.java index 39b63559..5f8809df 100644 --- a/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftJarProcessorManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/processors/MinecraftJarProcessorManager.java @@ -116,6 +116,10 @@ public final class MinecraftJarProcessorManager { return Checksum.sha1Hex(getCacheValue().getBytes(StandardCharsets.UTF_8)).substring(0, 10); } + public String getSourceMappingsHash() { + return Checksum.sha1Hex(getCacheValue().getBytes(StandardCharsets.UTF_8)); + } + public boolean requiresProcessingJar(Path jar) { Objects.requireNonNull(jar); diff --git a/src/main/java/net/fabricmc/loom/task/service/SourceMappingsService.java b/src/main/java/net/fabricmc/loom/task/service/SourceMappingsService.java index 9c178dd3..5173169e 100644 --- a/src/main/java/net/fabricmc/loom/task/service/SourceMappingsService.java +++ b/src/main/java/net/fabricmc/loom/task/service/SourceMappingsService.java @@ -31,13 +31,13 @@ import java.io.Writer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; import org.gradle.api.Project; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.InputFiles; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; @@ -56,6 +56,7 @@ import net.fabricmc.mappingio.tree.MemoryMappingTree; public class SourceMappingsService extends Service { public static final ServiceType TYPE = new ServiceType<>(Options.class, SourceMappingsService.class); + private static final Logger LOGGER = LoggerFactory.getLogger(SourceMappingsService.class); public interface Options extends Service.Options { @InputFiles @@ -71,64 +72,63 @@ public class SourceMappingsService extends Service mappingsProcessors = new ArrayList<>(); - - MinecraftJarProcessorManager minecraftJarProcessorManager = MinecraftJarProcessorManager.create(project); - - if (minecraftJarProcessorManager != null) { - mappingsProcessors.add(mappings -> { - try (var serviceFactory = new ScopedServiceFactory()) { - final var configContext = new ConfigContextImpl(project, serviceFactory, extension); - return minecraftJarProcessorManager.processMappings(mappings, new MappingProcessorContextImpl(configContext)); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - }); - } - - if (mappingsProcessors.isEmpty()) { - return inputMappings; - } - - boolean transformed = false; - - for (GenerateSourcesTask.MappingsProcessor mappingsProcessor : mappingsProcessors) { - if (mappingsProcessor.transform(mappingTree)) { - transformed = true; + GenerateSourcesTask.MappingsProcessor mappingsProcessor = mappings -> { + try (var serviceFactory = new ScopedServiceFactory()) { + final var configContext = new ConfigContextImpl(project, serviceFactory, extension); + return jarProcessor.processMappings(mappings, new MappingProcessorContextImpl(configContext)); + } catch (IOException e) { + throw new UncheckedIOException(e); } - } + }; + + boolean transformed = mappingsProcessor.transform(mappingTree); if (!transformed) { - return inputMappings; - } - - final Path outputMappings; - - try { - outputMappings = Files.createTempFile("loom-transitive-mappings", ".tiny"); - } catch (IOException e) { - throw new RuntimeException("Failed to create temp file", e); + LOGGER.info("No mappings processors transformed the mappings"); } try (Writer writer = Files.newBufferedWriter(outputMappings, StandardCharsets.UTF_8)) { var tiny2Writer = new Tiny2FileWriter(writer, false); mappingTree.accept(new MappingSourceNsSwitch(tiny2Writer, MappingsNamespace.NAMED.toString())); - } catch (IOException e) { - throw new RuntimeException("Failed to write mappings", e); } - - return outputMappings; } public SourceMappingsService(Options options, ServiceFactory serviceFactory) {