Skip to content

Commit 2dea382

Browse files
committed
Centralized usage of caches, tools, and utils in the plugin
1 parent b6cb2d0 commit 2dea382

File tree

9 files changed

+137
-121
lines changed

9 files changed

+137
-121
lines changed

src/main/groovy/net/minecraftforge/gradle/ForgeGradleExtensionImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
package net.minecraftforge.gradle;
66

77
import org.gradle.api.plugins.ExtensionAware;
8+
import org.gradle.api.plugins.PluginAware;
89

910
record ForgeGradleExtensionImpl() implements ForgeGradleExtension {
10-
static void register(ExtensionAware target) {
11+
static <T extends ExtensionAware & PluginAware> void register(T target) {
1112
target.getExtensions().add(
1213
ForgeGradleExtension.class,
1314
ForgeGradleExtension.NAME,

src/main/groovy/net/minecraftforge/gradle/ForgeGradlePlugin.groovy

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import groovy.transform.PackageScopeTarget
1111
import org.gradle.api.Plugin
1212
import org.gradle.api.Project
1313
import org.gradle.api.file.ArchiveOperations
14+
import org.gradle.api.file.DirectoryProperty
1415
import org.gradle.api.file.FileSystemOperations
1516
import org.gradle.api.file.ProjectLayout
1617
import org.gradle.api.flow.FlowProviders
@@ -21,7 +22,9 @@ import org.gradle.api.model.ObjectFactory
2122
import org.gradle.api.plugins.ExtensionAware
2223
import org.gradle.api.plugins.PluginAware
2324
import org.gradle.api.problems.Problems
25+
import org.gradle.api.provider.Provider
2426
import org.gradle.api.provider.ProviderFactory
27+
import org.jetbrains.annotations.Nullable
2528

2629
import javax.inject.Inject
2730

@@ -36,7 +39,7 @@ class ForgeGradlePlugin<T extends ExtensionAware & PluginAware> implements Plugi
3639
/** The global logger for ForgeGradle, mostly used within {@link ForgeGradleProblems}. */
3740
static final Logger LOGGER = Logging.getLogger("ForgeGradle")
3841

39-
private final ForgeGradleProblems enhancedProblems
42+
final ForgeGradleProblems enhancedProblems
4043

4144
/**
4245
* The default constructor for the ForgeGradle plugin, which is invoked by Gradle to create this plugin.
@@ -48,6 +51,8 @@ class ForgeGradlePlugin<T extends ExtensionAware & PluginAware> implements Plugi
4851
this.enhancedProblems = new ForgeGradleProblems(this.&getProblems, this.&getProviders)
4952
}
5053

54+
private @Nullable DirectoryProperty globalCaches
55+
5156
/**
5257
* Applies the ForgeGradle plugin to the target.
5358
* <p>The target will have the {@linkplain ForgeGradleExtension ForgeGradle} and
@@ -58,7 +63,7 @@ class ForgeGradlePlugin<T extends ExtensionAware & PluginAware> implements Plugi
5863
*/
5964
@Override
6065
void apply(T target) {
61-
final globalCaches = this.objects.directoryProperty().convention(
66+
this.globalCaches = this.objects.directoryProperty().convention(
6267
this.objects.directoryProperty().fileValue(this.getGradleUserHomeDir(target)).dir(Constants.CACHES_LOCATION).map(this.enhancedProblems.ensureDirectory())
6368
)
6469

@@ -68,8 +73,7 @@ class ForgeGradlePlugin<T extends ExtensionAware & PluginAware> implements Plugi
6873

6974
MinecraftExtensionImpl.register(
7075
target,
71-
globalCaches,
72-
this.enhancedProblems,
76+
this,
7377
this.&getFlowScope,
7478
this.&getFlowProviders,
7579
this.&getObjects,
@@ -80,6 +84,19 @@ class ForgeGradlePlugin<T extends ExtensionAware & PluginAware> implements Plugi
8084
)
8185
}
8286

87+
@PackageScope DirectoryProperty getGlobalCaches() {
88+
try {
89+
Objects.requireNonNull(this.globalCaches)
90+
} catch (Throwable e) {
91+
throw this.enhancedProblems.pluginNotYetApplied(new IllegalStateException("ForgeGradle does not have global caches", e))
92+
}
93+
}
94+
95+
@SuppressWarnings('GrDeprecatedAPIUsage') // Intentional deprecation, please use this method
96+
@PackageScope Provider<File> getTool(Tools tool) {
97+
tool.get(this.globalCaches, this.providers)
98+
}
99+
83100
@CompileDynamic
84101
private File getGradleUserHomeDir(T target) {
85102
try {

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,18 @@ RuntimeException illegalPluginTarget(Exception e) {
8888
.solution("Use a valid plugin target (Project, Settings, Gradle)")
8989
.solution(HELP_MESSAGE));
9090
}
91+
92+
RuntimeException pluginNotYetApplied(Exception e) {
93+
return this.getReporter().throwing(e, id("plugin-not-yet-applied", "ForgeGradle is not applied"), spec -> spec
94+
.details("""
95+
Attempted to get details from the ForgeGradle plugin, but it has not yet been applied to the target.""")
96+
.severity(Severity.ERROR)
97+
.stackLocation()
98+
.solution("Apply the ForgeGradle plugin before attempting to use it from the target's plugin manager.")
99+
.solution("Apply the ForgeGradle plugin before attempting to register any of its tasks that require in-house caching or tools.")
100+
.solution(HELP_MESSAGE)
101+
);
102+
}
91103
//endregion
92104

93105
//region Minecraft

src/main/groovy/net/minecraftforge/gradle/Lazy.java

Lines changed: 0 additions & 81 deletions
This file was deleted.

src/main/groovy/net/minecraftforge/gradle/MinecraftExtensionImpl.groovy

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import groovy.transform.PackageScopeTarget
1212
import groovy.transform.stc.ClosureParams
1313
import groovy.transform.stc.SimpleType
1414
import net.minecraftforge.accesstransformers.gradle.AccessTransformersContainer
15+
import net.minecraftforge.accesstransformers.gradle.AccessTransformersExtension
1516
import net.minecraftforge.util.data.json.JsonData
1617
import net.minecraftforge.util.data.json.RunConfig
1718
import org.gradle.api.NamedDomainObjectContainer
@@ -31,6 +32,7 @@ import org.gradle.api.flow.FlowScope
3132
import org.gradle.api.initialization.Settings
3233
import org.gradle.api.model.ObjectFactory
3334
import org.gradle.api.plugins.ExtensionAware
35+
import org.gradle.api.plugins.PluginAware
3436
import org.gradle.api.provider.MapProperty
3537
import org.gradle.api.provider.Property
3638
import org.gradle.api.provider.Provider
@@ -46,22 +48,18 @@ import java.util.concurrent.Callable
4648
private static final String EXT_MAVEN_REPOS = 'fg_mc_maven_repos'
4749
private static final String EXT_MAPPINGS = 'fg_mc_mappings'
4850

49-
private final ForgeGradleProblems problems
51+
private final ForgeGradlePlugin plugin
5052
private final ObjectFactory objects
5153

52-
// Caches
53-
private final DirectoryProperty globalCaches
54-
5554
// MCMaven
5655
private final DirectoryProperty output
5756

5857
// Dependencies
5958
private final Property<Mappings> mappingsProp
6059

61-
@PackageScope static void register(
62-
ExtensionAware target,
63-
DirectoryProperty globalCaches,
64-
ForgeGradleProblems problems,
60+
@PackageScope static <T extends ExtensionAware & PluginAware> void register(
61+
T target,
62+
ForgeGradlePlugin plugin,
6563
Callable<? extends FlowScope> flowScope,
6664
Callable<? extends FlowProviders> flowProviders,
6765
Callable<? extends ObjectFactory> objects,
@@ -70,7 +68,7 @@ import java.util.concurrent.Callable
7068
Callable<? extends FileSystemOperations> fileSystemOperations,
7169
Callable<? extends ArchiveOperations> archiveOperations
7270
) {
73-
final minecraft = new MinecraftExtensionImpl(globalCaches, problems, objects.call())
71+
final minecraft = new MinecraftExtensionImpl(plugin, objects.call())
7472

7573
if (target instanceof Project) {
7674
target.extensions.add(MinecraftExtension.ForProject, MinecraftExtension.NAME, minecraft.forProject(target, flowScope.call(), flowProviders.call(), layout.call(), providers.call(), fileSystemOperations.call(), archiveOperations.call()))
@@ -81,17 +79,19 @@ import java.util.concurrent.Callable
8179
}
8280
}
8381

84-
private MinecraftExtensionImpl(DirectoryProperty globalCaches, ForgeGradleProblems problems, ObjectFactory objects) {
85-
this.problems = problems
82+
private MinecraftExtensionImpl(ForgeGradlePlugin plugin, ObjectFactory objects) {
83+
this.plugin = plugin
8684
this.objects = objects
8785

88-
this.globalCaches = globalCaches
89-
90-
this.output = objects.directoryProperty().convention(this.globalCaches.dir('mc-maven/output').map(problems.ensureDirectory()))
86+
this.output = objects.directoryProperty().convention(plugin.globalCaches.dir('mc-maven/output').map(problems.ensureDirectory()))
9187

9288
this.mappingsProp = objects.property(Mappings)
9389
}
9490

91+
@PackageScope ForgeGradleProblems getProblems() {
92+
this.plugin.enhancedProblems
93+
}
94+
9595
private MinecraftExtension forSettings(Settings target) {
9696
target.gradle.settingsEvaluated { Settings settings ->
9797
if (settings !== target) return
@@ -167,7 +167,7 @@ import java.util.concurrent.Callable
167167
final NamedDomainObjectContainer<SlimeLauncherOptions> runs
168168
private final MapProperty<String, RunConfig> configs
169169

170-
private final Lazy.Actionable<AccessTransformersContainer> atContainer = Lazy.Actionable.of {
170+
private final Util.ActionableLazy<AccessTransformersContainer> atContainer = Util.lazy {
171171
this.project.pluginManager.apply('net.minecraftforge.accesstransformers')
172172
AccessTransformersContainer.register(this.project, Attribute.of('net.minecraftforge.gradle.accesstransformed', Boolean)) { }
173173
}
@@ -219,7 +219,7 @@ import java.util.concurrent.Callable
219219
it.attributes(this.&applyAttributes)
220220
}
221221

222-
SyncMinecraftMaven.register(project, MinecraftExtensionImpl.this.globalCaches, this.minecraft)
222+
SyncMinecraftMaven.register(project, this.minecraft)
223223

224224
var repositories = project.extensions.extraProperties.has(EXT_MAVEN_REPOS)
225225
? new AppliedRepos(project.extensions.extraProperties.get(EXT_MAVEN_REPOS) as List<? extends MavenArtifactRepository>)
@@ -234,7 +234,7 @@ import java.util.concurrent.Callable
234234
if (!repositories.mclibs)
235235
MinecraftExtensionImpl.this.problems.reportMcLibsMavenNotDeclared()
236236

237-
var cacheDir = MinecraftExtensionImpl.this.globalCaches.dir("slime-launcher/cache/${this.minecraft.group.replace('.', '/')}/${this.minecraft.name}/${this.minecraft.version}").map(MinecraftExtensionImpl.this.problems.ensureDirectory())
237+
var cacheDir = MinecraftExtensionImpl.this.plugin.globalCaches.dir("slime-launcher/cache/${this.minecraft.group.replace('.', '/')}/${this.minecraft.name}/${this.minecraft.version}").map(MinecraftExtensionImpl.this.problems.ensureDirectory())
238238
var metadataDir = MinecraftExtensionImpl.this.objects.directoryProperty().value(cacheDir).dir('metadata').map(MinecraftExtensionImpl.this.problems.ensureDirectory())
239239
var metadataZip = MinecraftExtensionImpl.this.output.file(Util.artifactPath(this.minecraft.group, this.minecraft.name, this.minecraft.version, 'metadata', 'zip'))
240240

@@ -254,13 +254,13 @@ import java.util.concurrent.Callable
254254
}
255255

256256
this.runs.forEach { options ->
257-
SlimeLauncherExec.register(project, options, this.configs.getOrElse(Map.of()), MinecraftExtensionImpl.this.globalCaches, this.minecraft, metadataZip)
257+
SlimeLauncherExec.register(project, options, this.configs.getOrElse(Map.of()), this.minecraft, metadataZip)
258258
}
259259

260260
flowScope.always(ForgeGradleFlowAction.WelcomeMessage) {
261261
it.parameters {
262262
it.failure.set flowProviders.buildWorkResult.map { it.failure.orElse(null) }
263-
it.messagesDir.set MinecraftExtensionImpl.this.globalCaches.dir('messages')
263+
it.messagesDir.set MinecraftExtensionImpl.this.plugin.globalCaches.dir('messages')
264264
it.displayOption.set this.providers.gradleProperty('net.minecraftforge.gradle.messages.welcome').map {
265265
ForgeGradleFlowAction.WelcomeMessage.DisplayOption.valueOf(it.toUpperCase(Locale.ROOT))
266266
}

src/main/groovy/net/minecraftforge/gradle/SlimeLauncherExec.groovy

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,24 @@ import java.nio.file.Files
3939
*/
4040
@CompileStatic
4141
@PackageScope abstract class SlimeLauncherExec extends JavaExec {
42-
@PackageScope static TaskProvider<SlimeLauncherExec> register(Project project, SlimeLauncherOptions options, Map<String, RunConfig> configs, DirectoryProperty globalCaches, Dependency dependency, Provider<RegularFile> metadataZip) {
42+
@PackageScope static TaskProvider<SlimeLauncherExec> register(Project project, SlimeLauncherOptions options, Map<String, RunConfig> configs, Dependency dependency, Provider<RegularFile> metadataZip) {
4343
project.tasks.register(options.taskName.get(), SlimeLauncherExec) { task ->
44+
final plugin = project.plugins.getPlugin(ForgeGradlePlugin)
45+
4446
task.description = "Runs the '$options.name' Slime Launcher run configuration."
4547

4648
task.classpath = task.objectFactory.fileCollection().from(
4749
task.providerFactory.provider { task.project.extensions.getByType(JavaPluginExtension).sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).runtimeClasspath }
4850
)
4951

50-
var caches = task.objectFactory.directoryProperty().value(globalCaches.dir("slime-launcher/cache/${dependency.group.replace('.', '/')}/${dependency.name}/${dependency.version}"))
52+
var caches = task.objectFactory.directoryProperty().value(plugin.globalCaches.dir("slime-launcher/cache/${dependency.group.replace('.', '/')}/${dependency.name}/${dependency.version}"))
5153
task.cacheDir.set caches.map(task.problems.ensureDirectory())
5254
task.metadataZip.set metadataZip
5355

5456
task.inherit(configs, options.name)
5557
options.apply(task)
5658

57-
task.classpath Tools.SLIME_LAUNCHER.get(globalCaches, task.providerFactory)
59+
task.classpath plugin.getTool(Tools.SLIME_LAUNCHER)
5860

5961
if (task.buildAllProjects)
6062
task.dependsOn project.allprojects.collect { it.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME) }.toArray()

src/main/groovy/net/minecraftforge/gradle/SyncMinecraftMaven.groovy

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,25 @@ abstract class SyncMinecraftMaven extends JavaExec {
3232
/** The name of the task that is used to sync the Minecraft Maven. */
3333
static final String NAME = 'syncMinecraftMaven'
3434

35-
@PackageScope static TaskProvider<SyncMinecraftMaven> register(Project project, DirectoryProperty globalCaches, Dependency dependency) {
36-
project.tasks.register(NAME, SyncMinecraftMaven) {
37-
it.group = 'Build Setup'
38-
it.description = 'Syncs the Minecraft Maven dependencies.'
35+
@PackageScope static TaskProvider<SyncMinecraftMaven> register(Project project, Dependency dependency) {
36+
project.tasks.register(NAME, SyncMinecraftMaven) { task ->
37+
final plugin = project.plugins.getPlugin(ForgeGradlePlugin)
3938

40-
it.classpath = it.objectFactory.fileCollection().from(Tools.MINECRAFT_MAVEN.get(globalCaches, it.providerFactory))
39+
task.group = 'Build Setup'
40+
task.description = 'Syncs the Minecraft Maven dependencies.'
4141

42-
it.cacheDir.set globalCaches.dir('mc-maven/cache').map(it.problems.ensureDirectory())
43-
it.jdkCacheDir.set globalCaches.dir('mc-maven/cache/jdks').map(it.problems.ensureDirectory())
44-
it.outputDir.set globalCaches.dir('mc-maven/output').map(it.problems.ensureDirectory())
42+
task.classpath = task.objectFactory.fileCollection().from(plugin.getTool(Tools.MINECRAFT_MAVEN))
4543

46-
it.artifact.set "${dependency.group}:${dependency.name}".toString()
47-
it.artifactVersion.set dependency.version
44+
task.cacheDir.set plugin.globalCaches.dir('mc-maven/cache').map(task.problems.ensureDirectory())
45+
task.jdkCacheDir.set plugin.globalCaches.dir('mc-maven/cache/jdks').map(task.problems.ensureDirectory())
46+
task.outputDir.set plugin.globalCaches.dir('mc-maven/output').map(task.problems.ensureDirectory())
47+
48+
task.artifact.set "${dependency.group}:${dependency.name}".toString()
49+
task.artifactVersion.set dependency.version
4850
}.tap {
4951
// TODO [ForgeGradle7][MinecraftMaven] This might cause problems if a consumer manually runs this task with custom arguments.
5052
// Consider re-implementing Util#runFirst.
51-
Util.runFirst project, it
53+
Util.runFirst(project, it)
5254
}
5355
}
5456

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,15 @@ enum Tools {
3636
this.downloadUrl = downloadUrl;
3737
}
3838

39-
public Provider<File> get(DirectoryProperty cachesDir, ProviderFactory providers) {
39+
/// Gets a provider for this tool using the given caches directory and provider factory.
40+
///
41+
/// @param cachesDir The caches directory to store the tool
42+
/// @param providers The provider factory to use
43+
/// @return A provider for the tool as a [file][File]
44+
/// @deprecated Use [ForgeGradlePlugin#getTool(Tools)] <- [org.gradle.api.plugins.PluginContainer#getPlugin(Class)]
45+
/// <- [org.gradle.api.plugins.PluginAware#getPlugins()]
46+
@Deprecated
47+
Provider<File> get(DirectoryProperty cachesDir, ProviderFactory providers) {
4048
return providers.of(Source.class, spec -> spec.parameters(parameters -> {
4149
parameters.getInputFile().set(cachesDir.file("tools/" + this.fileName));
4250
parameters.getDownloadUrl().set(this.downloadUrl);

0 commit comments

Comments
 (0)