Skip to content

Commit 6f56d11

Browse files
committed
Add Facade Support Closes #1067
Add Extra Mavenizer arguments support Closes #1068 Bump Mavenizer fixes 1.12.2 Side.BUKKIT issue
1 parent 130e56d commit 6f56d11

File tree

9 files changed

+126
-5
lines changed

9 files changed

+126
-5
lines changed

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ gradle.beforeProject { Project project ->
2424

2525
//@formatter:off
2626
dependencyResolutionManagement.versionCatalogs.register('libs') {
27-
version 'gradleutils', '3.4.3'
27+
version 'gradleutils', '3.4.5'
2828

2929
plugin 'licenser', 'net.minecraftforge.licenser' version '1.2.0' // https://plugins.gradle.org/plugin/net.minecraftforge.licenser
3030
plugin 'gradleutils', 'net.minecraftforge.gradleutils' versionRef 'gradleutils'

src/main/java/net/minecraftforge/gradle/MinecraftDependency.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import net.minecraftforge.gradleutils.shared.Closures;
1212
import org.gradle.api.Action;
1313
import org.gradle.api.NamedDomainObjectContainer;
14+
import org.gradle.api.file.ConfigurableFileCollection;
15+
import org.gradle.api.provider.ListProperty;
1416

1517
/// The Minecraft dependency contains information essential for how the
1618
/// {@linkplain MinecraftExtensionForProject minecraft extension} processes Minecraft dependencies.
@@ -37,4 +39,21 @@ default void runs(
3739
default void runs(Action<? super NamedDomainObjectContainer<? extends SlimeLauncherOptions>> action) {
3840
this.runs(Closures.action(this, action));
3941
}
42+
43+
/// Gets the Facade configuration files to use.
44+
///
45+
/// Files must be in the format supported by the [Facade](https://github.com/minecraftforge/facade) project.
46+
///
47+
/// This is only supported when using Mavenizer >= 0.4.56
48+
///
49+
/// @return The property for the configuration files to use
50+
///
51+
ConfigurableFileCollection getFacade();
52+
53+
/// Gets any *extra* arguments to be passed to the Mavenizer invocation.
54+
/// These arguments will be added after all other args.
55+
/// This is useful if using a version of Mavenizer that hasn't had a feature exposed to ForgeGradle yet
56+
///
57+
/// @return A list of extra arguments to pass to Mavenizer
58+
ListProperty<String> getMavenizerArguments();
4059
}

src/main/java/net/minecraftforge/gradle/internal/ClosureOwnerInternal.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.gradle.api.attributes.AttributeContainer;
2727
import org.gradle.api.capabilities.Capability;
2828
import org.gradle.api.file.ConfigurableFileCollection;
29+
import org.gradle.api.provider.ListProperty;
2930
import org.gradle.api.reflect.HasPublicType;
3031
import org.gradle.api.reflect.TypeOf;
3132
import org.jspecify.annotations.Nullable;
@@ -109,6 +110,16 @@ default ConfigurableFileCollection getAccessTransformers() {
109110
return this.getOwnerDelegate().getAccessTransformers();
110111
}
111112

113+
@Override
114+
default ConfigurableFileCollection getFacade() {
115+
return this.getOwnerDelegate().getFacade();
116+
}
117+
118+
@Override
119+
default ListProperty<String> getMavenizerArguments() {
120+
return this.getOwnerDelegate().getMavenizerArguments();
121+
}
122+
112123
@Override
113124
default void setAccessTransformer(String accessTransformer) {
114125
this.getOwnerDelegate().setAccessTransformer(accessTransformer);

src/main/java/net/minecraftforge/gradle/internal/Constants.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
package net.minecraftforge.gradle.internal;
66

7+
import org.apache.maven.artifact.versioning.ComparableVersion;
8+
79
/// The package-private constants used throughout ForgeGradle.
810
///
911
/// Looking for attributes? They are in [ForgeGradleExtension.Attributes].
@@ -73,4 +75,17 @@ please see our MDKExamples repo (https://github.com/MinecraftForge/MDKExamples).
7375
7476
For more information, see https://docs.minecraftforge.net/en/fg-7.0/magic/""";
7577
}
78+
79+
static class Mavenizer {
80+
/*
81+
* Add support for --facade configs, a system that allows consumers to attach interfaces to the dependency.
82+
* https://github.com/MinecraftForge/MinecraftMavenizer/commit/610bb2b11d6999e98d44cc4a87ec926e68d26a37
83+
*/
84+
static final ComparableVersion SUPPORTS_FACADES = new ComparableVersion("0.4.61");
85+
86+
/*
87+
* Also added --local-cache which is a project specific caching folder, used for post processors such as ATs and Facades
88+
*/
89+
static final ComparableVersion SUPPORTS_LOCAL_CACHE = new ComparableVersion("0.4.56");
90+
}
7691
}

src/main/java/net/minecraftforge/gradle/internal/ForgeGradleProblems.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,21 @@ RuntimeException accessTransformersNotOnClasspath(Throwable e) {
282282
}
283283
//endregion
284284

285+
//region Facades
286+
void reportFacadesNotSupported(String dependency) {
287+
this.report("mavenizer-out-of-date-facade", "Mavenizer Tool doesn't support facades", spec -> spec
288+
.details("""
289+
The Mavenizer configured for this project does not support Facades.
290+
Any facade configured to be used, will be skipped.
291+
This may result in compile or runtime errors.
292+
Configured Version:\s""" + dependency)
293+
.severity(Severity.ERROR)
294+
.solution("Update mavenizer to >=" + Constants.Mavenizer.SUPPORTS_FACADES + " or remove manual override.")
295+
.solution("Remove Facade config if not needed.")
296+
.solution(HELP_MESSAGE));
297+
}
298+
//endregion
299+
285300
//region Message Board
286301
void reportMessageBoardCacheBroken(Throwable e, File file, String property) {
287302
this.report("message-board-cache-broken", "ForgeGradle's message board cannot save data", spec -> spec

src/main/java/net/minecraftforge/gradle/internal/MavenizerInstanceImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,13 @@ private Provider<String> get(String key, @Nullable String _default, String requi
6262
return this.invoke.getting(key)
6363
.orElse(this.extension.getProviders().provider(() -> {
6464
// This should only happen when someone hardcodes their tool version, warn them
65-
var message = "Mavenizer did not output expected json data " + key +", Make sure you're using Mavenizer >= " + requiredVersion;
65+
var version = this.extension.plugin.getTool(Tools.MAVENIZER).getModule();
66+
var message = "Mavenizer did not output expected json data " + key + ", Make sure you're using Mavenizer >= " + requiredVersion + " using " + version;
6667
if (_default != null) {
6768
LOGGER.warn(message);
6869
return _default;
6970
}
70-
throw new IllegalStateException("Mavenizer did not output expected json data " + key +", Make sure you're using Mavenizer >= " + requiredVersion);
71+
throw new IllegalStateException(message);
7172
}));
7273
}
7374

src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.gradle.api.file.ProjectLayout;
2525
import org.gradle.api.model.ObjectFactory;
2626
import org.gradle.api.plugins.ExtensionAware;
27+
import org.gradle.api.provider.ListProperty;
2728
import org.gradle.api.provider.Property;
2829
import org.gradle.api.tasks.SourceSet;
2930
import org.gradle.api.tasks.TaskProvider;
@@ -51,6 +52,11 @@ abstract class MinecraftDependencyImpl implements MinecraftDependencyInternal {
5152
private final ConfigurableFileCollection accessTransformer = this.getObjects().fileCollection();
5253
private final Property<String> accessTransformerPath = this.getObjects().property(String.class);
5354

55+
// Facades
56+
private final ConfigurableFileCollection facade = this.getObjects().fileCollection();
57+
// Extra Mavenizer Arguments
58+
private final ListProperty<String> extraMavenizerArguments = this.getObjects().listProperty(String.class);
59+
5460
// Dependency Information
5561
private final Property<String> asString = getObjects().property(String.class);
5662
private final Property<String> asPath = getObjects().property(String.class);
@@ -71,6 +77,8 @@ abstract class MinecraftDependencyImpl implements MinecraftDependencyInternal {
7177
public MinecraftDependencyImpl(String mavenizerName) {
7278
this.mavenizerName = mavenizerName;
7379
this.mappings.convention(minecraft.getMappingsProperty());
80+
this.facade.convention(minecraft.getFacade());
81+
this.extraMavenizerArguments.convention(minecraft.getMavenizerArguments());
7482
}
7583

7684
// Can be nullable due to configuration caching.
@@ -151,6 +159,16 @@ public Property<String> getAccessTransformerPath() {
151159
return this.accessTransformerPath;
152160
}
153161

162+
@Override
163+
public ConfigurableFileCollection getFacade() {
164+
return this.facade;
165+
}
166+
167+
@Override
168+
public ListProperty<String> getMavenizerArguments() {
169+
return this.extraMavenizerArguments;
170+
}
171+
154172
/* INTERNAL */
155173

156174
private boolean hasAccessTransformers() {

src/main/java/net/minecraftforge/gradle/internal/MinecraftExtensionImpl.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import net.minecraftforge.gradle.MinecraftExtensionForProject;
1515
import net.minecraftforge.gradle.MinecraftMappings;
1616
import net.minecraftforge.gradle.SlimeLauncherOptions;
17+
import org.apache.maven.artifact.versioning.ComparableVersion;
1718
import org.gradle.api.Action;
1819
import org.gradle.api.NamedDomainObjectContainer;
1920
import org.gradle.api.Project;
@@ -36,6 +37,7 @@
3637
import org.gradle.api.model.ObjectFactory;
3738
import org.gradle.api.plugins.ExtensionAware;
3839
import org.gradle.api.plugins.JavaPluginExtension;
40+
import org.gradle.api.provider.ListProperty;
3941
import org.gradle.api.provider.Property;
4042
import org.gradle.api.provider.ProviderFactory;
4143
import org.gradle.api.reflect.TypeOf;
@@ -182,6 +184,11 @@ static abstract class ForProjectImpl extends MinecraftExtensionImpl implements F
182184
private final ConfigurableFileCollection accessTransformer = getObjects().fileCollection();
183185
private final Property<String> accessTransformerPath = getObjects().property(String.class);
184186

187+
// Facades
188+
private final ConfigurableFileCollection facades = getObjects().fileCollection();
189+
// Extra Mavenizer Arguments
190+
private final ListProperty<String> extraMavenizerArguments = this.getObjects().listProperty(String.class);
191+
185192
private final ForgeGradleProblems problems = getObjects().newInstance(ForgeGradleProblems.class);
186193

187194
protected abstract @Inject Project getProject();
@@ -277,6 +284,16 @@ public Property<String> getAccessTransformerPath() {
277284
return this.accessTransformerPath;
278285
}
279286

287+
@Override
288+
public ConfigurableFileCollection getFacade() {
289+
return this.facades;
290+
}
291+
292+
@Override
293+
public ListProperty<String> getMavenizerArguments() {
294+
return this.extraMavenizerArguments;
295+
}
296+
280297
@Override
281298
public List<? extends MavenArtifactRepository> getRepositories() {
282299
var repositoriesMode = getDependencyResolutionManagement().getRepositoriesMode().getOrElse(RepositoriesMode.PREFER_PROJECT);
@@ -399,6 +416,7 @@ public MavenizerInstance dependency(
399416
var mavenizer = this.getProviders().of(MavenizerValueSource.class, spec -> {
400417
spec.parameters(params -> {
401418
var tool = this.plugin.getTool(Tools.MAVENIZER);
419+
var toolVersion = new ComparableVersion(tool.getModule().getVersion());
402420
params.getClasspath().setFrom(tool.getClasspath());
403421
params.getJavaLauncher().set(tool.getJavaLauncher().map(JavaLauncher::getExecutablePath));
404422
params.getArguments().set(this.getProviders().provider(() -> {
@@ -407,6 +425,10 @@ public MavenizerInstance dependency(
407425
.map(this.problems.ensureFileLocation());
408426
var cache = toolCache.get().dir("caches").getAsFile().getAbsolutePath();
409427

428+
var localToolCache = this.plugin.localCaches()
429+
.dir(tool.getName().toLowerCase(Locale.ENGLISH))
430+
.map(this.problems.ensureFileLocation());
431+
410432
var ret = new ArrayList<>(List.of(
411433
"--maven",
412434
"--cache", cache,
@@ -422,7 +444,7 @@ public MavenizerInstance dependency(
422444
ret.add("--ignore-cache");
423445

424446
// If we are finding the access transformer from sourcesets, just find from any source set
425-
// We can't filter by configurations becase the config cache doesn't like that.
447+
// We can't filter by configurations because the config cache doesn't like that.
426448
// So if users fuck up, then we can output a warning, or they can manually set the AT file.
427449
// This is a 'best effort'
428450
var sourceSets = getProject().getExtensions().getByType(JavaPluginExtension.class).getSourceSets();
@@ -449,6 +471,26 @@ else if (!"official".equals(mappings.getChannel()))
449471
ret.add("--repository");
450472
ret.add(repo.getName() + ',' + url);
451473
}
474+
475+
if (!minecraftDependency.getFacade().isEmpty()) {
476+
if (toolVersion.compareTo(Constants.Mavenizer.SUPPORTS_FACADES) < 0) {
477+
problems.reportFacadesNotSupported(tool.getModule().toString());
478+
} else {
479+
for (var cfg : minecraftDependency.getFacade()) {
480+
ret.add("--facade-config");
481+
ret.add(cfg.getAbsolutePath());
482+
}
483+
}
484+
}
485+
486+
if (toolVersion.compareTo(Constants.Mavenizer.SUPPORTS_LOCAL_CACHE) >= 0) {
487+
ret.add("--local-cache");
488+
ret.add(localToolCache.get().getAsFile().getAbsolutePath());
489+
}
490+
491+
// Make sure to do this at the very end
492+
ret.addAll(minecraftDependency.getMavenizerArguments().getOrElse(Collections.emptyList()));
493+
452494
return ret;
453495
}));
454496
});

src/main/java/net/minecraftforge/gradle/internal/Tools.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ private Tools() { }
1111

1212
static final Tool SLIMELAUNCHER = Tool.ofForge("slimelauncher", "net.minecraftforge:slime-launcher:0.1.12", 8, "net.minecraftforge.launcher.Main");
1313

14-
static final Tool MAVENIZER = Tool.ofForge("mavenizer", "net.minecraftforge:minecraft-mavenizer:0.4.55", 25, "net.minecraftforge.mcmaven.cli.Main");
14+
static final Tool MAVENIZER = Tool.ofForge("mavenizer", "net.minecraftforge:minecraft-mavenizer:0.4.61", 25, "net.minecraftforge.mcmaven.cli.Main");
1515
}

0 commit comments

Comments
 (0)