Skip to content

Commit aa05df2

Browse files
committed
Allow running some commands directly without using file inputs
Also improve part of the enigma-cli code
1 parent 2cf7c98 commit aa05df2

File tree

7 files changed

+110
-97
lines changed

7 files changed

+110
-97
lines changed

enigma-cli/src/main/java/cuchaz/enigma/command/CheckMappingsCommand.java

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
package cuchaz.enigma.command;
22

3-
import cuchaz.enigma.Enigma;
43
import cuchaz.enigma.EnigmaProject;
5-
import cuchaz.enigma.ProgressListener;
64
import cuchaz.enigma.analysis.index.JarIndex;
7-
import cuchaz.enigma.classprovider.ClasspathClassProvider;
8-
import cuchaz.enigma.translation.mapping.EntryMapping;
9-
import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters;
10-
import cuchaz.enigma.translation.mapping.tree.EntryTree;
115
import cuchaz.enigma.translation.representation.entry.ClassEntry;
126
import org.tinylog.Logger;
137

@@ -38,19 +32,7 @@ public void run(String... args) throws Exception {
3832
}
3933

4034
public static void run(Path fileJarIn, Path fileMappings) throws Exception {
41-
Enigma enigma = Enigma.create();
42-
43-
Logger.info("Reading JAR...");
44-
45-
EnigmaProject project = enigma.openJar(fileJarIn, new ClasspathClassProvider(), ProgressListener.none());
46-
47-
Logger.info("Reading mappings...");
48-
49-
MappingSaveParameters saveParameters = enigma.getProfile().getMappingSaveParameters();
50-
51-
EntryTree<EntryMapping> mappings = readMappings(fileMappings, ProgressListener.none(), saveParameters);
52-
project.setMappings(mappings);
53-
35+
EnigmaProject project = openProject(fileJarIn, fileMappings);
5436
JarIndex idx = project.getJarIndex();
5537

5638
boolean error = false;

enigma-cli/src/main/java/cuchaz/enigma/command/Command.java

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package cuchaz.enigma.command;
22

33
import cuchaz.enigma.Enigma;
4+
import cuchaz.enigma.EnigmaProfile;
45
import cuchaz.enigma.EnigmaProject;
56
import cuchaz.enigma.ProgressListener;
7+
import cuchaz.enigma.analysis.index.JarIndex;
8+
import cuchaz.enigma.api.EnigmaPlugin;
9+
import cuchaz.enigma.classprovider.CachingClassProvider;
610
import cuchaz.enigma.classprovider.ClasspathClassProvider;
11+
import cuchaz.enigma.classprovider.JarClassProvider;
712
import cuchaz.enigma.translation.mapping.EntryMapping;
813
import cuchaz.enigma.translation.mapping.MappingDelta;
914
import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters;
@@ -18,12 +23,15 @@
1823
import java.nio.file.Path;
1924
import java.nio.file.Paths;
2025
import java.util.ArrayList;
26+
import java.util.Collections;
2127
import java.util.List;
2228
import java.util.Locale;
2329

2430
import com.google.common.io.MoreFiles;
2531
import org.tinylog.Logger;
2632

33+
import javax.annotation.Nullable;
34+
2735
public abstract class Command {
2836
public final String name;
2937

@@ -37,12 +45,49 @@ protected Command(String name) {
3745

3846
public abstract void run(String... args) throws Exception;
3947

48+
public static JarIndex loadJar(Path jar) throws IOException {
49+
Logger.info("Reading JAR...");
50+
JarClassProvider classProvider = new JarClassProvider(jar);
51+
JarIndex index = JarIndex.empty();
52+
index.indexJar(classProvider.getClassNames(), new CachingClassProvider(classProvider), ProgressListener.none());
53+
54+
return index;
55+
}
56+
57+
protected static Enigma createEnigma() {
58+
return Enigma.create();
59+
}
60+
61+
protected static Enigma createEnigma(EnigmaProfile profile) {
62+
return createEnigma(profile, null);
63+
}
64+
65+
protected static Enigma createEnigma(EnigmaProfile profile, @Nullable Iterable<EnigmaPlugin> plugins) {
66+
Enigma.Builder builder = Enigma.builder().setProfile(profile);
67+
68+
if (plugins != null) {
69+
builder.setPlugins(plugins);
70+
}
71+
72+
return builder.build();
73+
}
74+
4075
protected static EnigmaProject openProject(Path fileJarIn, Path fileMappings) throws Exception {
41-
ProgressListener progress = new ConsoleProgressListener();
76+
return openProject(fileJarIn, fileMappings, createEnigma());
77+
}
4278

43-
Enigma enigma = Enigma.create();
79+
protected static EnigmaProject openProject(Path fileJarIn, Path fileMappings, EnigmaProfile profile) throws Exception {
80+
return openProject(fileJarIn, fileMappings, profile, null);
81+
}
82+
83+
protected static EnigmaProject openProject(Path fileJarIn, Path fileMappings, EnigmaProfile profile, @Nullable Iterable<EnigmaPlugin> plugins) throws Exception {
84+
return openProject(fileJarIn, fileMappings, createEnigma(profile, plugins));
85+
}
86+
87+
protected static EnigmaProject openProject(Path fileJarIn, Path fileMappings, Enigma enigma) throws Exception {
88+
ProgressListener progress = new ConsoleProgressListener();
4489

45-
Logger.info("Reading jar...");
90+
Logger.info("Reading JAR...");
4691
EnigmaProject project = enigma.openJar(fileJarIn, new ClasspathClassProvider(), progress);
4792

4893
if (fileMappings != null) {

enigma-cli/src/main/java/cuchaz/enigma/command/DropInvalidMappingsCommand.java

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
package cuchaz.enigma.command;
22

3-
import cuchaz.enigma.Enigma;
43
import cuchaz.enigma.EnigmaProject;
54
import cuchaz.enigma.ProgressListener;
6-
import cuchaz.enigma.classprovider.ClasspathClassProvider;
7-
import cuchaz.enigma.translation.mapping.EntryMapping;
85
import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters;
9-
import cuchaz.enigma.translation.mapping.tree.EntryTree;
106
import org.tinylog.Logger;
117

128
import java.io.IOException;
@@ -47,17 +43,7 @@ public static void run(Path jarIn, Path mappingsIn, Path mappingsOut) throws Exc
4743
return;
4844
}
4945

50-
Enigma enigma = Enigma.create();
51-
52-
Logger.info("Reading JAR...");
53-
54-
EnigmaProject project = enigma.openJar(jarIn, new ClasspathClassProvider(), ProgressListener.none());
55-
56-
Logger.info("Reading mappings...");
57-
58-
MappingSaveParameters saveParameters = enigma.getProfile().getMappingSaveParameters();
59-
EntryTree<EntryMapping> mappings = readMappings(mappingsIn, ProgressListener.none(), saveParameters);
60-
project.setMappings(mappings);
46+
EnigmaProject project = openProject(jarIn, mappingsIn);
6147

6248
Logger.info("Dropping invalid mappings...");
6349

@@ -84,6 +70,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO
8470
Files.deleteIfExists(mappingsIn);
8571
}
8672

73+
MappingSaveParameters saveParameters = project.getEnigma().getProfile().getMappingSaveParameters();
8774
writeMappings(project.getMapper().getObfToDeobf(), mappingsOut, ProgressListener.none(), saveParameters);
8875
}
8976
}

enigma-cli/src/main/java/cuchaz/enigma/command/FillClassMappingsCommand.java

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package cuchaz.enigma.command;
22

3-
import cuchaz.enigma.Enigma;
4-
import cuchaz.enigma.EnigmaProject;
53
import cuchaz.enigma.ProgressListener;
64
import cuchaz.enigma.analysis.index.JarIndex;
7-
import cuchaz.enigma.classprovider.ClasspathClassProvider;
85
import cuchaz.enigma.translation.mapping.EntryMapping;
6+
import cuchaz.enigma.translation.mapping.serde.MappingFileNameFormat;
97
import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters;
108
import cuchaz.enigma.translation.mapping.tree.DeltaTrackingTree;
119
import cuchaz.enigma.translation.mapping.tree.EntryTree;
1210
import cuchaz.enigma.translation.mapping.tree.EntryTreeNode;
11+
import cuchaz.enigma.translation.mapping.tree.HashEntryTree;
1312
import cuchaz.enigma.translation.representation.entry.ClassEntry;
1413
import cuchaz.enigma.translation.representation.entry.ParentedEntry;
1514
import cuchaz.enigma.utils.Utils;
1615
import org.tinylog.Logger;
1716

17+
import java.io.IOException;
1818
import java.nio.file.Path;
1919
import java.util.List;
2020

@@ -47,38 +47,41 @@ public void run(String... args) throws Exception {
4747

4848
public static void run(Path jar, Path source, Path result, String resultFormat) throws Exception {
4949
boolean debug = shouldDebug(NAME);
50-
51-
Logger.info("Reading JAR...");
52-
Enigma enigma = Enigma.create();
53-
EnigmaProject project = enigma.openJar(jar, new ClasspathClassProvider(), ProgressListener.none());
50+
JarIndex jarIndex = loadJar(jar);
5451

5552
Logger.info("Reading mappings...");
56-
MappingSaveParameters saveParameters = enigma.getProfile().getMappingSaveParameters();
57-
EntryTree<EntryMapping> mappings = readMappings(source, ProgressListener.none(), saveParameters);
58-
project.setMappings(mappings);
53+
MappingSaveParameters saveParameters = new MappingSaveParameters(MappingFileNameFormat.BY_DEOBF);
54+
EntryTree<EntryMapping> sourceMappings = readMappings(source, ProgressListener.none(), saveParameters);
55+
56+
EntryTree<EntryMapping> resultMappings = run(jarIndex, sourceMappings, debug);
57+
58+
Logger.info("Writing mappings...");
59+
Utils.delete(result);
60+
MappingCommandsUtil.write(resultMappings, resultFormat, result, saveParameters);
5961

6062
if (debug) {
61-
mappings = new DeltaTrackingTree<>(mappings);
63+
writeDebugDelta((DeltaTrackingTree<EntryMapping>) resultMappings, result);
64+
}
65+
}
66+
67+
public static EntryTree<EntryMapping> run(JarIndex jarIndex, EntryTree<EntryMapping> source, boolean trackDelta) throws IOException {
68+
EntryTree<EntryMapping> result = new HashEntryTree<>(source);
69+
70+
if (trackDelta) {
71+
result = new DeltaTrackingTree<>(result);
6272
}
6373

6474
Logger.info("Adding mappings...");
65-
JarIndex index = project.getJarIndex();
66-
List<ClassEntry> rootEntries = mappings.getRootNodes().map(EntryTreeNode::getEntry)
75+
List<ClassEntry> rootEntries = source.getRootNodes().map(EntryTreeNode::getEntry)
6776
.filter(entry -> entry instanceof ClassEntry)
6877
.map(entry -> (ClassEntry) entry)
6978
.toList();
7079
for (ClassEntry rootEntry : rootEntries) {
7180
// These entries already have a mapping tree node
72-
recursiveAddMappings(mappings, index, rootEntry, false);
81+
recursiveAddMappings(result, jarIndex, rootEntry, false);
7382
}
7483

75-
Logger.info("Writing mappings...");
76-
Utils.delete(result);
77-
MappingCommandsUtil.write(mappings, resultFormat, result, saveParameters);
78-
79-
if (debug) {
80-
writeDebugDelta((DeltaTrackingTree<EntryMapping>) mappings, result);
81-
}
84+
return result;
8285
}
8386

8487
private static void recursiveAddMappings(EntryTree<EntryMapping> mappings, JarIndex index, ClassEntry entry, boolean addMapping) {

enigma-cli/src/main/java/cuchaz/enigma/command/InsertProposedMappingsCommand.java

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,17 @@
33
import cuchaz.enigma.Enigma;
44
import cuchaz.enigma.EnigmaProfile;
55
import cuchaz.enigma.EnigmaProject;
6-
import cuchaz.enigma.ProgressListener;
76
import cuchaz.enigma.analysis.index.EntryIndex;
87
import cuchaz.enigma.api.EnigmaPlugin;
98
import cuchaz.enigma.api.service.NameProposalService;
10-
import cuchaz.enigma.classprovider.ClasspathClassProvider;
119
import cuchaz.enigma.translation.ProposingTranslator;
1210
import cuchaz.enigma.translation.Translator;
1311
import cuchaz.enigma.translation.mapping.EntryMapping;
1412
import cuchaz.enigma.translation.mapping.EntryRemapper;
1513
import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters;
1614
import cuchaz.enigma.translation.mapping.tree.DeltaTrackingTree;
1715
import cuchaz.enigma.translation.mapping.tree.EntryTree;
16+
import cuchaz.enigma.translation.mapping.tree.HashEntryTree;
1817
import cuchaz.enigma.translation.representation.TypeDescriptor;
1918
import cuchaz.enigma.translation.representation.entry.ClassEntry;
2019
import cuchaz.enigma.translation.representation.entry.Entry;
@@ -56,35 +55,36 @@ public void run(String... args) throws Exception {
5655
}
5756

5857
public static void run(Path inJar, Path source, Path output, String resultFormat, @Nullable Path profilePath, @Nullable Iterable<EnigmaPlugin> plugins) throws Exception {
59-
boolean debug = shouldDebug(NAME);
60-
6158
EnigmaProfile profile = EnigmaProfile.read(profilePath);
62-
Enigma.Builder builder = Enigma.builder().setProfile(profile);
63-
64-
if (plugins != null) {
65-
builder.setPlugins(plugins);
66-
}
59+
Enigma enigma = createEnigma(profile, plugins);
6760

68-
Enigma enigma = builder.build();
61+
run(inJar, source, output, resultFormat, enigma);
62+
}
6963

64+
public static void run(Path inJar, Path source, Path output, String resultFormat, Enigma enigma) throws Exception {
65+
boolean debug = shouldDebug(NAME);
7066
NameProposalService[] nameProposalServices = enigma.getServices().get(NameProposalService.TYPE).toArray(new NameProposalService[0]);
7167
if (nameProposalServices.length == 0) {
7268
Logger.error("No name proposal service found");
7369
return;
7470
}
7571

76-
Logger.info("Reading JAR...");
77-
78-
EnigmaProject project = enigma.openJar(inJar, new ClasspathClassProvider(), ProgressListener.none());
79-
80-
Logger.info("Reading mappings...");
72+
EnigmaProject project = openProject(inJar, source, enigma);
73+
EntryTree<EntryMapping> mappings = run(nameProposalServices, project, debug);
8174

75+
Utils.delete(output);
8276
MappingSaveParameters saveParameters = enigma.getProfile().getMappingSaveParameters();
83-
84-
EntryTree<EntryMapping> mappings = readMappings(source, ProgressListener.none(), saveParameters);
85-
project.setMappings(mappings);
77+
MappingCommandsUtil.write(mappings, resultFormat, output, saveParameters);
8678

8779
if (debug) {
80+
writeDebugDelta((DeltaTrackingTree<EntryMapping>) mappings, output);
81+
}
82+
}
83+
84+
public static EntryTree<EntryMapping> run(NameProposalService[] nameProposalServices, EnigmaProject project, boolean trackDelta) {
85+
EntryTree<EntryMapping> mappings = new HashEntryTree<>(project.getMapper().getObfToDeobf());
86+
87+
if (trackDelta) {
8888
mappings = new DeltaTrackingTree<>(mappings);
8989
}
9090

@@ -127,13 +127,7 @@ public static void run(Path inJar, Path source, Path output, String resultFormat
127127
}
128128

129129
Logger.info("Proposed names for {} classes, {} fields, {} methods, {} parameters!", classes, fields, methods, parameters);
130-
131-
Utils.delete(output);
132-
MappingCommandsUtil.write(mappings, resultFormat, output, saveParameters);
133-
134-
if (debug) {
135-
writeDebugDelta((DeltaTrackingTree<EntryMapping>) mappings, output);
136-
}
130+
return mappings;
137131
}
138132

139133
private static <T extends Entry<?>> boolean insertMapping(T entry, EntryTree<EntryMapping> mappings, EntryRemapper mapper, Translator translator) {

enigma-cli/src/main/java/cuchaz/enigma/command/MapSpecializedMethodsCommand.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package cuchaz.enigma.command;
22

3-
import cuchaz.enigma.ProgressListener;
43
import cuchaz.enigma.analysis.index.BridgeMethodIndex;
54
import cuchaz.enigma.analysis.index.JarIndex;
6-
import cuchaz.enigma.classprovider.CachingClassProvider;
7-
import cuchaz.enigma.classprovider.JarClassProvider;
85
import cuchaz.enigma.translation.MappingTranslator;
96
import cuchaz.enigma.translation.Translator;
107
import cuchaz.enigma.translation.mapping.EntryMapping;
@@ -52,14 +49,23 @@ public void run(String... args) throws IOException, MappingParseException {
5249

5350
public static void run(Path jar, String sourceFormat, Path sourcePath, String resultFormat, Path output) throws IOException, MappingParseException {
5451
boolean debug = shouldDebug(NAME);
52+
JarIndex jarIndex = loadJar(jar);
5553

5654
MappingSaveParameters saveParameters = new MappingSaveParameters(MappingFileNameFormat.BY_DEOBF);
5755
EntryTree<EntryMapping> source = MappingCommandsUtil.read(sourceFormat, sourcePath, saveParameters);
58-
EntryTree<EntryMapping> result = new HashEntryTree<>();
5956

60-
JarClassProvider jcp = new JarClassProvider(jar);
61-
JarIndex jarIndex = JarIndex.empty();
62-
jarIndex.indexJar(jcp.getClassNames(), new CachingClassProvider(jcp), ProgressListener.none());
57+
EntryTree<EntryMapping> result = run(jarIndex, source, debug);
58+
59+
Utils.delete(output);
60+
MappingCommandsUtil.write(result, resultFormat, output, saveParameters);
61+
62+
if (debug) {
63+
writeDebugDelta((DeltaTrackingTree<EntryMapping>) result, output);
64+
}
65+
}
66+
67+
public static EntryTree<EntryMapping> run(JarIndex jarIndex, EntryTree<EntryMapping> source, boolean trackDelta) throws IOException, MappingParseException {
68+
EntryTree<EntryMapping> result = new HashEntryTree<>();
6369

6470
BridgeMethodIndex bridgeMethodIndex = jarIndex.getBridgeMethodIndex();
6571
Translator translator = new MappingTranslator(source, jarIndex.getEntryResolver());
@@ -71,7 +77,7 @@ public static void run(Path jar, String sourceFormat, Path sourcePath, String re
7177
}
7278
}
7379

74-
if (debug) {
80+
if (trackDelta) {
7581
result = new DeltaTrackingTree<>(result);
7682
}
7783

@@ -83,11 +89,6 @@ public static void run(Path jar, String sourceFormat, Path sourcePath, String re
8389
result.insert(specialized, new EntryMapping(name));
8490
}
8591

86-
Utils.delete(output);
87-
MappingCommandsUtil.write(result, resultFormat, output, saveParameters);
88-
89-
if (debug) {
90-
writeDebugDelta((DeltaTrackingTree<EntryMapping>) result, output);
91-
}
92+
return result;
9293
}
9394
}

enigma-cli/src/main/java/cuchaz/enigma/command/MappingCommandsUtil.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
public final class MappingCommandsUtil {
1818
private MappingCommandsUtil() {}
1919

20+
// TODO: Merge with methods in Command
2021
public static EntryTree<EntryMapping> read(String type, Path path, MappingSaveParameters saveParameters) throws MappingParseException, IOException {
2122
if (type.equals("enigma")) {
2223
return (Files.isDirectory(path) ? EnigmaMappingsReader.DIRECTORY : EnigmaMappingsReader.ZIP).read(path, ProgressListener.none(), saveParameters);

0 commit comments

Comments
 (0)