Skip to content

Commit b639f91

Browse files
committed
quick and dirty decompilation, poked artifact transforms
1 parent 433ac63 commit b639f91

File tree

14 files changed

+297
-81
lines changed

14 files changed

+297
-81
lines changed

build.gradle.kts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ repositories {
1717
val mcVer = "1.21.5"
1818

1919
dependencies {
20-
implementation(minecraft.of {
21-
client()
22-
version(mcVer)
23-
})
20+
implementation(minecraft.client(mcVer))
2421

2522
compileOnly(cichlid.api("0.3.2"))
2623
cichlidRuntime(cichlid.runtime("0.3.2"))

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
org.gradle.jvmargs = -Xmx3G
1+
org.gradle.jvmargs = -Xmx8G
22
org.gradle.caching=true
33
org.gradle.configuration-cache=true
44
cichlid.use_project_cache=true

plugin/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ repositories {
1717
dependencies {
1818
implementation("io.github.cichlidmc:DistributionMarker:1.0.1")
1919
implementation("io.github.cichlidmc:PistonMetaParser:2.0.2")
20+
implementation("io.github.cichlidmc:sushi:0.1.0")
2021
implementation("net.neoforged:AutoRenamingTool:2.0.3")
2122
implementation("org.ow2.asm:asm-tree:9.7")
23+
implementation("org.vineflower:vineflower:1.11.1")
2224
}
2325

2426
tasks.named("shadowJar", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class) {

plugin/src/main/java/io/github/cichlidmc/cichlid_gradle/CichlidGradlePlugin.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import io.github.cichlidmc.cichlid_gradle.extension.repo.CichlidReposExtension;
88
import io.github.cichlidmc.cichlid_gradle.extension.repo.MinecraftReposExtension;
99
import io.github.cichlidmc.cichlid_gradle.run.RunTaskGeneration;
10-
import io.github.cichlidmc.cichlid_gradle.transform.TransformedAttribute;
1110
import org.gradle.api.NamedDomainObjectProvider;
1211
import org.gradle.api.Plugin;
1312
import org.gradle.api.Project;
@@ -31,7 +30,7 @@ public void apply(Project project) {
3130
CichlidDepsExtension.setup(project);
3231
MinecraftDepsExtension.setup(project);
3332
RunTaskGeneration.setup(project);
34-
TransformedAttribute.setup(project);
33+
// TransformedAttribute.setup(project);
3534

3635
ConfigurationContainer configurations = project.getConfigurations();
3736
setupConfigurations(configurations);
@@ -59,7 +58,7 @@ private static void setupConfigurations(ConfigurationContainer configurations) {
5958
configurations.named("runtimeClasspath", runtime -> runtime.extendsFrom(cichlidRuntime.get()));
6059

6160
// compile classpath must be transformed
62-
configurations.named("compileClasspath", compile -> compile.getAttributes().attribute(TransformedAttribute.INSTANCE, true));
61+
// configurations.named("compileClasspath", compile -> compile.getAttributes().attribute(TransformedAttribute.INSTANCE, true));
6362
}
6463

6564
private static boolean isMinecraftDependency(Dependency dep) {
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package io.github.cichlidmc.cichlid_gradle.cache.task.impl;
2+
3+
import io.github.cichlidmc.cichlid_gradle.cache.task.CacheTask;
4+
import io.github.cichlidmc.cichlid_gradle.cache.task.TaskContext;
5+
import io.github.cichlidmc.cichlid_gradle.util.Distribution;
6+
import io.github.cichlidmc.cichlid_gradle.util.Utils;
7+
import org.jetbrains.java.decompiler.main.Fernflower;
8+
import org.jetbrains.java.decompiler.main.decompiler.SingleFileSaver;
9+
import org.jetbrains.java.decompiler.main.extern.IFernflowerLogger;
10+
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
11+
import org.jetbrains.java.decompiler.main.extern.IResultSaver;
12+
import org.jetbrains.java.decompiler.main.plugins.JarPluginLoader;
13+
14+
import java.io.File;
15+
import java.io.IOException;
16+
import java.net.URI;
17+
import java.nio.file.FileSystem;
18+
import java.nio.file.FileSystems;
19+
import java.nio.file.Path;
20+
import java.util.Collections;
21+
import java.util.HashMap;
22+
import java.util.Map;
23+
24+
public final class DecompileTask extends CacheTask {
25+
public static final Map<String, Object> PREFERENCES = Utils.make(() -> {
26+
Map<String, Object> preferences = new HashMap<>(IFernflowerPreferences.DEFAULTS);
27+
preferences.put(IFernflowerPreferences.INDENT_STRING, "\t");
28+
return Collections.unmodifiableMap(preferences);
29+
});
30+
31+
private final Path jar;
32+
33+
public DecompileTask(TaskContext context, Distribution dist, Path jar) {
34+
super("Decompile " + dist, "Decompiling " + dist, context);
35+
this.jar = jar;
36+
}
37+
38+
@Override
39+
protected void doRun() throws IOException {
40+
String outputName = this.jar.getFileName().toString().replace(".jar", "-sources.jar");
41+
Path output = this.jar.resolveSibling(outputName);
42+
43+
closeVineflowerFilesystem();
44+
45+
IResultSaver saver = new SingleFileSaver(output.toFile());
46+
Fernflower decompiler = new Fernflower(saver, PREFERENCES, IFernflowerLogger.NO_OP);
47+
try {
48+
decompiler.addSource(this.jar.toFile());
49+
decompiler.decompileContext();
50+
decompiler.clearContext();
51+
} catch (Throwable t) {
52+
t.printStackTrace();
53+
}
54+
}
55+
56+
private static void closeVineflowerFilesystem() {
57+
// vineflower loads plugins from its jar, and it opens that filesystem with newFileSystem.
58+
// but that throws if the filesystem is already open, which it will be after the first cold run.
59+
// close it now to avoid an ugly useless error later.
60+
61+
try {
62+
File vfJar = new File(JarPluginLoader.class.getProtectionDomain().getCodeSource().getLocation().toURI());
63+
if (vfJar.exists() && !vfJar.isDirectory() && vfJar.getPath().endsWith(".jar")) {
64+
URI uri = URI.create("jar:" + vfJar.toURI());
65+
// this will throw if it's not open
66+
FileSystem fs = FileSystems.getFileSystem(uri);
67+
68+
fs.close();
69+
}
70+
} catch (Exception ignored) {}
71+
}
72+
}

plugin/src/main/java/io/github/cichlidmc/cichlid_gradle/cache/task/impl/GenerateMetadataTask.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,14 @@
1010
import io.github.cichlidmc.pistonmetaparser.FullVersion;
1111
import io.github.cichlidmc.pistonmetaparser.rule.Features;
1212
import io.github.cichlidmc.pistonmetaparser.rule.Rule;
13-
import io.github.cichlidmc.pistonmetaparser.version.library.Artifact;
14-
import io.github.cichlidmc.pistonmetaparser.version.library.Classifier;
1513
import io.github.cichlidmc.pistonmetaparser.version.library.Library;
16-
import io.github.cichlidmc.pistonmetaparser.version.library.Natives;
17-
import org.jetbrains.annotations.Nullable;
1814

1915
import java.io.IOException;
2016
import java.nio.file.Path;
2117
import java.util.ArrayList;
2218
import java.util.HashMap;
2319
import java.util.List;
2420
import java.util.Map;
25-
import java.util.Optional;
2621

2722
public class GenerateMetadataTask extends CacheTask {
2823
private final Distribution dist;

plugin/src/main/java/io/github/cichlidmc/cichlid_gradle/cache/task/impl/MergeTask.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.github.cichlidmc.cichlid_gradle.cache.task.TaskContext;
55
import io.github.cichlidmc.cichlid_gradle.merge.JarMerger;
66
import io.github.cichlidmc.cichlid_gradle.merge.MergeSource;
7+
import io.github.cichlidmc.cichlid_gradle.util.Distribution;
78

89
import java.io.IOException;
910
import java.nio.file.Path;
@@ -22,6 +23,6 @@ protected MergeTask(TaskContext context, List<MergeSource> sources, Path output)
2223
@Override
2324
protected void doRun() throws IOException {
2425
JarMerger.merge(this.sources, this.output);
25-
// TODO: decompile
26+
this.context.submit(new DecompileTask(this.context, Distribution.MERGED, this.output));
2627
}
2728
}

plugin/src/main/java/io/github/cichlidmc/cichlid_gradle/cache/task/impl/SetupDistTask.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ protected void doRun() throws IOException {
9090
this.context.submit(new GenerateServerRunTemplateTask(this.context, this.storage));
9191
}
9292

93-
// TODO: decomp
93+
this.context.submit(new DecompileTask(this.context, this.dist, jar));
9494
}
9595

9696
private void tryUnbundle(Path serverTempJar) throws IOException {
@@ -100,7 +100,7 @@ private void tryUnbundle(Path serverTempJar) throws IOException {
100100
return;
101101

102102
if (!format.equals("1.0")) {
103-
logger.warn("Server bundle uses an untested format, this may not go well.");
103+
this.logger.warn("Server bundle uses an untested format, this may not go well.");
104104
}
105105
}
106106

@@ -125,6 +125,6 @@ private void tryUnbundle(Path serverTempJar) throws IOException {
125125
Files.copy(realServer, serverTempJar);
126126
}
127127

128-
// TODO: decomp bundler
128+
this.context.submit(new DecompileTask(this.context, Distribution.BUNDLER, bundler));
129129
}
130130
}

plugin/src/main/java/io/github/cichlidmc/cichlid_gradle/extension/dep/MinecraftSpecImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.cichlidmc.cichlid_gradle.extension.dep;
22

3+
import io.github.cichlidmc.cichlid_gradle.transform.TransformedAttribute;
34
import io.github.cichlidmc.cichlid_gradle.util.Distribution;
45
import org.gradle.api.InvalidUserDataException;
56
import org.gradle.api.artifacts.ExternalModuleDependency;
@@ -28,7 +29,9 @@ public ExternalModuleDependency createDependencyOrThrow(DependencyFactory factor
2829
throw new InvalidUserDataException("Minecraft version is not specified.");
2930
}
3031

31-
return factory.create("net.minecraft", "minecraft-" + this.dist.name, this.version);
32+
ExternalModuleDependency dep = factory.create("net.minecraft", "minecraft-" + this.dist.name, this.version);
33+
// dep.attributes(attrs -> attrs.attribute(TransformedAttribute.INSTANCE, true));
34+
return dep;
3235
}
3336

3437
@Override
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.github.cichlidmc.cichlid_gradle.transform;
2+
3+
import org.gradle.api.artifacts.transform.InputArtifact;
4+
import org.gradle.api.artifacts.transform.TransformAction;
5+
import org.gradle.api.artifacts.transform.TransformOutputs;
6+
import org.gradle.api.artifacts.transform.TransformParameters;
7+
import org.gradle.api.file.FileSystemLocation;
8+
import org.gradle.api.provider.Provider;
9+
import org.gradle.api.tasks.PathSensitive;
10+
import org.gradle.api.tasks.PathSensitivity;
11+
12+
import java.io.File;
13+
import java.io.IOException;
14+
import java.nio.file.Files;
15+
16+
public abstract class MinecraftSourcesTransformAction implements TransformAction<TransformParameters.None> {
17+
@InputArtifact
18+
@PathSensitive(PathSensitivity.NAME_ONLY)
19+
public abstract Provider<FileSystemLocation> getInput();
20+
21+
@Override
22+
public void transform(TransformOutputs outputs) {
23+
File input = this.getInput().get().getAsFile();
24+
System.out.println("transforming sources! " + input);
25+
26+
String name = input.getName().replace(".jar", "-transformed.jar");
27+
File output = outputs.file(name);
28+
29+
try {
30+
Files.copy(input.toPath(), output.toPath());
31+
} catch (IOException e) {
32+
throw new RuntimeException(e);
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)