Skip to content

Commit 5d2fc58

Browse files
committed
Add gradleutils#manifestDefaults for project
This helper method uses `gradleutils.displayName`, `gradleutils.vendor`, `project.version` and optionally `gitversion.info.tag` (if it exists, else use `project.version`) for the name, vendor, implementation version, and specification version respectively. `gradleutils.vendor` is new in this version. If `project.group` begins with "net.minecraftforge" (case-insensitive), its convention value is set to "Forge Development LLC". Otherwise, it has no value by default.
1 parent b114461 commit 5d2fc58

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,39 @@
66

77
import org.gradle.api.Action;
88
import org.gradle.api.artifacts.ConfigurationContainer;
9+
import org.gradle.api.java.archives.Manifest;
910
import org.gradle.api.provider.Property;
1011
import org.gradle.api.provider.Provider;
1112
import org.gradle.api.provider.ProviderConvertible;
1213
import org.gradle.api.publish.maven.MavenPublication;
1314
import org.gradle.api.tasks.TaskProvider;
1415

16+
import java.util.Map;
17+
1518
/// A subset of [GradleUtilsExtension] that is given to projects. Includes additional convenience methods that only
1619
/// apply to projects.
1720
public sealed interface GradleUtilsExtensionForProject extends GradleUtilsExtension permits GradleUtilsExtensionInternal.ForProject {
1821
/// The display name for the project.
1922
///
2023
/// If the relevant properties are enabled, it is used in areas such as the Javadoc window title, among other
21-
/// things.
24+
/// things. This also is used with [#manifestDefaults] to reduce buildscript boilerplate.
2225
///
2326
/// @return The property for the display name
2427
Property<String> getDisplayName();
2528

29+
/// The vendor for the project.
30+
///
31+
/// This is used with [#manifestDefaults] to reduce buildscript boilerplate.
32+
///
33+
/// @return The property for the vendor
34+
Property<String> getVendor();
35+
36+
default void manifestDefaults(Manifest manifest, String packageName) {
37+
this.manifestDefaults(manifest, packageName, Map.of());
38+
}
39+
40+
void manifestDefaults(Manifest manifest, String packageName, Map<? extends CharSequence, ?> additionalEntries);
41+
2642
/// Applies known defaults for Minecraft Forge's Gradle plugins.
2743
///
2844
/// - For all configurations that

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.gradle.api.file.DirectoryProperty
2121
import org.gradle.api.file.ProjectLayout
2222
import org.gradle.api.flow.FlowProviders
2323
import org.gradle.api.flow.FlowScope
24+
import org.gradle.api.java.archives.Manifest
2425
import org.gradle.api.logging.LogLevel
2526
import org.gradle.api.model.ObjectFactory
2627
import org.gradle.api.plugins.BasePluginExtension
@@ -151,6 +152,8 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
151152
private final Project project
152153

153154
final Property<String> displayName = this.objects.property(String)
155+
final Property<String> vendor = this.objects.property(String)
156+
private final Property<String> version = this.objects.property(String)
154157

155158
protected abstract @Inject ProjectLayout getProjectLayout()
156159

@@ -164,6 +167,9 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
164167
}
165168

166169
private void setup(Project project) {
170+
this.vendor.convention(providers.provider { project.group }.map { it.toString().startsWithIgnoreCase('net.minecraftforge') ? 'Forge Development LLC' : null })
171+
this.version.set(providers.provider { project.version }.map(Object.&toString))
172+
167173
project.tasks.register(GenerateActionsWorkflow.NAME, GenerateActionsWorkflowImpl)
168174

169175
project.pluginManager.withPlugin('publishing') {
@@ -177,6 +183,8 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
177183
}
178184

179185
private void finish(Project project) {
186+
this.version.finalizeValue()
187+
180188
final parallel = project.gradle.startParameter.parallelProjectExecutionEnabled
181189
project.pluginManager.withPlugin('com.github.ben-manes.versions') {
182190
project.tasks.withType(DependencyUpdatesTask).configureEach { task ->
@@ -346,6 +354,34 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
346354
}
347355
}
348356

357+
@Override
358+
void manifestDefaults(Manifest manifest, String packageName, Map<? extends CharSequence, ?> additionalEntries) {
359+
var specificationVersion = providers.provider {
360+
project.extensions.getByName('gitversion').properties.info?.properties?.tag?.toString()
361+
}.orElse(this.version)
362+
363+
var attributes = ([
364+
'Specification-Title' : this.displayName,
365+
'Specification-Vendor' : this.vendor,
366+
'Specification-Version' : specificationVersion,
367+
'Implementation-Title' : this.displayName,
368+
'Implementation-Vendor' : this.vendor,
369+
'Implementation-Version': this.version
370+
] as Map<? extends CharSequence, ?>).tap { putAll(additionalEntries) }.with {
371+
final attributes = new HashMap<String, String>(size())
372+
373+
forEach { key, value ->
374+
var unpacked = this.unpackOrNull(value)
375+
if (unpacked !== null)
376+
attributes.put(key.toString(), unpacked.toString())
377+
}
378+
379+
return attributes
380+
}
381+
382+
manifest.attributes(attributes, packageName)
383+
}
384+
349385
@Override
350386
void pluginDevDefaults(ConfigurationContainer configurations, CharSequence gradleVersion) {
351387
this.pluginDevDefaults(configurations, this.providers.provider { gradleVersion })

0 commit comments

Comments
 (0)