Skip to content

Commit 1b67913

Browse files
committed
Warn user when repositories are not ideally ordered
This adds two warnings: 1. Warn the user (at the ADVICE severity) to set Mavenizer as the topmost repository if it is not. 2. Warn the user (at the ERROR severity) to set Mavenizer higher than the Forge repository if it is not.
1 parent e07e57d commit 1b67913

File tree

3 files changed

+48
-22
lines changed

3 files changed

+48
-22
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public interface MinecraftExtension extends MinecraftMappingsContainer {
2525
String NAME = "minecraft";
2626

2727
/**
28-
* A closure for the generated Minecraft maven to be passed into
28+
* A closure for the Minecraft Mavenizer's output to be passed into
2929
* {@link org.gradle.api.artifacts.dsl.RepositoryHandler#maven(Closure)}.
3030
* <p>Declaring this in your buildscript is <strong>required</strong> for the Minecraft dependencies to resolve
3131
* properly.</p>
@@ -36,7 +36,11 @@ public interface MinecraftExtension extends MinecraftMappingsContainer {
3636
* </code></pre>
3737
*
3838
* @return The closure
39+
* @see #mavenizer(RepositoryHandler)
40+
* @deprecated Use {@link #mavenizer(RepositoryHandler)} instead, as it has special handling to avoid pitfalls when
41+
* including the mavenizer output in your repositories.
3942
*/
43+
@Deprecated(since = "7.0")
4044
Action<MavenArtifactRepository> getMavenizer();
4145

4246
/**
@@ -47,6 +51,8 @@ public interface MinecraftExtension extends MinecraftMappingsContainer {
4751
*
4852
* @param repositories The repository handler to add the maven to
4953
* @return The Minecraft maven
54+
* @apiNote This version includes special logic to avoid pitfalls when adding the Mavenizer output as a repository
55+
* when using ForgeGradle in a subproject, for example, if all projects need to use the Forge maven.
5056
* @see #getMavenizer()
5157
*/
5258
default MavenArtifactRepository mavenizer(RepositoryHandler repositories) {

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

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,27 @@ void mavenizerOutOfDate(boolean throwIt, Object dependency) {
149149
this.report(name, displayName, problemSpec);
150150
}
151151

152-
void reportCannotAccessSettingsRepos(Exception e) {
153-
this.report("cannot-access-settings-repos", "Cannot access Settings repositories", spec -> spec
152+
void reportMavenizerNotHighestRepository() {
153+
this.report("mavenizer-not-highest-repo", "Mavenizer repository is not the highest", spec -> spec
154154
.details("""
155-
ForgeGradle is unable to access the repositories defined by the Settings' dependency resolution management.
156-
This is a ForgeGradle bug and needs to be reported to the ForgeGradle issue tracker on GitHub.""")
155+
The Mavenizer repository is not the highest ranked repository for the project's repositories.
156+
Any publicly consumable artifacts for Forge present in other repositories may be used instead of the generated artifacts by Mavenizer.
157+
This may result in incorrect dependencies being consumed a "cannot resolve dependency" error.""")
158+
.severity(Severity.ADVICE)
159+
.solution("Declare Mavenizer's repository before any other repository.")
160+
.solution("Use `minecraft.mavenizer(repositories)` instead of `repositories.maven(minecraft.mavenizer)`.")
161+
.solution(HELP_MESSAGE));
162+
}
163+
164+
void reportForgeAboveMavenizer() {
165+
this.report("forge-maven-above-mavenizer", "Forge Maven has a higher priority than Mavenizer", spec -> spec
166+
.details("""
167+
The Forge Maven repository was found to have a higher priority for the project's repositories than Mavenizer.
168+
The publicly consumable artifacts for Forge will be used instead of the generated artifacts by Mavenizer.
169+
This will result in incorrect dependencies being consumed or a "cannot resolve dependency" error.""")
157170
.severity(Severity.ERROR)
158-
.withException(e)
159-
.solution("For now, only declare repositories in the project.")
171+
.solution("Declare Mavenizer's repository before the Forge repository.")
172+
.solution("Use `minecraft.mavenizer(repositories)` instead of `repositories.maven(minecraft.mavenizer)`.")
160173
.solution(HELP_MESSAGE));
161174
}
162175

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

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import java.util.Locale;
5757
import java.util.Objects;
5858
import java.util.function.Predicate;
59+
import java.util.function.ToIntFunction;
5960
import java.util.stream.Collectors;
6061

6162
abstract class MinecraftExtensionImpl implements MinecraftExtensionInternal {
@@ -456,38 +457,44 @@ public Provider<ExternalModuleDependency> dependency(
456457
}
457458

458459
private void checkRepos(List<? extends MavenArtifactRepository> repos) {
459-
Predicate<String> contains = s -> {
460-
for (var repo : repos) {
460+
ToIntFunction<String> indexOf = s -> {
461+
for (var i = 0; i < repos.size(); i++) {
462+
var repo = repos.get(i);
461463
if (repo.getUrl().toString().contains(s))
462-
return true;
464+
return i;
463465
}
464466

465-
return false;
467+
return -1;
466468
};
467469

468-
Predicate<Object> containsExactly = object -> {
469-
for (var repo : repos) {
470-
if (repo.getUrl().equals(ForProjectImpl.this.getProject().uri(object)))
471-
return true;
470+
ToIntFunction<Object> indexOfExactly = object -> {
471+
for (var i = 0; i < repos.size(); i++) {
472+
var repo = repos.get(i);
473+
if (repo.getUrl().equals(getProject().uri(object)))
474+
return i;
472475
}
473476

474-
return false;
477+
return -1;
475478
};
476479

477480
// Mavenizer
478-
if (!containsExactly.test(ForProjectImpl.this.getMavenizerOutput().getAsFile())) {
481+
int mavenizer = indexOfExactly.applyAsInt(ForProjectImpl.this.getMavenizerOutput().getAsFile());
482+
if (mavenizer < 0)
479483
problems.reportMcMavenNotDeclared();
480-
}
484+
else if (mavenizer != 0) // if Mavenizer is not highest repository
485+
problems.reportMavenizerNotHighestRepository();
481486

482487
// Forge
483-
if (!contains.test("maven.minecraftforge.net")) {
488+
int forge = indexOf.applyAsInt("maven.minecraftforge.net");
489+
if (forge < 0) {
484490
problems.reportForgeMavenNotDeclared();
485-
}
491+
} else if (mavenizer > 0 && forge < mavenizer) // If Forge is above Mavenizer
492+
problems.reportForgeAboveMavenizer();
486493

487494
// Mojang
488-
if (!contains.test("libraries.minecraft.net")) {
495+
int mojang = indexOf.applyAsInt("libraries.minecraft.net");
496+
if (mojang < 0)
489497
problems.reportMcLibsMavenNotDeclared();
490-
}
491498
}
492499
}
493500
}

0 commit comments

Comments
 (0)