Skip to content

Commit 46c7224

Browse files
authored
Redownload Assets if the referenced asset files have gone missing (#233)
1 parent c9f6dbc commit 46c7224

File tree

4 files changed

+70
-27
lines changed

4 files changed

+70
-27
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.neoforged.moddevgradle.internal.utils.OperatingSystem;
1616
import net.neoforged.moddevgradle.internal.utils.StringUtils;
1717
import net.neoforged.moddevgradle.internal.utils.VersionCapabilitiesInternal;
18+
import net.neoforged.nfrtgradle.DownloadedAssetsReference;
1819
import org.gradle.api.DefaultTask;
1920
import org.gradle.api.GradleException;
2021
import org.gradle.api.file.ConfigurableFileCollection;
@@ -274,7 +275,7 @@ private void writeProgramArguments(UserDevRunType runConfig, @Nullable String ma
274275
}
275276

276277
lines.add("# NeoForge Run-Type Program Arguments");
277-
var assetProperties = RunUtils.loadAssetProperties(getAssetProperties().get().getAsFile());
278+
var assetProperties = DownloadedAssetsReference.loadProperties(getAssetProperties().get().getAsFile());
278279
List<String> args = runConfig.args();
279280
for (String arg : args) {
280281
switch (arg) {

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

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
package net.neoforged.moddevgradle.internal;
22

3-
import java.io.BufferedInputStream;
43
import java.io.File;
5-
import java.io.FileInputStream;
64
import java.io.IOException;
7-
import java.io.UncheckedIOException;
85
import java.nio.file.Files;
96
import java.nio.file.Path;
107
import java.util.HashMap;
118
import java.util.List;
129
import java.util.Map;
1310
import java.util.Optional;
14-
import java.util.Properties;
1511
import java.util.Set;
1612
import java.util.function.BiConsumer;
1713
import java.util.stream.Collectors;
@@ -62,25 +58,6 @@ public static Provider<String> getRequiredType(Project project, RunModel runMode
6258
}));
6359
}
6460

65-
public static AssetProperties loadAssetProperties(File file) {
66-
Properties assetProperties = new Properties();
67-
try (var input = new BufferedInputStream(new FileInputStream(file))) {
68-
assetProperties.load(input);
69-
} catch (IOException e) {
70-
throw new UncheckedIOException("Failed to load asset properties", e);
71-
}
72-
if (!assetProperties.containsKey("assets_root")) {
73-
throw new IllegalStateException("Asset properties file does not contain assets_root");
74-
}
75-
if (!assetProperties.containsKey("asset_index")) {
76-
throw new IllegalStateException("Asset properties file does not contain asset_index");
77-
}
78-
79-
return new AssetProperties(
80-
assetProperties.getProperty("asset_index"),
81-
assetProperties.getProperty("assets_root"));
82-
}
83-
8461
public static void writeLog4j2Configuration(Level rootLevel, Path destination) throws IOException {
8562
Files.writeString(destination, """
8663
<?xml version="1.0" encoding="UTF-8"?>
@@ -290,8 +267,6 @@ public static Provider<Map<String, ModFolder>> buildModFolders(Project project,
290267
}
291268
}
292269

293-
record AssetProperties(String assetIndex, String assetsRoot) {}
294-
295270
abstract class ModFoldersProvider implements CommandLineArgumentProvider {
296271
@Inject
297272
public ModFoldersProvider() {

src/main/java/net/neoforged/nfrtgradle/DownloadAssets.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package net.neoforged.nfrtgradle;
22

3+
import java.io.File;
34
import java.util.ArrayList;
45
import java.util.Collections;
56
import javax.inject.Inject;
67
import org.gradle.api.GradleException;
8+
import org.gradle.api.Task;
79
import org.gradle.api.file.RegularFileProperty;
10+
import org.gradle.api.logging.Logger;
811
import org.gradle.api.provider.Property;
912
import org.gradle.api.tasks.Input;
1013
import org.gradle.api.tasks.Optional;
@@ -21,7 +24,9 @@
2124
@ApiStatus.NonExtendable
2225
public abstract class DownloadAssets extends NeoFormRuntimeTask {
2326
@Inject
24-
public DownloadAssets() {}
27+
public DownloadAssets() {
28+
getOutputs().upToDateWhen(DownloadAssets::checkAssetValidity);
29+
}
2530

2631
/**
2732
* Gradle dependency notation for the NeoForm data artifact, from which a Minecraft version will be derived.
@@ -109,4 +114,37 @@ public void downloadAssets() {
109114

110115
run(args);
111116
}
117+
118+
private static boolean checkAssetValidity(Task task) {
119+
var downloadTask = (DownloadAssets) task;
120+
var logger = downloadTask.getLogger();
121+
122+
var assetReferenceFile = downloadTask.getAssetPropertiesFile();
123+
if (assetReferenceFile.isPresent()) {
124+
DownloadedAssetsReference assetReference;
125+
try {
126+
assetReference = DownloadedAssetsReference.loadProperties(assetReferenceFile.getAsFile().get());
127+
} catch (Exception e) {
128+
logger.error("Failed to read downloaded asset index: {}", assetReferenceFile);
129+
return false;
130+
}
131+
return validateAssetReference(assetReference, logger);
132+
}
133+
134+
return true;
135+
}
136+
137+
private static boolean validateAssetReference(DownloadedAssetsReference assetReference, Logger logger) {
138+
File assetRoot = new File(assetReference.assetsRoot());
139+
if (!assetRoot.isDirectory()) {
140+
logger.info("Downloaded assets directory has gone missing: {}", assetRoot);
141+
return false;
142+
}
143+
File assetIndex = new File(assetRoot, "indexes/" + assetReference.assetIndex() + ".json");
144+
if (!assetIndex.isFile()) {
145+
logger.info("Downloaded assets index has gone missing: {}", assetIndex);
146+
return false;
147+
}
148+
return true;
149+
}
112150
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package net.neoforged.nfrtgradle;
2+
3+
import java.io.BufferedInputStream;
4+
import java.io.File;
5+
import java.io.FileInputStream;
6+
import java.io.IOException;
7+
import java.io.UncheckedIOException;
8+
import java.util.Properties;
9+
10+
public record DownloadedAssetsReference(String assetIndex, String assetsRoot) {
11+
public static DownloadedAssetsReference loadProperties(File file) {
12+
Properties assetProperties = new Properties();
13+
try (var input = new BufferedInputStream(new FileInputStream(file))) {
14+
assetProperties.load(input);
15+
} catch (IOException e) {
16+
throw new UncheckedIOException("Failed to load asset properties", e);
17+
}
18+
if (!assetProperties.containsKey("assets_root")) {
19+
throw new IllegalStateException("Asset properties file does not contain assets_root");
20+
}
21+
if (!assetProperties.containsKey("asset_index")) {
22+
throw new IllegalStateException("Asset properties file does not contain asset_index");
23+
}
24+
25+
return new DownloadedAssetsReference(
26+
assetProperties.getProperty("asset_index"),
27+
assetProperties.getProperty("assets_root"));
28+
}
29+
}

0 commit comments

Comments
 (0)