From a477a718ed70a468ed8fd2946165624fd907ebe5 Mon Sep 17 00:00:00 2001 From: Juuz <6596629+Juuxel@users.noreply.github.com> Date: Wed, 5 Mar 2025 00:07:52 +0200 Subject: [PATCH] RemapJarTask: Delete output if it exists to prevent ghost files (#1271) * RemapJarTask: Delete output if it exists to prevent ghost files Fixes #1270. This changed isn't necessary for RemapSourcesJarTask as SourceRemapperService already deletes the output. * Add a test for #1270 * Move DeletedResourceTest inside SimpleProjectTest --- .../net/fabricmc/loom/task/RemapJarTask.java | 3 ++ .../test/integration/SimpleProjectTest.groovy | 29 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index bf09aaed..3a51a33e 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -230,6 +230,9 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { Objects.requireNonNull(tinyRemapperService, "tinyRemapperService"); Objects.requireNonNull(tinyRemapper, "tinyRemapper"); + // Delete the old file to prevent deleted contents from sticking around in the jar. + Files.deleteIfExists(outputFile); + try (OutputConsumerPath outputConsumer = new OutputConsumerPath.Builder(outputFile).build()) { outputConsumer.addNonClassFiles(inputFile); tinyRemapper.apply(outputConsumer, tinyRemapperService.getOrCreateTag(inputFile)); diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/SimpleProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/SimpleProjectTest.groovy index 6c7edec0..888c0d7d 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/SimpleProjectTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/SimpleProjectTest.groovy @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2016-2021 FabricMC + * Copyright (c) 2016-2025 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 @@ -100,4 +100,31 @@ class SimpleProjectTest extends Specification implements GradleProjectTestTrait !result.output.contains("[WARN] [MIXIN]") // Assert that tiny remapper didnt not have any warnings when remapping gradle.getOutputZipEntry("fabric-example-mod-1.0.0.jar", "META-INF/MANIFEST.MF").contains("Fabric-Loom-Version: 0.0.0+unknown") } + + // Tests that deleted files don't remain in built jars after a rebuild. + // See https://github.com/FabricMC/fabric-loom/issues/1270. + @Unroll + def "deleted files disappear from jars (gradle #version)"() { + // Initial conditions: a project with a resource file to delete. + setup: + def gradle = gradleProject(project: "simple", version: version) + def deletedFile = new File(gradle.projectDir, "src/main/resources/foo.txt") + deletedFile.text = "hello, world!" + gradle.run(task: "build") + + when: + // Delete the resource, then run another build. + deletedFile.delete() + def result = gradle.run(task: "build") + + then: + result.task(":build").outcome == SUCCESS + !gradle.hasOutputZipEntry("fabric-example-mod-1.0.0.jar", "foo.txt") + !gradle.hasOutputZipEntry("fabric-example-mod-1.0.0-sources.jar", "foo.txt") + !gradle.hasOutputZipEntry("fabric-example-mod-1.0.0-no-remap.jar", "foo.txt") + !gradle.hasOutputZipEntry("fabric-example-mod-1.0.0-no-remap-sources.jar", "foo.txt") + + where: + version << STANDARD_TEST_VERSIONS + } }