Skip to content

Commit 043de02

Browse files
committed
Fix extractInheritance
Rewrite CheckAts Rewrite shim jar tasks Add access to Vanilla files from MCP extension
1 parent 4d4a206 commit 043de02

File tree

19 files changed

+1064
-491
lines changed

19 files changed

+1064
-491
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,4 @@ gradle-app.setting
7575

7676
# Local Repository
7777
repo/
78+
/forgedev.iml

src/main/groovy/net/minecraftforge/forgedev/ForgeDevExtension.java

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
*/
55
package net.minecraftforge.forgedev;
66

7-
import net.minecraftforge.forgedev.legacy.tasks.DownloadDependency;
7+
import net.minecraftforge.forgedev.legacy.tasks.Util;
88
import net.minecraftforge.forgedev.legacy.values.CIRuntime;
9+
import net.minecraftforge.forgedev.tasks.checks.CheckTask;
910
import net.minecraftforge.forgedev.tasks.compat.LegacyExtractZip;
1011
import net.minecraftforge.forgedev.tasks.compat.LegacyMergeFilesTask;
1112
import net.minecraftforge.forgedev.tasks.filtering.LegacyFilterNewJar;
@@ -26,9 +27,11 @@
2627
import net.minecraftforge.forgedev.tasks.patching.diff.BakePatches;
2728
import net.minecraftforge.forgedev.tasks.patching.diff.GeneratePatches;
2829
import net.minecraftforge.forgedev.tasks.sas.CreateFakeSASPatches;
30+
import net.minecraftforge.forgedev.tasks.shim.Shim;
2931
import net.minecraftforge.forgedev.tasks.srg2source.ApplyRangeMap;
3032
import net.minecraftforge.forgedev.tasks.srg2source.ExtractRangeMap;
3133
import net.minecraftforge.gradleutils.shared.Closures;
34+
import org.codehaus.groovy.runtime.StringGroovyMethods;
3235
import org.gradle.api.Action;
3336
import org.gradle.api.Project;
3437
import org.gradle.api.artifacts.Configuration;
@@ -38,7 +41,6 @@
3841
import org.gradle.api.attributes.Attribute;
3942
import org.gradle.api.file.Directory;
4043
import org.gradle.api.file.DirectoryProperty;
41-
import org.gradle.api.file.DuplicatesStrategy;
4244
import org.gradle.api.file.ProjectLayout;
4345
import org.gradle.api.model.ObjectFactory;
4446
import org.gradle.api.plugins.JavaPlugin;
@@ -51,7 +53,6 @@
5153
import org.gradle.api.tasks.bundling.Jar;
5254
import org.gradle.api.tasks.bundling.Zip;
5355
import org.gradle.api.tasks.compile.JavaCompile;
54-
import org.gradle.internal.Actions;
5556
import org.gradle.language.base.plugins.LifecycleBasePlugin;
5657
import org.gradle.plugins.ide.eclipse.model.EclipseModel;
5758
import org.jetbrains.annotations.VisibleForTesting;
@@ -106,35 +107,84 @@ public DirectoryProperty getMavenizerRepo() {
106107
return this.mavenizerRepo;
107108
}
108109

110+
public boolean isCi() {
111+
return this.isCi.get();
112+
}
113+
109114
private Configuration minecraftDepsConfiguration;
110115
public Configuration getMinecraftConfiguration() {
111116
return this.minecraftDepsConfiguration;
112117
}
118+
// Tasks creation helpers
113119

