From 651bcec276e99b6fb59a1587f5658ebcab7150dd Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 16 Jun 2022 19:22:13 +0100 Subject: [PATCH] Use TR's ref coutning FileSystemHandler (#639) * Dont depend on other prepare tasks, only run after. * Update for: https://github.com/FabricMC/tiny-remapper/pull/93 * Cleanup * Bump deps --- build.gradle | 9 ++--- .../loom/build/MixinRefmapHelper.java | 27 +------------ .../mappings/MappingsProviderImpl.java | 13 ++++--- .../signatures/SignatureFixesLayerImpl.java | 19 +++------ .../parchment/ParchmentMappingLayer.java | 17 ++------ .../providers/mappings/tiny/TinyJarInfo.java | 7 ++-- .../fernflower/FernFlowerUtils.java | 16 ++------ .../loom/task/MigrateMappingsTask.java | 9 ++--- .../net/fabricmc/loom/task/RemapJarTask.java | 3 +- .../fabricmc/loom/util/FileSystemUtil.java | 39 ++++++------------- .../java/net/fabricmc/loom/util/ModUtils.java | 13 +------ .../java/net/fabricmc/loom/util/ZipUtils.java | 10 +++++ 12 files changed, 56 insertions(+), 126 deletions(-) diff --git a/build.gradle b/build.gradle index 615b5c72..b71ea7af 100644 --- a/build.gradle +++ b/build.gradle @@ -45,7 +45,6 @@ repositories { url = 'https://maven.fabricmc.net/' } mavenCentral() - mavenLocal() } configurations { @@ -71,7 +70,7 @@ dependencies { // libraries implementation ('commons-io:commons-io:2.11.0') implementation ('com.google.code.gson:gson:2.9.0') - implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.2.2') + implementation ('com.fasterxml.jackson.core:jackson-databind:2.13.3') implementation ('com.google.guava:guava:31.1-jre') implementation ('org.ow2.asm:asm:9.3') implementation ('org.ow2.asm:asm-analysis:9.3') @@ -85,7 +84,7 @@ dependencies { } // tinyfile management - implementation ('net.fabricmc:tiny-remapper:0.8.2') + implementation ('net.fabricmc:tiny-remapper:0.8.5') implementation 'net.fabricmc:access-widener:2.1.0' implementation 'net.fabricmc:mapping-io:0.2.1' @@ -114,11 +113,11 @@ dependencies { exclude module: 'groovy-all' } testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.8.2' - testImplementation ('io.javalin:javalin:4.4.0') { + testImplementation ('io.javalin:javalin:4.6.1') { exclude group: 'org.jetbrains.kotlin' } testImplementation 'net.fabricmc:fabric-installer:0.9.0' - testImplementation 'org.mockito:mockito-core:4.4.0' + testImplementation 'org.mockito:mockito-core:4.6.1' compileOnly 'org.jetbrains:annotations:23.0.0' testCompileOnly 'org.jetbrains:annotations:23.0.0' diff --git a/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java index 49cde0d7..69a24625 100644 --- a/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java +++ b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2018-2021 FabricMC + * Copyright (c) 2018-2022 FabricMC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,46 +24,21 @@ package net.fabricmc.loom.build; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; import java.util.Collection; import java.util.Collections; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import net.fabricmc.loom.LoomGradlePlugin; public final class MixinRefmapHelper { private MixinRefmapHelper() { } private static final String FABRIC_MOD_JSON = "fabric.mod.json"; - @Nullable - public static JsonObject readFabricModJson(File output) { - try (ZipFile zip = new ZipFile(output)) { - ZipEntry entry = zip.getEntry(FABRIC_MOD_JSON); - - if (entry == null) { - return null; - } - - try (InputStreamReader reader = new InputStreamReader(zip.getInputStream(entry))) { - return LoomGradlePlugin.GSON.fromJson(reader, JsonObject.class); - } - } catch (IOException e) { - throw new RuntimeException("Cannot read file fabric.mod.json in the jar.", e); - } - } - @NotNull public static Collection getMixinConfigurationFiles(JsonObject fabricModJson) { JsonArray mixins = fabricModJson.getAsJsonArray("mixins"); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java index 7c02ee4d..92b55f24 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2016-2021 FabricMC + * Copyright (c) 2016-2022 FabricMC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -56,6 +56,7 @@ import net.fabricmc.loom.configuration.providers.minecraft.MergedMinecraftProvid import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DeletingFileVisitor; +import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.loom.util.ZipUtils; import net.fabricmc.loom.util.service.SharedService; import net.fabricmc.loom.util.service.SharedServiceManager; @@ -184,9 +185,9 @@ public class MappingsProviderImpl implements MappingsProvider, SharedService { private void storeMappings(MinecraftProvider minecraftProvider, Path inputJar) throws IOException { LOGGER.info(":extracting " + inputJar.getFileName()); - try (FileSystem fileSystem = FileSystems.newFileSystem(inputJar, (ClassLoader) null)) { - extractMappings(fileSystem, baseTinyMappings); - extractExtras(fileSystem); + try (FileSystemUtil.Delegate delegate = FileSystemUtil.getJarFileSystem(inputJar)) { + extractMappings(delegate.fs(), baseTinyMappings); + extractExtras(delegate.fs()); } if (areMappingsV2(baseTinyMappings)) { @@ -221,8 +222,8 @@ public class MappingsProviderImpl implements MappingsProvider, SharedService { } public static void extractMappings(Path jar, Path extractTo) throws IOException { - try (FileSystem unmergedIntermediaryFs = FileSystems.newFileSystem(jar, (ClassLoader) null)) { - extractMappings(unmergedIntermediaryFs, extractTo); + try (FileSystemUtil.Delegate delegate = FileSystemUtil.getJarFileSystem(jar)) { + extractMappings(delegate.fs(), extractTo); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/extras/signatures/SignatureFixesLayerImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/extras/signatures/SignatureFixesLayerImpl.java index 5f906384..4328311b 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/extras/signatures/SignatureFixesLayerImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/extras/signatures/SignatureFixesLayerImpl.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2021 FabricMC + * Copyright (c) 2022 FabricMC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,17 +25,13 @@ package net.fabricmc.loom.configuration.providers.mappings.extras.signatures; import java.io.IOException; -import java.io.InputStreamReader; import java.nio.file.Path; import java.util.Map; -import java.util.Objects; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; import org.jetbrains.annotations.ApiStatus; -import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.api.mappings.layered.MappingLayer; +import net.fabricmc.loom.util.ZipUtils; import net.fabricmc.mappingio.MappingVisitor; @ApiStatus.Experimental @@ -49,14 +45,9 @@ public record SignatureFixesLayerImpl(Path mappingsFile) implements MappingLayer @Override public Map getSignatureFixes() { - try (var zipFile = new ZipFile(mappingsFile().toFile())) { - ZipEntry zipFileEntry = zipFile.getEntry(SIGNATURE_FIXES_PATH); - Objects.requireNonNull(zipFileEntry, "Could not find %s in file".formatted(SIGNATURE_FIXES_PATH)); - - try (var reader = new InputStreamReader(zipFile.getInputStream(zipFileEntry))) { - //noinspection unchecked - return LoomGradlePlugin.OBJECT_MAPPER.readValue(reader, Map.class); - } + try { + //noinspection unchecked + return ZipUtils.unpackJackson(mappingsFile(), SIGNATURE_FIXES_PATH, Map.class); } catch (IOException e) { throw new RuntimeException("Failed to extract signature fixes", e); } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/parchment/ParchmentMappingLayer.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/parchment/ParchmentMappingLayer.java index f6b602e8..0e2f68c6 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/parchment/ParchmentMappingLayer.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/parchment/ParchmentMappingLayer.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2016-2021 FabricMC + * Copyright (c) 2016-2022 FabricMC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,15 +25,11 @@ package net.fabricmc.loom.configuration.providers.mappings.parchment; import java.io.IOException; -import java.io.InputStreamReader; import java.nio.file.Path; -import java.util.Objects; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.api.mappings.layered.MappingLayer; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; +import net.fabricmc.loom.util.ZipUtils; import net.fabricmc.mappingio.MappingVisitor; public record ParchmentMappingLayer(Path parchmentFile, boolean removePrefix) implements MappingLayer { @@ -51,13 +47,6 @@ public record ParchmentMappingLayer(Path parchmentFile, boolean removePrefix) im } private ParchmentTreeV1 getParchmentData() throws IOException { - try (var zipFile = new ZipFile(parchmentFile().toFile())) { - ZipEntry zipFileEntry = zipFile.getEntry(PARCHMENT_DATA_FILE_NAME); - Objects.requireNonNull(zipFileEntry, "Could not find %s in parchment data file".formatted(PARCHMENT_DATA_FILE_NAME)); - - try (var reader = new InputStreamReader(zipFile.getInputStream(zipFileEntry))) { - return LoomGradlePlugin.OBJECT_MAPPER.readValue(reader, ParchmentTreeV1.class); - } - } + return ZipUtils.unpackJackson(parchmentFile, PARCHMENT_DATA_FILE_NAME, ParchmentTreeV1.class); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/tiny/TinyJarInfo.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/tiny/TinyJarInfo.java index 1a6649a4..692883ac 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/tiny/TinyJarInfo.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/tiny/TinyJarInfo.java @@ -27,12 +27,11 @@ package net.fabricmc.loom.configuration.providers.mappings.tiny; import java.io.BufferedReader; import java.io.IOException; import java.io.UncheckedIOException; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.util.Optional; +import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.format.MappingFormat; @@ -46,8 +45,8 @@ public record TinyJarInfo(boolean v2, Optional minecraftVersionId) { } private static boolean doesJarContainV2Mappings(Path path) throws IOException { - try (FileSystem fs = FileSystems.newFileSystem(path, (ClassLoader) null)) { - try (BufferedReader reader = Files.newBufferedReader(fs.getPath("mappings", "mappings.tiny"))) { + try (FileSystemUtil.Delegate delegate = FileSystemUtil.getJarFileSystem(path)) { + try (BufferedReader reader = Files.newBufferedReader(delegate.fs().getPath("mappings", "mappings.tiny"))) { return MappingReader.detectFormat(reader) == MappingFormat.TINY_2; } } diff --git a/src/main/java/net/fabricmc/loom/decompilers/fernflower/FernFlowerUtils.java b/src/main/java/net/fabricmc/loom/decompilers/fernflower/FernFlowerUtils.java index ced6345c..ee07f045 100644 --- a/src/main/java/net/fabricmc/loom/decompilers/fernflower/FernFlowerUtils.java +++ b/src/main/java/net/fabricmc/loom/decompilers/fernflower/FernFlowerUtils.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2016-2020 FabricMC + * Copyright (c) 2016-2022 FabricMC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -26,11 +26,11 @@ package net.fabricmc.loom.decompilers.fernflower; import java.io.File; import java.io.IOException; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; import org.jetbrains.java.decompiler.util.InterpreterUtil; +import net.fabricmc.loom.util.ZipUtils; + public class FernFlowerUtils { public static byte[] getBytecode(String externalPath, String internalPath) throws IOException { File file = new File(externalPath); @@ -38,15 +38,7 @@ public class FernFlowerUtils { if (internalPath == null) { return InterpreterUtil.getBytes(file); } else { - try (ZipFile archive = new ZipFile(file)) { - ZipEntry entry = archive.getEntry(internalPath); - - if (entry == null) { - throw new IOException("Entry not found: " + internalPath); - } - - return InterpreterUtil.getBytes(archive, entry); - } + return ZipUtils.unpack(file.toPath(), internalPath); } } } diff --git a/src/main/java/net/fabricmc/loom/task/MigrateMappingsTask.java b/src/main/java/net/fabricmc/loom/task/MigrateMappingsTask.java index fb9a8fbf..650b1770 100644 --- a/src/main/java/net/fabricmc/loom/task/MigrateMappingsTask.java +++ b/src/main/java/net/fabricmc/loom/task/MigrateMappingsTask.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2019-2021 FabricMC + * Copyright (c) 2019-2022 FabricMC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -26,8 +26,6 @@ package net.fabricmc.loom.task; import java.io.File; import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.util.Set; @@ -51,6 +49,7 @@ import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder; import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency; import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; +import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.loom.util.SourceRemapper; import net.fabricmc.lorenztiny.TinyMappingsJoiner; import net.fabricmc.mappingio.MappingReader; @@ -149,8 +148,8 @@ public class MigrateMappingsTask extends AbstractLoomTask { private static MemoryMappingTree getMappings(File mappings) throws IOException { MemoryMappingTree mappingTree = new MemoryMappingTree(); - try (FileSystem fileSystem = FileSystems.newFileSystem(mappings.toPath(), (ClassLoader) null)) { - MappingReader.read(fileSystem.getPath("mappings/mappings.tiny"), mappingTree); + try (FileSystemUtil.Delegate delegate = FileSystemUtil.getJarFileSystem(mappings.toPath())) { + MappingReader.read(delegate.fs().getPath("mappings/mappings.tiny"), mappingTree); } return mappingTree; diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java index ccdcccde..d6bd54a7 100644 --- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java +++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java @@ -76,6 +76,7 @@ import net.fabricmc.loom.task.service.JarManifestService; import net.fabricmc.loom.task.service.TinyRemapperService; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.ExceptionUtil; +import net.fabricmc.loom.util.ModUtils; import net.fabricmc.loom.util.Pair; import net.fabricmc.loom.util.SidedClassVisitor; import net.fabricmc.loom.util.ZipUtils; @@ -168,7 +169,7 @@ public abstract class RemapJarTask extends AbstractRemapJarTask { final LoomGradleExtension extension = LoomGradleExtension.get(getProject()); final MixinExtension mixinExtension = extension.getMixin(); - final JsonObject fabricModJson = MixinRefmapHelper.readFabricModJson(getInputFile().getAsFile().get()); + final JsonObject fabricModJson = ModUtils.getFabricModJson(getInputFile().getAsFile().get().toPath()); if (fabricModJson == null) { getProject().getLogger().warn("Could not find fabric.mod.json file in: " + getInputFile().getAsFile().get().getName()); diff --git a/src/main/java/net/fabricmc/loom/util/FileSystemUtil.java b/src/main/java/net/fabricmc/loom/util/FileSystemUtil.java index fb87072f..d0f5f154 100644 --- a/src/main/java/net/fabricmc/loom/util/FileSystemUtil.java +++ b/src/main/java/net/fabricmc/loom/util/FileSystemUtil.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2016-2017 FabricMC + * Copyright (c) 2016-2022 FabricMC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,20 +27,17 @@ package net.fabricmc.loom.util; import java.io.File; import java.io.IOException; import java.net.URI; -import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.FileSystem; -import java.nio.file.FileSystemAlreadyExistsException; -import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; -import java.util.Collections; -import java.util.Map; import java.util.function.Supplier; +import net.fabricmc.tinyremapper.FileSystemReference; + public final class FileSystemUtil { - public record Delegate(FileSystem fs, boolean owner) implements AutoCloseable, Supplier { + public record Delegate(FileSystemReference reference) implements AutoCloseable, Supplier { public byte[] readAllBytes(String path) throws IOException { Path fsPath = get().getPath(path); @@ -57,23 +54,23 @@ public final class FileSystemUtil { @Override public void close() throws IOException { - if (owner) { - fs.close(); - } + reference.close(); } @Override public FileSystem get() { - return fs; + return reference.getFs(); + } + + // TODO cleanup + public FileSystem fs() { + return get(); } } private FileSystemUtil() { } - private static final Map jfsArgsCreate = Map.of("create", "true"); - private static final Map jfsArgsEmpty = Collections.emptyMap(); - public static Delegate getJarFileSystem(File file, boolean create) throws IOException { return getJarFileSystem(file.toURI(), create); } @@ -87,18 +84,6 @@ public final class FileSystemUtil { } public static Delegate getJarFileSystem(URI uri, boolean create) throws IOException { - URI jarUri; - - try { - jarUri = new URI("jar:" + uri.getScheme(), uri.getHost(), uri.getPath(), uri.getFragment()); - } catch (URISyntaxException e) { - throw new IOException(e); - } - - try { - return new Delegate(FileSystems.newFileSystem(jarUri, create ? jfsArgsCreate : jfsArgsEmpty), true); - } catch (FileSystemAlreadyExistsException e) { - return new Delegate(FileSystems.getFileSystem(jarUri), false); - } + return new Delegate(FileSystemReference.open(uri, create)); } } diff --git a/src/main/java/net/fabricmc/loom/util/ModUtils.java b/src/main/java/net/fabricmc/loom/util/ModUtils.java index aeb0c963..e5896a45 100644 --- a/src/main/java/net/fabricmc/loom/util/ModUtils.java +++ b/src/main/java/net/fabricmc/loom/util/ModUtils.java @@ -27,14 +27,11 @@ package net.fabricmc.loom.util; import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; -import java.nio.charset.StandardCharsets; import java.nio.file.Path; import com.google.gson.JsonObject; import org.jetbrains.annotations.Nullable; -import net.fabricmc.loom.LoomGradlePlugin; - public final class ModUtils { private ModUtils() { } @@ -49,18 +46,10 @@ public final class ModUtils { @Nullable public static JsonObject getFabricModJson(Path path) { - final byte[] modJsonBytes; - try { - modJsonBytes = ZipUtils.unpackNullable(path, "fabric.mod.json"); + return ZipUtils.unpackGson(path, "fabric.mod.json", JsonObject.class); } catch (IOException e) { throw new UncheckedIOException("Failed to extract fabric.mod.json from " + path, e); } - - if (modJsonBytes == null) { - return null; - } - - return LoomGradlePlugin.GSON.fromJson(new String(modJsonBytes, StandardCharsets.UTF_8), JsonObject.class); } } diff --git a/src/main/java/net/fabricmc/loom/util/ZipUtils.java b/src/main/java/net/fabricmc/loom/util/ZipUtils.java index 6c4518fe..4428ef92 100644 --- a/src/main/java/net/fabricmc/loom/util/ZipUtils.java +++ b/src/main/java/net/fabricmc/loom/util/ZipUtils.java @@ -107,6 +107,16 @@ public class ZipUtils { } } + public static T unpackGson(Path zip, String path, Class clazz) throws IOException { + final byte[] bytes = unpack(zip, path); + return LoomGradlePlugin.GSON.fromJson(new String(bytes, StandardCharsets.UTF_8), clazz); + } + + public static T unpackJackson(Path zip, String path, Class clazz) throws IOException { + final byte[] bytes = unpack(zip, path); + return LoomGradlePlugin.OBJECT_MAPPER.readValue(new String(bytes, StandardCharsets.UTF_8), clazz); + } + public static void pack(Path from, Path zip) throws IOException { Files.deleteIfExists(zip);