diff --git a/src/main/java/net/neoforged/moddevgradle/internal/PrepareRunOrTest.java b/src/main/java/net/neoforged/moddevgradle/internal/PrepareRunOrTest.java index 4270cb73..d446a364 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/PrepareRunOrTest.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/PrepareRunOrTest.java @@ -15,6 +15,7 @@ import net.neoforged.moddevgradle.internal.utils.OperatingSystem; import net.neoforged.moddevgradle.internal.utils.StringUtils; import net.neoforged.moddevgradle.internal.utils.VersionCapabilitiesInternal; +import net.neoforged.nfrtgradle.DownloadedAssetsReference; import org.gradle.api.DefaultTask; import org.gradle.api.GradleException; import org.gradle.api.file.ConfigurableFileCollection; @@ -274,7 +275,7 @@ private void writeProgramArguments(UserDevRunType runConfig, @Nullable String ma } lines.add("# NeoForge Run-Type Program Arguments"); - var assetProperties = RunUtils.loadAssetProperties(getAssetProperties().get().getAsFile()); + var assetProperties = DownloadedAssetsReference.loadProperties(getAssetProperties().get().getAsFile()); List args = runConfig.args(); for (String arg : args) { switch (arg) { diff --git a/src/main/java/net/neoforged/moddevgradle/internal/RunUtils.java b/src/main/java/net/neoforged/moddevgradle/internal/RunUtils.java index a7e46922..5771ead4 100644 --- a/src/main/java/net/neoforged/moddevgradle/internal/RunUtils.java +++ b/src/main/java/net/neoforged/moddevgradle/internal/RunUtils.java @@ -1,17 +1,13 @@ package net.neoforged.moddevgradle.internal; -import java.io.BufferedInputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Properties; import java.util.Set; import java.util.function.BiConsumer; import java.util.stream.Collectors; @@ -62,25 +58,6 @@ public static Provider getRequiredType(Project project, RunModel runMode })); } - public static AssetProperties loadAssetProperties(File file) { - Properties assetProperties = new Properties(); - try (var input = new BufferedInputStream(new FileInputStream(file))) { - assetProperties.load(input); - } catch (IOException e) { - throw new UncheckedIOException("Failed to load asset properties", e); - } - if (!assetProperties.containsKey("assets_root")) { - throw new IllegalStateException("Asset properties file does not contain assets_root"); - } - if (!assetProperties.containsKey("asset_index")) { - throw new IllegalStateException("Asset properties file does not contain asset_index"); - } - - return new AssetProperties( - assetProperties.getProperty("asset_index"), - assetProperties.getProperty("assets_root")); - } - public static void writeLog4j2Configuration(Level rootLevel, Path destination) throws IOException { Files.writeString(destination, """ @@ -290,8 +267,6 @@ public static Provider> buildModFolders(Project project, } } -record AssetProperties(String assetIndex, String assetsRoot) {} - abstract class ModFoldersProvider implements CommandLineArgumentProvider { @Inject public ModFoldersProvider() { diff --git a/src/main/java/net/neoforged/nfrtgradle/DownloadAssets.java b/src/main/java/net/neoforged/nfrtgradle/DownloadAssets.java index 49cbf3a3..4d9ab1d6 100644 --- a/src/main/java/net/neoforged/nfrtgradle/DownloadAssets.java +++ b/src/main/java/net/neoforged/nfrtgradle/DownloadAssets.java @@ -1,10 +1,13 @@ package net.neoforged.nfrtgradle; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import javax.inject.Inject; import org.gradle.api.GradleException; +import org.gradle.api.Task; import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.logging.Logger; import org.gradle.api.provider.Property; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Optional; @@ -21,7 +24,9 @@ @ApiStatus.NonExtendable public abstract class DownloadAssets extends NeoFormRuntimeTask { @Inject - public DownloadAssets() {} + public DownloadAssets() { + getOutputs().upToDateWhen(DownloadAssets::checkAssetValidity); + } /** * Gradle dependency notation for the NeoForm data artifact, from which a Minecraft version will be derived. @@ -109,4 +114,37 @@ public void downloadAssets() { run(args); } + + private static boolean checkAssetValidity(Task task) { + var downloadTask = (DownloadAssets) task; + var logger = downloadTask.getLogger(); + + var assetReferenceFile = downloadTask.getAssetPropertiesFile(); + if (assetReferenceFile.isPresent()) { + DownloadedAssetsReference assetReference; + try { + assetReference = DownloadedAssetsReference.loadProperties(assetReferenceFile.getAsFile().get()); + } catch (Exception e) { + logger.error("Failed to read downloaded asset index: {}", assetReferenceFile); + return false; + } + return validateAssetReference(assetReference, logger); + } + + return true; + } + + private static boolean validateAssetReference(DownloadedAssetsReference assetReference, Logger logger) { + File assetRoot = new File(assetReference.assetsRoot()); + if (!assetRoot.isDirectory()) { + logger.info("Downloaded assets directory has gone missing: {}", assetRoot); + return false; + } + File assetIndex = new File(assetRoot, "indexes/" + assetReference.assetIndex() + ".json"); + if (!assetIndex.isFile()) { + logger.info("Downloaded assets index has gone missing: {}", assetIndex); + return false; + } + return true; + } } diff --git a/src/main/java/net/neoforged/nfrtgradle/DownloadedAssetsReference.java b/src/main/java/net/neoforged/nfrtgradle/DownloadedAssetsReference.java new file mode 100644 index 00000000..6c6f165a --- /dev/null +++ b/src/main/java/net/neoforged/nfrtgradle/DownloadedAssetsReference.java @@ -0,0 +1,29 @@ +package net.neoforged.nfrtgradle; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.Properties; + +public record DownloadedAssetsReference(String assetIndex, String assetsRoot) { + public static DownloadedAssetsReference loadProperties(File file) { + Properties assetProperties = new Properties(); + try (var input = new BufferedInputStream(new FileInputStream(file))) { + assetProperties.load(input); + } catch (IOException e) { + throw new UncheckedIOException("Failed to load asset properties", e); + } + if (!assetProperties.containsKey("assets_root")) { + throw new IllegalStateException("Asset properties file does not contain assets_root"); + } + if (!assetProperties.containsKey("asset_index")) { + throw new IllegalStateException("Asset properties file does not contain asset_index"); + } + + return new DownloadedAssetsReference( + assetProperties.getProperty("asset_index"), + assetProperties.getProperty("assets_root")); + } +}