120+
// =====================================================================
114121
public Installer installer() {
115122
return installer(Installer.DEFAULT_NAME);
116123
}
117124
public Installer installer(Action<Installer> action) {
118125
return installer(Installer.DEFAULT_NAME, action);
119126
}
120127
public Installer installer(String name) {
121-
return installer(name, i -> {});
128+
return installer(name, Util.noop());
122129
}
123130
public Installer installer(String name, Action<Installer> action) {
124131
var ret = Installer.register(this.project, this, name);
125132
action.execute(ret);
126133
return ret;
127134
}
135+
// =====================================================================
136+
137+
// =====================================================================
138+
// 'Check' and 'Fix' tasks, Registers the same task twice with a 'fix'
139+
// boolean input. Registers the 'check{Name}' version to the 'check' group
140+
// and the 'checkAndFix{Name}' task to the 'checkAndFix' group.
141+
// =====================================================================
142+
public <T extends CheckTask> void check(String taskName, Class<T> clazz) {
143+
check(taskName, clazz, Util.noop());
144+
}
145+
public <T extends CheckTask> void check(String taskName, Class<T> clazz, Action<? super T> action) {
146+
var tasks = this.project.getTasks();
147+
taskName = StringGroovyMethods.capitalize(taskName);
128148

129-
public boolean isCi() {
130-
return this.isCi.get();
149+
var check = tasks.register("check" + taskName, clazz, task -> {
150+
action.execute(task);
151+
task.getFix().set(false);
152+
});
153+
tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME, task -> task.dependsOn(check));
154+
155+
var checkAndFix = tasks.register("checkAndFix" + taskName, clazz, task -> {
156+
action.execute(task);
157+
task.getFix().set(true);
158+
});
159+
tasks.named("checkAndFix", task -> task.dependsOn(checkAndFix));
131160
}
161+
// ===============================================================================
162+
163+
public Shim shim() {
164+
return shim(Util.noop());
165+
}
166+
public Shim shim(Action<Shim> action) {
167+
return shim(Shim.DEFAULT_NAME, action);
168+
}
169+
public Shim shim(String name) {
170+
return shim(name, Util.noop());
171+
}
172+
public Shim shim(String name, Action<Shim> action) {
173+
var ret = Shim.register(this.project, this, name);
174+
action.execute(ret);
175+
return ret;
176+
}
177+
// ===============================================================================
178+
179+
180+
132181

