Skip to content

Commit c20ded2

Browse files
committed
Proper error if javadoc links is applied too early
1 parent 8b8f202 commit c20ded2

File tree

6 files changed

+97
-34
lines changed

6 files changed

+97
-34
lines changed

src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionImpl.groovy

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ package net.minecraftforge.gradleutils
66

77
import groovy.transform.CompileStatic
88
import groovy.transform.PackageScope
9-
import net.minecraftforge.gradleutils.shared.SharedUtil
109
import org.gradle.api.Action
1110
import org.gradle.api.Project
1211
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
1312
import org.gradle.api.file.Directory
1413
import org.gradle.api.file.DirectoryProperty
14+
import org.gradle.api.flow.FlowProviders
15+
import org.gradle.api.flow.FlowScope
1516
import org.gradle.api.model.ObjectFactory
1617
import org.gradle.api.plugins.ExtensionAware
1718
import org.gradle.api.provider.Property
@@ -26,10 +27,6 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
2627

2728
@CompileStatic
2829
@PackageScope abstract class GradleUtilsExtensionImpl implements GradleUtilsExtensionInternal {
29-
protected abstract @Inject ObjectFactory getObjects()
30-
protected abstract @Inject BuildLayout getBuildLayout()
31-
protected abstract @Inject ProviderFactory getProviders()
32-
3330
private final DirectoryProperty rootDirectory
3431

3532
private final Property<String> mavenUser
@@ -38,16 +35,29 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
3835

3936
final PomUtils pom
4037

38+
protected abstract @Inject ObjectFactory getObjects()
39+
protected abstract @Inject BuildLayout getBuildLayout()
40+
protected abstract @Inject ProviderFactory getProviders()
41+
42+
protected abstract @Inject FlowScope getFlowScope()
43+
protected abstract @Inject FlowProviders getFlowProviders()
44+
4145
@Inject
4246
GradleUtilsExtensionImpl(ExtensionAware target) {
4347
this.rootDirectory = this.objects.directoryProperty().fileValue(this.buildLayout.rootDirectory)
4448

45-
this.mavenUser = this.objects.property(String).value(this.providers.environmentVariable('MAVEN_USER')).tap(SharedUtil.finalizeProperty())
46-
this.mavenPassword = this.objects.property(String).value(this.providers.environmentVariable('MAVEN_PASSWORD')).tap(SharedUtil.finalizeProperty())
47-
this.mavenUrl = this.objects.property(String).value(this.providers.environmentVariable('MAVEN_URL').orElse(this.providers.environmentVariable('MAVEN_URL_RELEASE'))).tap(SharedUtil.finalizeProperty())
49+
this.mavenUser = this.objects.property(String).value(this.providers.environmentVariable('MAVEN_USER')).tap(Util.finalizeProperty())
50+
this.mavenPassword = this.objects.property(String).value(this.providers.environmentVariable('MAVEN_PASSWORD')).tap(Util.finalizeProperty())
51+
this.mavenUrl = this.objects.property(String).value(this.providers.environmentVariable('MAVEN_URL').orElse(this.providers.environmentVariable('MAVEN_URL_RELEASE'))).tap(Util.finalizeProperty())
4852

4953
this.pom = this.objects.newInstance(PomUtilsImpl, target)
5054

55+
this.flowScope.always(GradleUtilsFlowAction.JavadocLinksClassCheck) {
56+
it.parameters { parameters ->
57+
parameters.failure.set(this.flowProviders.buildWorkResult.map { it.failure.orElse(null) })
58+
}
59+
}
60+
5161
if (target instanceof Project) {
5262
target.tasks.register(GenerateActionsWorkflow.NAME, GenerateActionsWorkflowImpl)
5363
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package net.minecraftforge.gradleutils;
2+
3+
import net.minecraftforge.gradleutils.shared.EnhancedFlowAction;
4+
import org.jetbrains.annotations.Nullable;
5+
6+
import javax.inject.Inject;
7+
8+
abstract class GradleUtilsFlowAction<P extends GradleUtilsFlowAction.Parameters> extends EnhancedFlowAction<P> {
9+
static abstract class Parameters extends EnhancedFlowAction.EnhancedFlowParameters<GradleUtilsProblems> {
10+
Parameters() {
11+
super(GradleUtilsProblems.class);
12+
}
13+
}
14+
15+
static abstract class JavadocLinksClassCheck extends GradleUtilsFlowAction<JavadocLinksClassCheck.Parameters> {
16+
static abstract class Parameters extends GradleUtilsFlowAction.Parameters {
17+
@Inject
18+
public Parameters() { }
19+
}
20+
21+
@Inject
22+
public JavadocLinksClassCheck() { }
23+
24+
@Override
25+
protected void run(Parameters parameters) {
26+
@Nullable var e = parameters.getFailure().getOrNull();
27+
if (e != null && contains(e, "io/freefair/gradle/plugins/maven/javadoc/JavadocLinkProvider"))
28+
parameters.problems().reportJavadocLinksNotOnClasspath(e);
29+
}
30+
}
31+
}

src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsProblems.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,24 @@ void reportPomUtilsForgeProjWithoutForgeOrg() {
4949
This project was autodetected as a MinecraftForge project, but `gradleutils.pom.addForgeDetails` was not used.""")
5050
.severity(Severity.ADVICE)
5151
.stackLocation()
52-
.solution("Consider using `gradleutils.pom.addForgeDetails`"));
52+
.solution("Consider using `gradleutils.pom.addForgeDetails`."));
53+
}
54+
//endregion
55+
56+
//region JavaDoc Links
57+
void reportJavadocLinksNotOnClasspath(Throwable e) {
58+
this.getReporter().report(id("javadoc-links-plugin-not-found", "JavaDoc Links plugin not in classpath"), spec -> spec
59+
.details("""
60+
This project is using `resolveJavadocLinks` from FreeFair's JavaDoc Links plugin, but it was not loaded in the classpath!
61+
The javadoc links plugin must be loaded in the classpath before GradleUtils, even if it is not applied (i.e. in `settings.gradle`).
62+
63+
This can be done by declaring it as so (in Groovy DSL):
64+
`id 'io.freefair.javadoc-links' version '8.14' apply false`""")
65+
.withException(e)
66+
.severity(Severity.ERROR)
67+
.stackLocation()
68+
.solution("Add the JavaDoc Links plugin before GradleUtils (use `apply(false)` if necessary).")
69+
.solution(HELP_MESSAGE));
5370
}
5471
//endregion
5572
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/*
2+
* Copyright (c) Forge Development LLC and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
package net.minecraftforge.gradleutils;
6+
7+
import net.minecraftforge.gradleutils.shared.SharedUtil;
8+
9+
final class Util extends SharedUtil { }
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright (c) Forge Development LLC and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
package net.minecraftforge.gradleutils.services
6+
7+
import io.freefair.gradle.plugins.maven.javadoc.JavadocLinkProvider
8+
import io.freefair.gradle.plugins.maven.javadoc.JavadocLinkUtil
9+
import org.gradle.util.GradleVersion
10+
import org.jetbrains.annotations.Nullable
11+
12+
class GradleUtilsJavadocLinkProvider implements JavadocLinkProvider {
13+
GradleUtilsJavadocLinkProvider() { }
14+
15+
@Override
16+
@Nullable String getJavadocLink(String group, String artifact, String version) {
17+
// Allow Nokee and Remal's redistributions of Gradle API to link to Gradle's JavaDocs
18+
if ('gradle-api' == artifact && ('dev.gradleplugins' == group || 'name.remal.gradle-api' == group))
19+
JavadocLinkUtil.getGradleApiLink(GradleVersion.version(version))
20+
}
21+
}

src/main/groovy/net/minecraftforge/gradleutils/services/GradleUtilsJavadocLinkProvider.java

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

0 commit comments

Comments
 (0)