Skip to content

Commit 97cb57d

Browse files
authored
Hand SlimeLauncher the extracted metadata zip, cache extraction (#1084)
- Avoids needing to re-extract it every launch from SlimeLauncher's end - Zip extraction is now cached by Gradle's build cache feature across builds with the same metadata zip Also bumped Mavenizer to fix maven metadata cache miss
1 parent 8ae1fa8 commit 97cb57d

4 files changed

Lines changed: 34 additions & 24 deletions

File tree

src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherEclipseConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ static TaskProvider<SlimeLauncherEclipseConfiguration> register(Project project,
137137

138138
task.getCacheDir().set(task.getObjects().directoryProperty().value(task.globalCaches().dir("slime-launcher/cache/%s".formatted(mcdep.getPath())).map(task.problems.ensureFileLocation())));
139139
task.getLocalCacheDir().set(task.getObjects().directoryProperty().value(task.localCaches().dir("slime-launcher/cache/%s".formatted(task.getName())).map(task.problems.ensureFileLocation())));
140-
task.getMetadata().setFrom(metadata.map(SlimeLauncherMetadata::getMetadata));
140+
task.getMetadata().setFrom(metadata.map(SlimeLauncherMetadata::getOutputDirectory));
141141
task.getRunsJson().set(metadata.flatMap(SlimeLauncherMetadata::getRunsJson));
142142

143143
task.getOptions().set(options);

src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherExec.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ static TaskProvider<SlimeLauncherExec> register(Project project, SourceSet sourc
6161

6262
task.getCacheDir().set(task.getObjectFactory().directoryProperty().value(task.globalCaches().dir("slime-launcher/cache/%s".formatted(mcdep.getPath())).map(task.problems.ensureFileLocation())));
6363
task.getLocalCacheDir().set(task.getObjectFactory().directoryProperty().value(task.localCaches().dir("slime-launcher/cache/%s".formatted(task.getName())).map(task.problems.ensureFileLocation())));
64-
task.getMetadata().setFrom(metadata.map(SlimeLauncherMetadata::getMetadata));
64+
task.getMetadata().setFrom(metadata.map(SlimeLauncherMetadata::getOutputDirectory));
6565
task.getRunsJson().set(metadata.flatMap(SlimeLauncherMetadata::getRunsJson));
6666

6767
task.getOptions().set(options);

src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherMetadata.java

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,26 @@
66

77
import org.gradle.api.DefaultTask;
88
import org.gradle.api.Project;
9+
import org.gradle.api.file.ArchiveOperations;
910
import org.gradle.api.file.ConfigurableFileCollection;
11+
import org.gradle.api.file.DirectoryProperty;
12+
import org.gradle.api.file.FileSystemOperations;
1013
import org.gradle.api.file.RegularFileProperty;
14+
import org.gradle.api.tasks.CacheableTask;
1115
import org.gradle.api.tasks.InputFiles;
16+
import org.gradle.api.tasks.OutputDirectory;
1217
import org.gradle.api.tasks.OutputFile;
18+
import org.gradle.api.tasks.PathSensitive;
19+
import org.gradle.api.tasks.PathSensitivity;
1320
import org.gradle.api.tasks.TaskAction;
1421
import org.gradle.api.tasks.TaskProvider;
1522

1623
import javax.inject.Inject;
17-
import java.io.FileInputStream;
1824
import java.io.IOException;
1925
import java.nio.charset.StandardCharsets;
2026
import java.nio.file.Files;
21-
import java.nio.file.StandardCopyOption;
22-
import java.util.zip.ZipEntry;
23-
import java.util.zip.ZipInputStream;
2427

28+
@CacheableTask
2529
abstract class SlimeLauncherMetadata extends DefaultTask implements ForgeGradleTask {
2630
static TaskProvider<SlimeLauncherMetadata> register(Project project, MinecraftDependencyInternal mcdep) {
2731
var taskName = "slimeLauncherMetadataFor" + Util.dependencyToCamelCase(mcdep.getModule());
@@ -31,35 +35,41 @@ static TaskProvider<SlimeLauncherMetadata> register(Project project, MinecraftDe
3135
});
3236
}
3337

38+
@PathSensitive(PathSensitivity.NONE)
3439
protected abstract @InputFiles ConfigurableFileCollection getMetadata();
3540

41+
protected abstract @OutputDirectory DirectoryProperty getOutputDirectory();
42+
3643
protected abstract @OutputFile RegularFileProperty getRunsJson();
3744

45+
protected abstract @Inject ArchiveOperations getArchiveOperations();
46+
47+
protected abstract @Inject FileSystemOperations getFileSystemOperations();
48+
3849
@Inject
3950
public SlimeLauncherMetadata() {
40-
this.getRunsJson().convention(this.getDefaultOutputDirectory().map(d -> d.file("runs.json")));
51+
this.getOutputDirectory().convention(this.getDefaultOutputDirectory());
52+
this.getRunsJson().convention(
53+
this.getOutputDirectory().map(d -> d.dir("launcher").file("runs.json"))
54+
);
4155
}
4256

4357
@TaskAction
4458
protected void exec() throws IOException {
4559
var archive = this.getMetadata().getSingleFile();
46-
var json = this.getRunsJson().getAsFile().get().toPath();
60+
var outputDir = this.getOutputDirectory().get();
4761

48-
boolean foundRuns = false;
49-
try (var zin = new ZipInputStream(new FileInputStream(archive))) {
50-
for (ZipEntry entry; ((entry = zin.getNextEntry()) != null); ) {
51-
if (!entry.getName().startsWith("launcher/"))
52-
continue;
53-
if (entry.getName().equals("launcher/runs.json")) {
54-
Files.copy(zin, json, StandardCopyOption.REPLACE_EXISTING);
55-
foundRuns = true;
56-
}
57-
}
58-
}
62+
this.getFileSystemOperations().sync(spec -> {
63+
spec.from(this.getArchiveOperations().zipTree(archive));
64+
spec.into(outputDir);
65+
});
5966

60-
// If we don't find a metadata file, write an empty runs
61-
// This happens when using a 'vanilla' minecraft dependency
62-
if (!foundRuns)
67+
// Write an empty runs.json if it doesn't exist
68+
// This happens when using a 'vanilla' Minecraft dependency
69+
var json = this.getRunsJson().getAsFile().get().toPath();
70+
if (!Files.exists(json)) {
71+
Files.createDirectories(json.getParent());
6372
Files.writeString(json, "{}", StandardCharsets.UTF_8);
73+
}
6474
}
6575
}

src/main/java/net/minecraftforge/gradle/internal/Tools.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
final class Tools {
1010
private Tools() { }
1111

12-
static final Tool SLIMELAUNCHER = Tool.ofForge("slimelauncher", "net.minecraftforge:slime-launcher:0.2.2", 8, "net.minecraftforge.launcher.Main");
12+
static final Tool SLIMELAUNCHER = Tool.ofForge("slimelauncher", "net.minecraftforge:slime-launcher:0.2.3", 8, "net.minecraftforge.launcher.Main");
1313

14-
static final Tool MAVENIZER = Tool.ofForge("mavenizer", "net.minecraftforge:minecraft-mavenizer:0.5.19", 25, "net.minecraftforge.mcmaven.cli.Main");
14+
static final Tool MAVENIZER = Tool.ofForge("mavenizer", "net.minecraftforge:minecraft-mavenizer:0.5.21", 25, "net.minecraftforge.mcmaven.cli.Main");
1515
}

0 commit comments

Comments
 (0)