Merge branch 'dev/1.1' into dev/1.2

This commit is contained in:
Juuz
2023-06-12 20:48:09 +03:00
3 changed files with 99 additions and 33 deletions

View File

@@ -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<String, Function<byte[], ModMetadataFile>> SINGLE_FILE_METADATA_TYPES = ImmutableMap.<String, Function<byte[], ModMetadataFile>>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();

View File

@@ -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;
}

View File

@@ -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'
}
}