diff --git a/src/main/java/dev/architectury/loom/metadata/ModMetadataFiles.java b/src/main/java/dev/architectury/loom/metadata/ModMetadataFiles.java index 519339a2..ab98500f 100644 --- a/src/main/java/dev/architectury/loom/metadata/ModMetadataFiles.java +++ b/src/main/java/dev/architectury/loom/metadata/ModMetadataFiles.java @@ -23,8 +23,8 @@ import net.fabricmc.loom.util.gradle.SourceSetHelper; public final class ModMetadataFiles { private static final Logger LOGGER = Logging.getLogger(ModMetadataFiles.class); private static final Map> SINGLE_FILE_METADATA_TYPES = ImmutableMap.>builder() - .put(ArchitecturyCommonJson.FILE_NAME, ArchitecturyCommonJson::of) .put(QuiltModJson.FILE_NAME, QuiltModJson::of) + .put(ArchitecturyCommonJson.FILE_NAME, ArchitecturyCommonJson::of) .put(ModsToml.FILE_PATH, onError(ModsToml::of, "Could not load mods.toml", () -> new ErroringModMetadataFile("mods.toml"))) .build(); diff --git a/src/main/java/net/fabricmc/loom/util/fmj/FabricModJsonFactory.java b/src/main/java/net/fabricmc/loom/util/fmj/FabricModJsonFactory.java index f0ed534c..21653eee 100644 --- a/src/main/java/net/fabricmc/loom/util/fmj/FabricModJsonFactory.java +++ b/src/main/java/net/fabricmc/loom/util/fmj/FabricModJsonFactory.java @@ -72,35 +72,28 @@ public final class FabricModJsonFactory { } public static FabricModJson createFromZip(Path zipPath) { - try { - @Nullable ModMetadataFile modMetadata = ModMetadataFiles.fromJar(zipPath); - - if (modMetadata != null) { - return new ModMetadataFabricModJson(modMetadata, new FabricModJsonSource.ZipSource(zipPath)); - } - } catch (IOException e) { - throw new UncheckedIOException("Failed to read mod metadata file in zip: " + zipPath, e); - } - try { return create(ZipUtils.unpackGson(zipPath, FABRIC_MOD_JSON, JsonObject.class), new FabricModJsonSource.ZipSource(zipPath)); } catch (IOException e) { + // Try another mod metadata file if fabric.mod.json wasn't found. + try { + @Nullable ModMetadataFile modMetadata = ModMetadataFiles.fromJar(zipPath); + + if (modMetadata != null) { + return new ModMetadataFabricModJson(modMetadata, new FabricModJsonSource.ZipSource(zipPath)); + } + } catch (IOException e2) { + var unchecked = new UncheckedIOException("Failed to read mod metadata file in zip: " + zipPath, e2); + unchecked.addSuppressed(e); + throw unchecked; + } + throw new UncheckedIOException("Failed to read fabric.mod.json file in zip: " + zipPath, e); } } @Nullable public static FabricModJson createFromZipNullable(Path zipPath) { - try { - final @Nullable ModMetadataFile modMetadata = ModMetadataFiles.fromJar(zipPath); - - if (modMetadata != null) { - return new ModMetadataFabricModJson(modMetadata, new FabricModJsonSource.ZipSource(zipPath)); - } - } catch (IOException e) { - throw new UncheckedIOException("Failed to read mod metadata file in zip: " + zipPath, e); - } - JsonObject jsonObject; try { @@ -110,6 +103,17 @@ public final class FabricModJsonFactory { } if (jsonObject == null) { + // Try another mod metadata file if fabric.mod.json wasn't found. + try { + final @Nullable ModMetadataFile modMetadata = ModMetadataFiles.fromJar(zipPath); + + if (modMetadata != null) { + return new ModMetadataFabricModJson(modMetadata, new FabricModJsonSource.ZipSource(zipPath)); + } + } catch (IOException e) { + throw new UncheckedIOException("Failed to read mod metadata file in zip: " + zipPath, e); + } + return null; } @@ -121,14 +125,17 @@ public final class FabricModJsonFactory { } public static FabricModJson createFromDirectory(Path directory) throws IOException { - final @Nullable ModMetadataFile modMetadata = ModMetadataFiles.fromDirectory(directory); - - if (modMetadata != null) { - return new ModMetadataFabricModJson(modMetadata, new FabricModJsonSource.DirectorySource(directory)); - } - final Path path = directory.resolve(FABRIC_MOD_JSON); + // Try another mod metadata file if fabric.mod.json wasn't found. + if (Files.notExists(path)) { + final @Nullable ModMetadataFile modMetadata = ModMetadataFiles.fromDirectory(directory); + + if (modMetadata != null) { + return new ModMetadataFabricModJson(modMetadata, new FabricModJsonSource.DirectorySource(directory)); + } + } + try (Reader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) { return create(LoomGradlePlugin.GSON.fromJson(reader, JsonObject.class), new FabricModJsonSource.DirectorySource(directory)); } @@ -136,15 +143,16 @@ public final class FabricModJsonFactory { @Nullable public static FabricModJson createFromSourceSetsNullable(SourceSet... sourceSets) throws IOException { - final @Nullable ModMetadataFile modMetadata = ModMetadataFiles.fromSourceSets(sourceSets); - - if (modMetadata != null) { - return new ModMetadataFabricModJson(modMetadata, new FabricModJsonSource.SourceSetSource(sourceSets)); - } - final File file = SourceSetHelper.findFirstFileInResource(FABRIC_MOD_JSON, sourceSets); if (file == null) { + // Try another mod metadata file if fabric.mod.json wasn't found. + final @Nullable ModMetadataFile modMetadata = ModMetadataFiles.fromSourceSets(sourceSets); + + if (modMetadata != null) { + return new ModMetadataFabricModJson(modMetadata, new FabricModJsonSource.SourceSetSource(sourceSets)); + } + return null; } diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/architectury/ModMetadataFilesTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/architectury/ModMetadataFilesTest.groovy index 534b0c41..2efdc409 100644 --- a/src/test/groovy/net/fabricmc/loom/test/unit/architectury/ModMetadataFilesTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/unit/architectury/ModMetadataFilesTest.groovy @@ -36,6 +36,8 @@ import spock.lang.TempDir import net.fabricmc.loom.test.unit.forge.ModsTomlTest import net.fabricmc.loom.util.ZipUtils +import net.fabricmc.loom.util.fmj.FabricModJsonFactory +import net.fabricmc.loom.util.fmj.ModMetadataFabricModJson class ModMetadataFilesTest extends Specification { @TempDir @@ -115,4 +117,60 @@ class ModMetadataFilesTest extends Specification { modMetadata instanceof ErroringModMetadataFile modMetadata.fileName == 'mods.toml [erroring]' } + + def "read fabric.mod.json from directory"() { + given: + workingDir.resolve('fabric.mod.json').text = ''' + { + "schemaVersion": 1, + "id": "test", + "version": 1 + } + '''.stripIndent() + workingDir.resolve('architectury.common.json').text = '{}' + when: + def fmj = FabricModJsonFactory.createFromDirectory(workingDir) + then: + !(fmj instanceof ModMetadataFabricModJson) + fmj.id == 'test' + } + + def "read fabric.mod.json from zip"() { + given: + def jar = workingDir.resolve("my_mod.jar") + zipContents.resolve('fabric.mod.json').text = ''' + { + "schemaVersion": 1, + "id": "test", + "version": 1 + } + '''.stripIndent() + zipContents.resolve('architectury.common.json').text = '{}' + ZipUtils.pack(zipContents, jar) + when: + def fmj = FabricModJsonFactory.createFromZip(jar) + then: + !(fmj instanceof ModMetadataFabricModJson) + fmj.id == 'test' + } + + def "read fabric.mod.json from zip (nullable)"() { + given: + def jar = workingDir.resolve("my_mod.jar") + zipContents.resolve('fabric.mod.json').text = ''' + { + "schemaVersion": 1, + "id": "test", + "version": 1 + } + '''.stripIndent() + zipContents.resolve('architectury.common.json').text = '{}' + ZipUtils.pack(zipContents, jar) + when: + def fmj = FabricModJsonFactory.createFromZipNullable(jar) + then: + fmj != null + !(fmj instanceof ModMetadataFabricModJson) + fmj.id == 'test' + } }