From b0c154881683d6d5cb25569db32037c35498facb Mon Sep 17 00:00:00 2001 From: Juuz Date: Wed, 20 Aug 2025 20:13:18 +0300 Subject: Support multiple input jars (#553) * Support multiple input jars This is needed for FabricMC/fabric-loom#1354. * Remove unnecessary null check in GuiController.reloadAll * Remove outdated TODO--- enigma/src/main/java/cuchaz/enigma/Enigma.java | 24 +++++++++++++++++++--- .../src/main/java/cuchaz/enigma/EnigmaProject.java | 10 ++++----- .../src/main/java/cuchaz/enigma/utils/Utils.java | 14 ++++++++++--- 3 files changed, 37 insertions(+), 11 deletions(-) (limited to 'enigma') diff --git a/enigma/src/main/java/cuchaz/enigma/Enigma.java b/enigma/src/main/java/cuchaz/enigma/Enigma.java index 414285d..315b5f6 100644 --- a/enigma/src/main/java/cuchaz/enigma/Enigma.java +++ b/enigma/src/main/java/cuchaz/enigma/Enigma.java @@ -57,15 +57,33 @@ public class Enigma { } public EnigmaProject openJar(Path path, ClassProvider libraryClassProvider, ProgressListener progress) throws IOException { - JarClassProvider jarClassProvider = new JarClassProvider(path); + return openJars(List.of(path), libraryClassProvider, progress); + } + + public EnigmaProject openJars(List paths, ClassProvider libraryClassProvider, ProgressListener progress) throws IOException { + ClassProvider jarClassProvider = getJarClassProvider(paths); ClassProvider classProvider = new CachingClassProvider(new CombiningClassProvider(jarClassProvider, libraryClassProvider)); - Set scope = jarClassProvider.getClassNames(); + Set scope = Set.copyOf(jarClassProvider.getClassNames()); JarIndex index = JarIndex.empty(); ClassProvider classProviderWithFrames = index.indexJar(scope, classProvider, progress); services.get(JarIndexerService.TYPE).forEach(indexer -> indexer.acceptJar(scope, classProviderWithFrames, index)); - return new EnigmaProject(this, path, classProvider, index, Utils.zipSha1(path)); + return new EnigmaProject(this, paths, classProvider, index, Utils.zipSha1(paths.toArray(new Path[0]))); + } + + private ClassProvider getJarClassProvider(List jars) throws IOException { + if (jars.size() == 1) { + return new JarClassProvider(jars.get(0)); + } + + var classProviders = new ClassProvider[jars.size()]; + + for (int i = 0; i < jars.size(); i++) { + classProviders[i] = new JarClassProvider(jars.get(i)); + } + + return new CombiningClassProvider(classProviders); } public EnigmaProfile getProfile() { diff --git a/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java b/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java index f9db4d1..1051f45 100644 --- a/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java +++ b/enigma/src/main/java/cuchaz/enigma/EnigmaProject.java @@ -48,17 +48,17 @@ import cuchaz.enigma.utils.I18n; public class EnigmaProject { private final Enigma enigma; - private final Path jarPath; + private final List jarPaths; private final ClassProvider classProvider; private final JarIndex jarIndex; private final byte[] jarChecksum; private EntryRemapper mapper; - public EnigmaProject(Enigma enigma, Path jarPath, ClassProvider classProvider, JarIndex jarIndex, byte[] jarChecksum) { + public EnigmaProject(Enigma enigma, List jarPaths, ClassProvider classProvider, JarIndex jarIndex, byte[] jarChecksum) { Preconditions.checkArgument(jarChecksum.length == 20); this.enigma = enigma; - this.jarPath = jarPath; + this.jarPaths = List.copyOf(jarPaths); this.classProvider = classProvider; this.jarIndex = jarIndex; this.jarChecksum = jarChecksum; @@ -78,8 +78,8 @@ public class EnigmaProject { return enigma; } - public Path getJarPath() { - return jarPath; + public List getJarPaths() { + return jarPaths; } public ClassProvider getClassProvider() { diff --git a/enigma/src/main/java/cuchaz/enigma/utils/Utils.java b/enigma/src/main/java/cuchaz/enigma/utils/Utils.java index 081c941..a1926a8 100644 --- a/enigma/src/main/java/cuchaz/enigma/utils/Utils.java +++ b/enigma/src/main/java/cuchaz/enigma/utils/Utils.java @@ -28,6 +28,7 @@ import java.util.function.Supplier; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import com.google.common.base.Preconditions; import com.google.common.io.CharStreams; public class Utils { @@ -53,7 +54,8 @@ public class Utils { } } - public static byte[] zipSha1(Path path) throws IOException { + public static byte[] zipSha1(Path... paths) throws IOException { + Preconditions.checkArgument(paths.length >= 1, "Must provide at least one zip"); MessageDigest digest; try { @@ -63,6 +65,14 @@ public class Utils { throw new RuntimeException(e); } + for (Path path : paths) { + appendZipSha1(digest, path); + } + + return digest.digest(); + } + + private static void appendZipSha1(MessageDigest digest, Path path) throws IOException { try (ZipFile zip = new ZipFile(path.toFile())) { List entries = Collections.list(zip.entries()); // only compare classes (some implementations may not generate directory entries) @@ -83,8 +93,6 @@ public class Utils { } } } - - return digest.digest(); } public static void withLock(Lock l, Runnable op) { -- cgit v1.2.3