Skip to content

Commit d720fec

Browse files
committed
Fix configuration cache, run configs, and macOS variant mismatching (#998)
1 parent 206002b commit d720fec

16 files changed

+225
-106
lines changed

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ plugins {
1515

1616
gradleutils.displayName = 'ForgeGradle'
1717
description = "Forge's Gradle plugin for Mod development"
18-
base.archivesName = 'forgegradle'
1918
group = 'net.minecraftforge'
2019
version = gitversion.tagOffset
2120

21+
println "Version: $version"
22+
2223
java {
2324
toolchain.languageVersion = JavaLanguageVersion.of(17)
2425
withSourcesJar()

gradle.properties

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,5 @@ org.gradle.configuration-cache.problems=warn
88

99
systemProp.org.gradle.unsafe.suppress-gradle-api=true
1010

11-
net.minecraftforge.gradleutils.publishing.use-base-archives-name=true
1211
net.minecraftforge.gradleutils.ide.automatic.sources=true
1312
net.minecraftforge.gradleutils.compilation.defaults=true
14-
15-
net.minecraftforge.gitversion.log.version=true

settings.gradle

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ gradle.beforeProject { Project project ->
2020

2121
//@formatter:off
2222
dependencyResolutionManagement.versionCatalogs.register('libs') {
23-
version 'gradleutils', '3.3.20'
23+
version 'gradleutils', '3.3.21'
2424

2525
plugin 'licenser', 'net.minecraftforge.licenser' version '1.2.0' // https://plugins.gradle.org/plugin/net.minecraftforge.licenser
2626
plugin 'gradleutils', 'net.minecraftforge.gradleutils' versionRef 'gradleutils'
27-
plugin 'gitversion', 'net.minecraftforge.gitversion' version '3.1.1' // https://plugins.gradle.org/plugin/net.minecraftforge.changelog
28-
plugin 'changelog', 'net.minecraftforge.changelog' version '3.1.2' // https://plugins.gradle.org/plugin/net.minecraftforge.changelog
27+
plugin 'gitversion', 'net.minecraftforge.gitversion' version '3.1.6' // https://plugins.gradle.org/plugin/net.minecraftforge.changelog
28+
plugin 'changelog', 'net.minecraftforge.changelog' version '3.1.3' // https://plugins.gradle.org/plugin/net.minecraftforge.changelog
2929
plugin 'plugin-publish', 'com.gradle.plugin-publish' version '2.0.0' // https://plugins.gradle.org/plugin/com.gradle.plugin-publish
3030
plugin 'shadow', 'com.gradleup.shadow' version '9.2.2' // https://plugins.gradle.org/plugin/com.gradleup.shadow
3131

@@ -45,9 +45,10 @@ dependencyResolutionManagement.versionCatalogs.register('libs') {
4545
// https://plugins.gradle.org/plugin/net.minecraftforge.accesstransformers
4646
library 'accesstransformers-gradle', 'net.minecraftforge.accesstransformers', 'net.minecraftforge.accesstransformers.gradle.plugin' version '5.0.1'
4747

48-
library 'utils-data', 'net.minecraftforge', 'json-data-utils' version '0.3.0' // https://files.minecraftforge.net/net/minecraftforge/json-data-utils/index.html
49-
library 'utils-hash', 'net.minecraftforge', 'hash-utils' version '0.1.10' // https://files.minecraftforge.net/net/minecraftforge/hash-utils/index.html
50-
library 'utils-download', 'net.minecraftforge', 'download-utils' version '0.3.2' // https://files.minecraftforge.net/net/minecraftforge/download-utils/index.html
51-
bundle 'utils', ['utils-data', 'utils-hash', 'utils-download']
48+
library 'utils-data', 'net.minecraftforge', 'json-data-utils' version '0.4.0' // https://files.minecraftforge.net/net/minecraftforge/json-data-utils/index.html
49+
library 'utils-os', 'net.minecraftforge', 'os-utils' version '0.1.0' // https://files.minecraftforge.net/net/minecraftforge/os-utils/index.html
50+
library 'utils-hash', 'net.minecraftforge', 'hash-utils' version '0.1.12' // https://files.minecraftforge.net/net/minecraftforge/hash-utils/index.html
51+
library 'utils-download', 'net.minecraftforge', 'download-utils' version '0.4.0' // https://files.minecraftforge.net/net/minecraftforge/download-utils/index.html
52+
bundle 'utils', ['utils-data', 'utils-os', 'utils-hash', 'utils-download']
5253
}
5354
//@formatter:on

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ final class Constants {
1818
static final String SLIMELAUNCHER_MAIN = "net.minecraftforge.launcher.Main";
1919

2020
static final String MAVENIZER_NAME = "mavenizer";
21-
static final String MAVENIZER_VERSION = "0.3.25";
21+
static final String MAVENIZER_VERSION = "0.4.0";
2222
static final String MAVENIZER_DL_URL = "https://maven.minecraftforge.net/net/minecraftforge/minecraft-mavenizer/" + MAVENIZER_VERSION + "/minecraft-mavenizer-" + MAVENIZER_VERSION + ".jar";
23-
static final int MAVENIZER_JAVA_VERSION = 21;
23+
static final int MAVENIZER_JAVA_VERSION = 25;
2424
static final String MAVENIZER_MAIN = "net.minecraftforge.mcmaven.cli.Main";
2525

2626
/// Use these with [java.text.MessageFormat#format(String, Object...)].

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ RuntimeException changingMinecraftDependency(Dependency dependency) {
124124
//endregion
125125

126126
//region Minecraft Maven
127-
RuntimeException mavenizerOutOfDateCompile(Dependency dependency) {
127+
RuntimeException mavenizerOutOfDateCompile(Object dependency) {
128128
return this.throwing(new IllegalStateException(), "mavenizer-out-of-date", "Minecraft Mavenizer is out-of-date", spec -> spec
129129
.details("""
130130
Gradle cannot compile your sources because the Minecraft Mavenizer is out-of-date.

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

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,21 @@
1010
import groovy.transform.NamedVariant;
1111
import net.minecraftforge.accesstransformers.gradle.ArtifactAccessTransformer;
1212
import net.minecraftforge.gradleutils.shared.Closures;
13+
import net.minecraftforge.util.os.OS;
1314
import org.gradle.api.Action;
1415
import org.gradle.api.InvalidUserCodeException;
1516
import org.gradle.api.Project;
1617
import org.gradle.api.artifacts.Configuration;
1718
import org.gradle.api.artifacts.Dependency;
1819
import org.gradle.api.artifacts.ExternalModuleDependency;
20+
import org.gradle.api.artifacts.ModuleIdentifier;
1921
import org.gradle.api.artifacts.type.ArtifactTypeDefinition;
2022
import org.gradle.api.attributes.Attribute;
2123
import org.gradle.api.attributes.AttributeContainer;
2224
import org.gradle.api.attributes.Category;
2325
import org.gradle.api.file.Directory;
2426
import org.gradle.api.file.ProjectLayout;
2527
import org.gradle.api.file.RegularFileProperty;
26-
import org.gradle.api.logging.LogLevel;
2728
import org.gradle.api.model.ObjectFactory;
2829
import org.gradle.api.plugins.ExtensionAware;
2930
import org.gradle.api.plugins.JavaPluginExtension;
@@ -33,19 +34,22 @@
3334
import org.gradle.api.tasks.SourceSet;
3435
import org.gradle.api.tasks.TaskProvider;
3536
import org.gradle.api.tasks.compile.JavaCompile;
36-
import org.gradle.internal.os.OperatingSystem;
37-
import org.gradle.nativeplatform.OperatingSystemFamily;
3837
import org.jetbrains.annotations.Nullable;
39-
import org.jetbrains.annotations.UnknownNullability;
4038

4139
import javax.inject.Inject;
4240
import java.io.File;
4341
import java.util.Map;
4442
import java.util.Objects;
43+
import java.util.Set;
4544

4645
abstract class MinecraftDependencyImpl implements MinecraftDependencyInternal {
47-
private @UnknownNullability ExternalModuleDependency delegate;
48-
private @UnknownNullability TaskProvider<SyncMavenizer> mavenizer;
46+
private transient @Nullable("configuration cache") ExternalModuleDependency delegate;
47+
private transient @Nullable("configuration cache") TaskProvider<SyncMavenizer> mavenizer;
48+
49+
final Property<String> asString = getObjects().property(String.class);
50+
final Property<String> asPath = getObjects().property(String.class);
51+
final Property<ModuleIdentifier> module = getObjects().property(ModuleIdentifier.class);
52+
final Property<String> version = getObjects().property(String.class);
4953

5054
private final Provider<? extends Directory> mavenizerOutput;
5155
private final Property<MinecraftMappings> mappings;
@@ -70,12 +74,12 @@ public MinecraftDependencyImpl(Provider<? extends Directory> mavenizerOutput) {
7074
}
7175

7276
@Override
73-
public ExternalModuleDependency asDependency() {
77+
public @Nullable("configuration cache") ExternalModuleDependency asDependency() {
7478
return this.delegate;
7579
}
7680

7781
@Override
78-
public TaskProvider<SyncMavenizer> asTask() {
82+
public @Nullable("configuration cache") TaskProvider<SyncMavenizer> asTask() {
7983
return this.mavenizer;
8084
}
8185

@@ -97,13 +101,18 @@ public ExternalModuleDependency init(Object dependencyNotation, Closure<?> closu
97101

98102
this.mavenizer = SyncMavenizer.register(getProject(), dependency, this.mappings, mavenizerOutput);
99103

104+
this.asString.set(dependency.toString());
105+
this.asPath.set(Util.pathify(dependency));
106+
this.module.set(dependency.getModule());
107+
this.version.set(dependency.getVersion());
108+
100109
return this.delegate = dependency;
101110
}
102111

103112
@Override
104113
public Action<? super AttributeContainer> addAttributes() {
105114
return attributes -> {
106-
attributes.attribute(MinecraftExtension.Attributes.os, this.getObjects().named(OperatingSystemFamily.class, OperatingSystem.current().getFamilyName()));
115+
attributes.attributeProvider(MinecraftExtension.Attributes.os, getProviders().of(OperatingSystemName.class, spec -> spec.parameters(parameters -> parameters.getAllowedOperatingSystems().set(Set.of(OS.WINDOWS, OS.MACOS, OS.LINUX)))));
107116
attributes.attributeProvider(MinecraftExtension.Attributes.mappingsChannel, mappings.map(MinecraftMappings::channel));
108117
attributes.attributeProvider(MinecraftExtension.Attributes.mappingsVersion, mappings.map(MinecraftMappings::version));
109118
};
@@ -114,9 +123,8 @@ public void handle(Configuration configuration) {
114123
if (!configuration.isCanBeResolved()) return;
115124

116125
this.mappings.finalizeValue();
117-
var dependency = this.asDependency();
118126
configuration.getResolutionStrategy().dependencySubstitution(s -> {
119-
var moduleSelector = "%s:%s".formatted(dependency.getModule(), dependency.getVersion());
127+
var moduleSelector = "%s:%s".formatted(this.module.get(), this.version.get());
120128
var module = s.module(moduleSelector);
121129
try {
122130
s.substitute(module)
@@ -127,12 +135,15 @@ public void handle(Configuration configuration) {
127135
}
128136
});
129137

138+
var asDependency = this.asDependency();
139+
if (asDependency == null) return;
140+
130141
var hierarchy = configuration.getHierarchy();
131142

132143
var sourceSet = Util.getSourceSet(
133144
getProject().getConfigurations().matching(hierarchy::contains),
134145
getProject().getExtensions().getByType(JavaPluginExtension.class).getSourceSets(),
135-
this.asDependency()
146+
asDependency
136147
);
137148

138149
// Hope that this is handled elsewhere, and that we are transitive.
@@ -145,9 +156,9 @@ public void handle(Configuration configuration) {
145156
public void handle(SourceSet sourceSet) {
146157
getProject().getTasks().named(sourceSet.getCompileJavaTaskName(), JavaCompile.class, task -> {
147158
task.doFirst(t -> {
148-
var file = this.mavenizerOutput.map(dir -> dir.dir(Util.pathify(asDependency()))).get().getAsFile();
159+
var file = this.mavenizerOutput.map(dir -> dir.dir(this.asPath)).get().get().getAsFile();
149160
if (!file.exists())
150-
throw this.problems.mavenizerOutOfDateCompile(asDependency());
161+
throw this.problems.mavenizerOutOfDateCompile(this.asString.get());
151162
});
152163
});
153164

@@ -223,7 +234,10 @@ public Action<? super AttributeContainer> addAttributes() {
223234
public void handle(SourceSet sourceSet) {
224235
super.handle(sourceSet);
225236

226-
if (!Util.contains(getProject().getConfigurations(), sourceSet, false, this.asDependency())) return;
237+
var asDependency = this.asDependency();
238+
if (asDependency == null) return;
239+
240+
if (!Util.contains(getProject().getConfigurations(), sourceSet, false, asDependency)) return;
227241
if (!this.atPath.isPresent()) return;
228242

229243
var itor = sourceSet.getResources().getSrcDirs().iterator();
@@ -235,7 +249,7 @@ public void handle(SourceSet sourceSet) {
235249
this.atFile.convention(this.getProjectLayout().getProjectDirectory().file(this.getProviders().provider(() -> "src/%s/resources/%s".formatted(sourceSet.getName(), this.atPath.get()))).get());
236250
}
237251

238-
ArtifactAccessTransformer.validateConfig(getProject(), this.asDependency(), this.atFile);
252+
ArtifactAccessTransformer.validateConfig(getProject(), asDependency, this.atFile);
239253
}
240254

241255
private Attribute<Boolean> registerTransform() {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ static boolean is(Dependency dependency) {
4646

4747
ExternalModuleDependency init(Object dependencyNotation, Closure<?> closure);
4848

49-
ExternalModuleDependency asDependency();
49+
@Nullable("configuration cache") ExternalModuleDependency asDependency();
5050

51-
TaskProvider<SyncMavenizer> asTask();
51+
@Nullable("configuration cache") TaskProvider<SyncMavenizer> asTask();
5252

5353
Action<? super AttributeContainer> addAttributes();
5454

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ sealed interface Attributes permits MinecraftExtensionInternal.AttributesInterna
8080
/// The [operating system family][OperatingSystemFamily] of the project's host.
8181
///
8282
/// This is used to filter natives from the Minecraft repo.
83-
Attribute<OperatingSystemFamily> os = Attribute.of("net.minecraftforge.native.operatingSystem", OperatingSystemFamily.class);
83+
Attribute<String> os = Attribute.of("net.minecraftforge.native.operatingSystem", String.class);
8484
/// The requested mappings channel of the project.
8585
///
8686
/// This is determined using [MinecraftMappings#channel()] via [#getMappings()]

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,10 @@ private void finish(Project project) {
271271
if (!this.minecraftDependencies.isEmpty()) {
272272
var syncMavenizer = project.getTasks().register("syncMavenizer", task -> task.setGroup("Build Setup"));
273273
for (var minecraftDependency : this.minecraftDependencies) {
274-
syncMavenizer.configure(task -> task.dependsOn(minecraftDependency.asTask()));
274+
var mavenizer = minecraftDependency.asTask();
275+
if (mavenizer == null) continue;
276+
277+
syncMavenizer.configure(task -> task.dependsOn(mavenizer));
275278
}
276279

277280
project.getPluginManager().withPlugin("eclipse", eclipsePlugin -> {
@@ -302,8 +305,8 @@ private void finish(Project project) {
302305
// This can never be null in production and is only here to make the IDE happy.
303306
assert minecraftDependency != null;
304307

305-
var dependency = minecraftDependency.asDependency();
306-
this.runs.forEach(options -> SlimeLauncherExec.register(project, sourceSet, options, dependency, single));
308+
var impl = (MinecraftDependencyImpl) minecraftDependency;
309+
this.runs.forEach(options -> SlimeLauncherExec.register(project, sourceSet, options, impl.module.get(), impl.version.get(), impl.asPath.get(), impl.asString.get(), single));
307310
}
308311
});
309312
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package net.minecraftforge.gradle;
2+
3+
import net.minecraftforge.util.os.OS;
4+
import org.gradle.api.provider.SetProperty;
5+
import org.gradle.api.provider.ValueSource;
6+
import org.gradle.api.provider.ValueSourceParameters;
7+
import org.jspecify.annotations.Nullable;
8+
9+
import javax.inject.Inject;
10+
11+
abstract class OperatingSystemName implements ValueSource<String, OperatingSystemName.Parameters> {
12+
interface Parameters extends ValueSourceParameters {
13+
SetProperty<OS> getAllowedOperatingSystems();
14+
}
15+
16+
@Inject
17+
public OperatingSystemName() { }
18+
19+
@Override
20+
public @Nullable String obtain() {
21+
var allowed = getParameters().getAllowedOperatingSystems().get().toArray(new OS[0]);
22+
return allowed.length > 0
23+
? OS.current(allowed).key()
24+
: OS.current().key();
25+
}
26+
}

0 commit comments

Comments
 (0)