summaryrefslogtreecommitdiff
path: root/enigma
diff options
context:
space:
mode:
authorGravatar Juuz2025-08-20 20:13:18 +0300
committerGravatar GitHub2025-08-20 18:13:18 +0100
commitb0c154881683d6d5cb25569db32037c35498facb (patch)
tree8d2d08c9ea90bc9910c1e4c98d715a9ee294ba65 /enigma
parentOptimize JAR indexing (#552) (diff)
downloadenigma-fork-b0c154881683d6d5cb25569db32037c35498facb.tar.gz
enigma-fork-b0c154881683d6d5cb25569db32037c35498facb.tar.xz
enigma-fork-b0c154881683d6d5cb25569db32037c35498facb.zip
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
Diffstat (limited to 'enigma')
-rw-r--r--enigma/src/main/java/cuchaz/enigma/Enigma.java24
-rw-r--r--enigma/src/main/java/cuchaz/enigma/EnigmaProject.java10
-rw-r--r--enigma/src/main/java/cuchaz/enigma/utils/Utils.java14
3 files changed, 37 insertions, 11 deletions
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 {
57 } 57 }
58 58
59 public EnigmaProject openJar(Path path, ClassProvider libraryClassProvider, ProgressListener progress) throws IOException { 59 public EnigmaProject openJar(Path path, ClassProvider libraryClassProvider, ProgressListener progress) throws IOException {
60 JarClassProvider jarClassProvider = new JarClassProvider(path); 60 return openJars(List.of(path), libraryClassProvider, progress);
61 }
62
63 public EnigmaProject openJars(List<Path> paths, ClassProvider libraryClassProvider, ProgressListener progress) throws IOException {
64 ClassProvider jarClassProvider = getJarClassProvider(paths);
61 ClassProvider classProvider = new CachingClassProvider(new CombiningClassProvider(jarClassProvider, libraryClassProvider)); 65 ClassProvider classProvider = new CachingClassProvider(new CombiningClassProvider(jarClassProvider, libraryClassProvider));
62 Set<String> scope = jarClassProvider.getClassNames(); 66 Set<String> scope = Set.copyOf(jarClassProvider.getClassNames());
63 67
64 JarIndex index = JarIndex.empty(); 68 JarIndex index = JarIndex.empty();
65 ClassProvider classProviderWithFrames = index.indexJar(scope, classProvider, progress); 69 ClassProvider classProviderWithFrames = index.indexJar(scope, classProvider, progress);
66 services.get(JarIndexerService.TYPE).forEach(indexer -> indexer.acceptJar(scope, classProviderWithFrames, index)); 70 services.get(JarIndexerService.TYPE).forEach(indexer -> indexer.acceptJar(scope, classProviderWithFrames, index));
67 71
68 return new EnigmaProject(this, path, classProvider, index, Utils.zipSha1(path)); 72 return new EnigmaProject(this, paths, classProvider, index, Utils.zipSha1(paths.toArray(new Path[0])));
73 }
74
75 private ClassProvider getJarClassProvider(List<Path> jars) throws IOException {
76 if (jars.size() == 1) {
77 return new JarClassProvider(jars.get(0));
78 }
79
80 var classProviders = new ClassProvider[jars.size()];
81
82 for (int i = 0; i < jars.size(); i++) {
83 classProviders[i] = new JarClassProvider(jars.get(i));
84 }
85
86 return new CombiningClassProvider(classProviders);
69 } 87 }
70 88
71 public EnigmaProfile getProfile() { 89 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;
48public class EnigmaProject { 48public class EnigmaProject {
49 private final Enigma enigma; 49 private final Enigma enigma;
50 50
51 private final Path jarPath; 51 private final List<Path> jarPaths;
52 private final ClassProvider classProvider; 52 private final ClassProvider classProvider;
53 private final JarIndex jarIndex; 53 private final JarIndex jarIndex;
54 private final byte[] jarChecksum; 54 private final byte[] jarChecksum;
55 55
56 private EntryRemapper mapper; 56 private EntryRemapper mapper;
57 57
58 public EnigmaProject(Enigma enigma, Path jarPath, ClassProvider classProvider, JarIndex jarIndex, byte[] jarChecksum) { 58 public EnigmaProject(Enigma enigma, List<Path> jarPaths, ClassProvider classProvider, JarIndex jarIndex, byte[] jarChecksum) {
59 Preconditions.checkArgument(jarChecksum.length == 20); 59 Preconditions.checkArgument(jarChecksum.length == 20);
60 this.enigma = enigma; 60 this.enigma = enigma;
61 this.jarPath = jarPath; 61 this.jarPaths = List.copyOf(jarPaths);
62 this.classProvider = classProvider; 62 this.classProvider = classProvider;
63 this.jarIndex = jarIndex; 63 this.jarIndex = jarIndex;
64 this.jarChecksum = jarChecksum; 64 this.jarChecksum = jarChecksum;
@@ -78,8 +78,8 @@ public class EnigmaProject {
78 return enigma; 78 return enigma;
79 } 79 }
80 80
81 public Path getJarPath() { 81 public List<Path> getJarPaths() {
82 return jarPath; 82 return jarPaths;
83 } 83 }
84 84
85 public ClassProvider getClassProvider() { 85 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;
28import java.util.zip.ZipEntry; 28import java.util.zip.ZipEntry;
29import java.util.zip.ZipFile; 29import java.util.zip.ZipFile;
30 30
31import com.google.common.base.Preconditions;
31import com.google.common.io.CharStreams; 32import com.google.common.io.CharStreams;
32 33
33public class Utils { 34public class Utils {
@@ -53,7 +54,8 @@ public class Utils {
53 } 54 }
54 } 55 }
55 56
56 public static byte[] zipSha1(Path path) throws IOException { 57 public static byte[] zipSha1(Path... paths) throws IOException {
58 Preconditions.checkArgument(paths.length >= 1, "Must provide at least one zip");
57 MessageDigest digest; 59 MessageDigest digest;
58 60
59 try { 61 try {
@@ -63,6 +65,14 @@ public class Utils {
63 throw new RuntimeException(e); 65 throw new RuntimeException(e);
64 } 66 }
65 67
68 for (Path path : paths) {
69 appendZipSha1(digest, path);
70 }
71
72 return digest.digest();
73 }
74
75 private static void appendZipSha1(MessageDigest digest, Path path) throws IOException {
66 try (ZipFile zip = new ZipFile(path.toFile())) { 76 try (ZipFile zip = new ZipFile(path.toFile())) {
67 List<? extends ZipEntry> entries = Collections.list(zip.entries()); 77 List<? extends ZipEntry> entries = Collections.list(zip.entries());
68 // only compare classes (some implementations may not generate directory entries) 78 // only compare classes (some implementations may not generate directory entries)
@@ -83,8 +93,6 @@ public class Utils {
83 } 93 }
84 } 94 }
85 } 95 }
86
87 return digest.digest();
88 } 96 }
89 97
90 public static void withLock(Lock l, Runnable op) { 98 public static void withLock(Lock l, Runnable op) {