182+
@SuppressWarnings("removal")
133183
private void setup(ForgeDevPlugin plugin, Project project) {
134184
var tasks = project.getTasks();
135185

136186
var legacyPatcher = project.getExtensions().create(LegacyPatcherExtension.EXTENSION_NAME, LegacyPatcherExtension.class);
137-
var legacyMcp = project.getExtensions().create(LegacyMCPExtension.EXTENSION_NAME, LegacyMCPExtension.class);
187+
var legacyMcp = project.getExtensions().create(LegacyMCPExtension.EXTENSION_NAME, LegacyMCPExtension.class, plugin);
138188
var java = project.getExtensions().getByType(JavaPluginExtension.class);
139189

140190
var jar = tasks.named(JavaPlugin.JAR_TASK_NAME, Jar.class);

src/main/groovy/net/minecraftforge/forgedev/LegacyMCPExtension.java

Lines changed: 135 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,50 @@
44
*/
55
package net.minecraftforge.forgedev;
66

7-
import org.gradle.api.Project;
7+
import net.minecraftforge.forgedev.legacy.values.MavenInfo;
8+
import net.minecraftforge.forgedev.tasks.mcp.MCPSetupFiles;
9+
import net.minecraftforge.gradleutils.shared.EnhancedProblems;
10+
import net.minecraftforge.util.data.json.JsonData;
11+
import org.gradle.api.Transformer;
12+
import org.gradle.api.file.RegularFile;
813
import org.gradle.api.model.ObjectFactory;
914
import org.gradle.api.provider.Property;
1015
import org.gradle.api.provider.Provider;
1116
import org.gradle.api.provider.ProviderFactory;
17+
import org.gradle.jvm.toolchain.JavaLauncher;
1218

1319
import javax.inject.Inject;
20+
import java.util.ArrayList;
21+
import java.util.HashMap;
22+
import java.util.List;
23+
import java.util.Locale;
24+
import java.util.Map;
1425

1526
public abstract class LegacyMCPExtension {
1627
public static final String EXTENSION_NAME = "mcp";
1728

1829
private final Property<String> config = this.getObjects().property(String.class);
1930
private final Property<String> version = this.getObjects().property(String.class).value(
20-
config.map(s -> (s.endsWith("@zip") ? s.substring(0, s.length() - "@zip".length()) : s).split(":")[2])
31+
config.map(s -> MavenInfo.from(s).art().version())
2132
);
33+
private final Map<String, MinecraftFiles> files = new HashMap<>();
34+
private final ForgeDevPlugin plugin;
2235

2336
protected abstract @Inject ObjectFactory getObjects();
24-
2537
protected abstract @Inject ProviderFactory getProviders();
2638

39+
private final Problems problems = getObjects().newInstance(Problems.class);
40+
public static abstract class Problems extends EnhancedProblems {
41+
@Inject
42+
public Problems() {
43+
super(ForgeDevPlugin.NAME + '.' + EXTENSION_NAME, ForgeDevPlugin.DISPLAY_NAME + " - MCP");
44+
}
45+
}
46+
2747
@Inject
28-
public LegacyMCPExtension() { }
48+
public LegacyMCPExtension(ForgeDevPlugin plugin) {
49+
this.plugin = plugin;
50+
}
2951

3052
public Property<String> getConfig() {
3153
return this.config;
@@ -50,4 +72,113 @@ public void setConfig(String value) {
5072
}
5173

5274
public abstract Property<String> getPipeline();
75+
76+
public String getArtifact() {
77+
return this.getConfig().get();
78+
}
79+
80+
public Provider<String> getArtifact(String classifier) {
81+
return getArtifact(classifier, "jar");
82+
}
83+
public Provider<String> getArtifact(String classifier, String extension) {
84+
return this.getConfig().map(str -> {
85+
var info = MavenInfo.from(str).art();
86+
var _new = MavenInfo.from(info.group(), info.name(), info.version(), classifier, extension);
87+
return _new.name();
88+
});
89+
}
90+
91+
public MinecraftFiles getFiles() {
92+
return getFiles(getVersion().get());
93+
}
94+
public MinecraftFiles getFiles(String version) {
95+
var ret = this.files.get(version);
96+
if (ret == null) {
97+
//var client = mavenizer("client", version, false);
98+
//var server = mavenizer("server", version, false);
99+
var joined = mavenizer("joined", version, false);
100+
101+
ret = getObjects().newInstance(MinecraftFiles.class, plugin, joined);
102+
this.files.put(version, ret);
103+
}
104+
return ret;
105+
}
106+
107+
private Provider<MCPSetupFiles> mavenizer(String pipeline, String version, boolean searge) {
108+
var fileName = "mavenizer/mcp-" + version + "-files-" + pipeline;
109+
if (searge)
110+
fileName += "-searge";
111+
// TODO: [ForgeDevPlugin] Make single mavenizer task to get the 'vanilla' files we need
112+
// We also need a way to get the 'slim' artifacts for older versions which don't use bundled server jar
113+
// Could still name it 'serverExtracted' in the json
114+
var output = this.plugin.localCaches().file("mavenizer/" + fileName + ".jar").get().getAsFile();
115+
var outputJson = this.plugin.localCaches().file("mavenizer/" + fileName + ".json").get().getAsFile();
116+
117+
return this.getProviders().of(MavenizerValueSource.class, spec -> {
118+
spec.parameters(params -> {
119+
var tool = this.plugin.getTool(Tools.MAVENIZER);
120+
params.getClasspath().setFrom(tool.getClasspath());
121+
params.getJavaLauncher().set(tool.getJavaLauncher().map(JavaLauncher::getExecutablePath));
122+
params.getArguments().set(this.getProviders().provider(() -> {
123+
var toolCache = this.plugin.globalCaches()
124+
.dir(tool.getName().toLowerCase(Locale.ENGLISH))
125+
.map(this.problems.ensureFileLocation());
126+
var cache = toolCache.get().dir("caches").getAsFile().getAbsolutePath();
127+
128+
var ret = new ArrayList<>(List.of(
129+
"--mcp",
130+
"--cache", cache,
131+
"--jdk-cache", cache,
132+
"--version", version,
133+
"--raw",
134+
"--pipeline", pipeline,
135+
"--output", output.getAbsolutePath(),
136+
"--output-files", outputJson.getAbsolutePath()
137+
));
138+
if (searge)
139+
ret.add("--searge");
140+
return ret;
141+
}));
142+
});
143+
})
144+
.map(v -> JsonData.fromJson(outputJson, MCPSetupFiles.class));
145+
}
146+
147+
public static abstract class MinecraftFiles {
148+
private final ForgeDevPlugin plugin;
149+
private final Provider<MCPSetupFiles> info;
150+
protected abstract @Inject ObjectFactory getObjects();
151+
protected abstract @Inject ProviderFactory getProviders();
152+
153+
@Inject
154+
public MinecraftFiles(ForgeDevPlugin plugin, Provider<MCPSetupFiles> info) {
155+
this.plugin = plugin;
156+
this.info = info;
157+
}
158+
159+
private Provider<RegularFile> get(Transformer<String, MCPSetupFiles> field) {
160+
return this.info.map(field).flatMap(this.plugin.rootProjectDirectory()::file);
161+
}
162+
public Provider<RegularFile> getLauncherManifest() {
163+
return get(info -> info.versionManifest);
164+
}
165+
public Provider<RegularFile> getVersionJson() {
166+
return get(info -> info.versionJson);
167+
}
168+
public Provider<RegularFile> getClient() {
169+
return get(info -> info.clientRaw);
170+
}
171+
public Provider<RegularFile> getClientMappings() {
172+
return get(info -> info.clientMappings);
173+
}
174+
public Provider<RegularFile> getServer() {
175+
return get(info -> info.serverRaw);
176+
}
177+
public Provider<RegularFile> getServerExtracted() {
178+
return get(info -> info.serverExtracted);
179+
}
180+
public Provider<RegularFile> getServerMappings() {
181+
return get(info -> info.serverMappings);
182+
}
183+
}
53184
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright (c) Forge Development LLC and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
package net.minecraftforge.forgedev;
6+
7+
import org.gradle.api.file.ConfigurableFileCollection;
8+
import org.gradle.api.file.RegularFileProperty;
9+
import org.gradle.api.logging.Logger;
10+
import org.gradle.api.logging.Logging;
11+
import org.gradle.api.provider.ListProperty;
12+
import org.gradle.api.provider.ValueSource;
13+
import org.gradle.api.provider.ValueSourceParameters;
14+
import org.gradle.process.ExecOperations;
15+
import org.jspecify.annotations.Nullable;
16+
17+
import javax.inject.Inject;
18+
19+
abstract class MavenizerValueSource implements ValueSource<Boolean, MavenizerValueSource.Parameters> {
20+
interface Parameters extends ValueSourceParameters {
21+
ConfigurableFileCollection getClasspath();
22+
RegularFileProperty getJavaLauncher();
23+
ListProperty<String> getArguments();
24+
}
25+
26+
private final ExecOperations execOps;
27+
private static final Logger LOGGER = Logging.getLogger(MavenizerValueSource.class);
28+
29+
@Inject
30+
public MavenizerValueSource(ExecOperations execOps) {
31+
this.execOps = execOps;
32+
}
33+
34+
@Override
35+
@Nullable
36+
public Boolean obtain() {
37+
this.execOps.javaexec(spec -> {
38+
var params = this.getParameters();
39+
spec.setClasspath(params.getClasspath());
40+
spec.setExecutable(params.getJavaLauncher().get());
41+
spec.setArgs(params.getArguments().get());
42+
43+
LOGGER.info("Executing Mavenizer: ");
44+
var itr = params.getClasspath().iterator();
45+
LOGGER.info(" Classpath: {}", itr.next().getAbsolutePath());
46+
while (itr.hasNext())
47+
LOGGER.info(" {}", itr.next().getAbsolutePath());
48+
49+
LOGGER.info(" Java: {}", params.getJavaLauncher().get().getAsFile().getAbsolutePath());
50+
var args = params.getArguments().get();
51+
var prefix = " Arguments: ";
52+
for (int x = 0; x < args.size(); x++) {
53+
var current = args.get(x);
54+
var next = args.size() > x + 1 ? args.get(x + 1) : null;
55+
var line = current;
56+
if (current.startsWith("--") && next != null && !next.startsWith("--")) {
57+
x++;
58+
line += ' ' + next;
59+
}
60+
LOGGER.info("{}{}", prefix, line);
61+
prefix = " ";
62+
}
63+
}).rethrowFailure().assertNormalExitValue();
64+
return false;
65+
}
66+
}

src/main/groovy/net/minecraftforge/forgedev/Tools.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ private Tools() { }
1515
public static final Tool BINPATCH = Tool.ofForge("binpatcher", "net.minecraftforge:binarypatcher:1.2.2:fatjar", 8);
1616
public static final Tool INSTALLERTOOLS = Tool.ofForge("installertools", "net.minecraftforge:installertools:1.4.4:fatjar", 8);
1717
public static final Tool INSTALLER = Tool.ofForge("installer", "net.minecraftforge:installer:2.2.9:fatjar", 8);
18+
public static final Tool SHIM = Tool.ofForge("shim", "net.minecraftforge:bootstrap-shim:2.1.8", 8);
1819
public static final Tool JARCOMPATIBILITYCHECKER = Tool.ofForge("jarcompatibilitychecker", "net.minecraftforge:JarCompatibilityChecker:0.1.28:all", 8);
1920
public static final Tool RENAMER = Tool.ofForge("renamer", "net.minecraftforge:ForgeAutoRenamingTool:1.1.1:all", 8);
2021
public static final Tool SRG2SRC = Tool.ofForge("srg2source", "net.minecraftforge:Srg2Source:8.1.1:fatjar", 17);

0 commit comments

Comments
 (0)