Skip to content

Commit c9f6dbc

Browse files
covers1624shartteTechnici4n
authored
Copy published data files prior to publishing. (#228)
Co-authored-by: Sebastian Hartte <[email protected]> Co-authored-by: Technici4n <[email protected]>
1 parent 4bd8be7 commit c9f6dbc

File tree

3 files changed

+107
-4
lines changed

3 files changed

+107
-4
lines changed

src/main/java/net/neoforged/moddevgradle/internal/DataFileCollections.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import java.util.function.Consumer;
55
import net.neoforged.moddevgradle.dsl.DataFileCollection;
66
import net.neoforged.moddevgradle.internal.utils.ExtensionUtils;
7+
import net.neoforged.moddevgradle.internal.utils.StringUtils;
8+
import net.neoforged.moddevgradle.tasks.CopyDataFile;
79
import org.gradle.api.Project;
810
import org.gradle.api.artifacts.ConfigurablePublishArtifact;
911
import org.gradle.api.artifacts.Configuration;
@@ -93,15 +95,32 @@ private static CollectionWrapper createCollection(Project project, String name,
9395
}
9496
});
9597

98+
var copyTaskName = "copy" + StringUtils.capitalize(name) + "Publications";
99+
var copyTask = project.getTasks().register(copyTaskName, CopyDataFile.class);
100+
96101
var depFactory = project.getDependencyFactory();
97102
Consumer<Object> publishCallback = new Consumer<>() {
98103
ConfigurablePublishArtifact firstArtifact;
99104
int artifactCount;
100105

101106
@Override
102107
public void accept(Object artifactNotation) {
103-
elementsConfiguration.getDependencies().add(depFactory.create(project.files(artifactNotation)));
104-
project.getArtifacts().add(elementsConfiguration.getName(), artifactNotation, artifact -> {
108+
// Create a temporary artifact to resolve file and task dependencies.
109+
var dummyArtifact = project.getArtifacts().add(elementsConfiguration.getName(), artifactNotation);
110+
111+
var artifactFile = dummyArtifact.getFile();
112+
var artifactDependencies = dummyArtifact.getBuildDependencies();
113+
elementsConfiguration.getArtifacts().remove(dummyArtifact);
114+
115+
var copyOutput = project.getLayout().getBuildDirectory().file(copyTaskName + "/" + artifactCount + "-" + artifactFile.getName());
116+
copyTask.configure(t -> {
117+
t.dependsOn(artifactDependencies);
118+
t.getInputFiles().add(project.getLayout().file(project.provider(() -> artifactFile)));
119+
t.getOutputFiles().add(copyOutput);
120+
});
121+
122+
project.getArtifacts().add(elementsConfiguration.getName(), copyOutput, artifact -> {
123+
artifact.builtBy(copyTask);
105124
if (firstArtifact == null) {
106125
firstArtifact = artifact;
107126
artifact.setClassifier(category);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package net.neoforged.moddevgradle.tasks;
2+
3+
import java.io.IOException;
4+
import java.nio.file.Files;
5+
import java.nio.file.StandardCopyOption;
6+
import org.gradle.api.DefaultTask;
7+
import org.gradle.api.file.RegularFile;
8+
import org.gradle.api.provider.ListProperty;
9+
import org.gradle.api.tasks.InputFiles;
10+
import org.gradle.api.tasks.OutputFiles;
11+
import org.gradle.api.tasks.TaskAction;
12+
13+
public abstract class CopyDataFile extends DefaultTask {
14+
@InputFiles
15+
public abstract ListProperty<RegularFile> getInputFiles();
16+
17+
@OutputFiles
18+
public abstract ListProperty<RegularFile> getOutputFiles();
19+
20+
@TaskAction
21+
public void doCopy() throws IOException {
22+
var inputs = getInputFiles().get();
23+
var outputs = getOutputFiles().get();
24+
if (inputs.size() != outputs.size()) throw new RuntimeException("Lists length dont match.");
25+
26+
for (int i = 0; i < inputs.size(); i++) {
27+
var in = inputs.get(i).getAsFile().toPath();
28+
var out = outputs.get(i).getAsFile().toPath();
29+
Files.createDirectories(out.getParent());
30+
Files.copy(in, out, StandardCopyOption.REPLACE_EXISTING);
31+
}
32+
}
33+
}

src/test/java/net/neoforged/moddevgradle/functional/DataFileCollectionFunctionalTest.java

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.nio.file.Files;
1212
import java.util.HashMap;
1313
import java.util.Map;
14+
import java.util.stream.Collectors;
15+
import java.util.stream.Stream;
1416
import org.gradle.testkit.runner.GradleRunner;
1517
import org.gradle.testkit.runner.TaskOutcome;
1618
import org.intellij.lang.annotations.Language;
@@ -37,6 +39,50 @@ public void testPublishAccessTransformerFile() throws IOException {
3739
entry("publish-at-1.0-accesstransformer.cfg", "# hello world"));
3840
}
3941

42+
@Test
43+
public void testPublishSignedAccessTransformerFileDoesntProduceGarbageNextToTheFile() throws IOException {
44+
var atFile = testProjectDir.toPath().resolve("accesstransformer.cfg");
45+
Files.writeString(atFile, "# hello world");
46+
47+
publishDataFiles("test", "publish-at", "1.0", """
48+
neoForge {
49+
accessTransformers {
50+
publish(project.file("accesstransformer.cfg"))
51+
}
52+
}
53+
signing {
54+
useInMemoryPgpKeys(
55+
""\"
56+
-----BEGIN PGP PRIVATE KEY BLOCK-----
57+
58+
lIYEZ50OURYJKwYBBAHaRw8BAQdAjVNqyWTfusmnT3/pNNmjmG9AfOFL8YbFUXCo
59+
PZO3dCj+BwMCZ5yIZTjHa2r/WIUWn/nr1+5CLJOI1xzscxZOq6Vyvh9m3TWgPKWh
60+
iW/MM/tGGvOnFt4qD+WNYNaHo3GtbG+KoK0584Ddon60yFEAPCdAUrQXTURHIDxt
61+
ZGdAbmVvZm9yZ2VkLm5ldD6IkwQTFgoAOxYhBN0jxfacUTgqiXj3CnkqaxjDscQa
62+
BQJnnQ5RAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEHkqaxjDscQa
63+
93YA/ix1FkHrtF+VglGcSBGUvtqfiBzYPvwrazNdURxCZpaVAP4zWPYtbDJP14dP
64+
s8I/jILSUfE61lVl6Y74tpiEvNm8Bg==
65+
=3g5S
66+
-----END PGP PRIVATE KEY BLOCK-----
67+
""\",
68+
"123456"
69+
)
70+
sign publishing.publications.maven
71+
}
72+
""", "signing");
73+
74+
assertThat(atFile.resolveSibling(atFile.getFileName() + ".asc"))
75+
.doesNotExist();
76+
var copiedFile = testProjectDir.toPath()
77+
.resolve("build/copyAccessTransformersPublications/0-accesstransformer.cfg");
78+
assertThat(copiedFile)
79+
.hasSameTextualContentAs(atFile);
80+
assertThat(copiedFile.resolveSibling(copiedFile.getFileName() + ".asc"))
81+
.exists();
82+
assertThat(consumeDataFilePublication("accessTransformers", "test:publish-at:1.0")).containsOnly(
83+
entry("publish-at-1.0-accesstransformer.cfg", "# hello world"));
84+
}
85+
4086
@Test
4187
public void testPublishInterfaceInjectionFile() throws IOException {
4288
writeProjectFile("interfaces.json", "[]");
@@ -126,7 +172,11 @@ private Map<String, String> consumeDataFilePublication(String configurationName,
126172
private void publishDataFiles(String groupId,
127173
String artifactId,
128174
String version,
129-
@Language("groovy") String buildScriptBody) throws IOException {
175+
@Language("groovy") String buildScriptBody,
176+
String... extraPlugins) throws IOException {
177+
String extraPluginLines = Stream.of(extraPlugins)
178+
.map("id \"%s\""::formatted)
179+
.collect(Collectors.joining("\n"));
130180
writeGroovySettingsScript("""
131181
plugins {
132182
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
@@ -137,6 +187,7 @@ private void publishDataFiles(String groupId,
137187
plugins {
138188
id "net.neoforged.moddev"
139189
id "maven-publish"
190+
{4}
140191
}
141192
group = "{0}"
142193
version = "{1}"
@@ -156,7 +207,7 @@ url file("{3}")
156207
}
157208
}
158209
{2}
159-
""", groupId, version, buildScriptBody, publicationTarget);
210+
""", groupId, version, buildScriptBody, publicationTarget, extraPluginLines);
160211

161212
var result = GradleRunner.create()
162213
.withPluginClasspath()

0 commit comments

Comments
 (0)