diff --git a/build.gradle b/build.gradle index 684bb49..b7b1e5d 100644 --- a/build.gradle +++ b/build.gradle @@ -94,7 +94,7 @@ gradlePlugin { plugins.register('gradleutils') { id = 'net.minecraftforge.gradleutils' - implementationClass = 'net.minecraftforge.gradleutils.GradleUtilsPlugin' + implementationClass = 'net.minecraftforge.gradleutils.internal.GradleUtilsPlugin' displayName = gradleutils.displayName description = project.description tags = ['minecraftforge'] diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 8bdaf60..61285a6 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e6b5bec..2a1bb9d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-rc-1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-rc-2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/EnhancedPlugin.java b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/EnhancedPlugin.java index ed7bd0c..bd7d692 100644 --- a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/EnhancedPlugin.java +++ b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/EnhancedPlugin.java @@ -35,7 +35,7 @@ public non-sealed abstract class EnhancedPlugin implements Plugin, Enhance private final @Nullable String toolsExtName; private @UnknownNullability T target; - private ToolsExtensionImpl tools = this.getObjects().newInstance(ToolsExtensionImpl.class, (Callable) this::toolchainsForTools); + private @Nullable ToolsExtensionImpl tools; private final EnhancedProblems problemsInternal; /// The object factory provided by Gradle services. @@ -66,11 +66,6 @@ public non-sealed abstract class EnhancedPlugin implements Plugin, Enhance /// Service Injection protected abstract @Inject ProviderFactory getProviders(); - /// The Java toolchain service provided by Gradle services. - /// - /// @return The Java toolchain service - protected abstract @Inject JavaToolchainService getJavaToolchains(); - /// This constructor must be called by all subclasses using a public constructor annotated with [Inject]. The name /// and display name passed in are used in a minimal instance of [EnhancedProblems], which is used to set up the /// plugin's [global][#globalCaches()] and [local][#localCaches()] caches. Additionally, the name is used to @@ -103,12 +98,20 @@ protected EnhancedPlugin(String name, String displayName, @Nullable String tools /// @param target The target for this plugin @Override public final void apply(T target) { - this.setup(this.target = target); + if (this.toolsExtName != null && target instanceof ExtensionAware extensionAware) { + this.tools = (ToolsExtensionImpl) extensionAware.getExtensions().create(ToolsExtension.class, this.toolsExtName, ToolsExtensionImpl.class); + + try { + var gradle = (Gradle) InvokerHelper.getProperty(this.target, "gradle"); + var tools = (ToolsExtensionImpl) gradle.getExtensions().findByName(this.toolsExtName); + if (tools != null) + this.tools.definitions.addAll(tools.definitions); + } catch (Exception ignored) { } + } else { + this.tools = this.getObjects().newInstance(ToolsExtensionImpl.class); + } - if (this.toolsExtName != null && target instanceof ExtensionAware extensionAware) - this.tools = extensionAware.getExtensions().create(this.toolsExtName, ToolsExtensionImpl.class, (Callable) this::toolchainsForTools); -// else -// this.tools = this.getObjects().newInstance(ToolsExtensionImpl.class, (Callable) this::toolchainsForTools); + this.setup(this.target = target); } /// Called when this plugin is applied to do setup work. @@ -138,6 +141,9 @@ final EnhancedProblems getProblemsInternal() { @Override public Tool.Resolved getTool(Tool tool) { + if (this.tools == null) + throw new IllegalStateException("Plugin has not yet been applied"); + ProviderFactory providers; try { providers = this.target instanceof Project ? this.getProviders() : ((Gradle) InvokerHelper.getProperty(this.target, "gradle")).getRootProject().getProviders(); @@ -148,11 +154,6 @@ public Tool.Resolved getTool(Tool tool) { return ((ToolInternal) tool).get(this.globalCaches(), providers, this.tools); } - // NOTE: Use this in Tool implementations. Enhanced plugins do not enforce application on projects. - JavaToolchainService toolchainsForTools() { - return this.target instanceof Project ? this.getJavaToolchains() : ((Gradle) InvokerHelper.getProperty(this.target, "gradle")).getRootProject().getExtensions().getByType(JavaToolchainService.class); - } - /* CACHES */ diff --git a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/SharedUtil.java b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/SharedUtil.java index 17b0979..30c1afb 100644 --- a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/SharedUtil.java +++ b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/SharedUtil.java @@ -20,6 +20,8 @@ import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Dependency; import org.gradle.api.artifacts.FileCollectionDependency; +import org.gradle.api.artifacts.ModuleIdentifier; +import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.artifacts.ModuleVersionSelector; import org.gradle.api.logging.LogLevel; import org.gradle.api.logging.Logger; @@ -250,6 +252,129 @@ public List getArgs() { //region Dependency Information + public record SimpleModuleIdentifier(String getGroup, String getName) implements ModuleIdentifier { + static SimpleModuleIdentifier of(String group, String name) { + return new SimpleModuleIdentifier(group, name); + } + + static SimpleModuleIdentifier of(String module) { + var substring = module.split(":"); + if (substring.length != 2) + throw new IllegalArgumentException("Invalid non-versioned module identifier: " + module); + + return of(substring[0], substring[1]); + } + } + + public record SimpleModuleVersionIdentifier(ModuleIdentifier getModule, String getVersion, + @Nullable String classifier, + String extension) implements ModuleVersionIdentifier { + @Override + public String getGroup() { + return getModule.getGroup(); + } + + @Override + public String getName() { + return getModule.getName(); + } + + public String getDownloadUrl(String prefix) { + var builder = new StringBuilder(); + + // Use HTTPS by default if protocol not defined + if (!prefix.contains("://")) + builder.append("https://"); + + builder.append(prefix); + + // Account for trailing slash + if (!prefix.endsWith("/")) + builder.append('/'); + + builder.append(getGroup().replace('.', '/')) + .append('/').append(getName()) + .append('/').append(getVersion()) + .append('/').append(getName()).append('-').append(getVersion()); + + if (classifier != null) + builder.append('-').append(classifier); + + return builder.append('.').append(extension).toString(); + } + + static SimpleModuleVersionIdentifier of(ModuleIdentifier module, String version) { + return of(module, version, null, "jar"); + } + + static SimpleModuleVersionIdentifier of(ModuleIdentifier module, String version, @Nullable String classifier, String extension) { + return new SimpleModuleVersionIdentifier(module, version, classifier, extension); + } + + static SimpleModuleVersionIdentifier of(String module, String version) { + return of(SimpleModuleIdentifier.of(module), version); + } + + static SimpleModuleVersionIdentifier of(String group, String name, String version) { + return of(SimpleModuleIdentifier.of(group, name), version); + } + + static SimpleModuleVersionIdentifier of(String group, String name, String version, @Nullable String classifier, String extension) { + return of(SimpleModuleIdentifier.of(group, name), version, classifier, extension); + } + + static SimpleModuleVersionIdentifier of(String artifact) { + var split = artifact.split(":", 4); + var group = split[0]; + var name = split[1]; + + String version; + @Nullable String classifier = null; + String extension = "jar"; + + // Check if version has @ before : + if (split[2].indexOf('@') > 0) { + if (split.length > 3) + throw new IllegalArgumentException("Invalid module version identifier (found @ character before another : character): " + artifact); + + var s = split[2].split("@"); + version = s[0]; + extension = s[1]; + } else { + version = split[2]; + } + + // Check if classifier has an @ + if (split.length > 3) { + if (split[3].indexOf('@') > 0) { + var s = split[2].split("@"); + classifier = s[0]; + extension = s[1]; + } else { + classifier = split[3]; + } + } + + return of(group, name, version, classifier, extension); + } + } + + public static SimpleModuleVersionIdentifier moduleOf(String artifact) { + return SimpleModuleVersionIdentifier.of(artifact); + } + + public static SimpleModuleIdentifier moduleOf(String group, String name) { + return SimpleModuleIdentifier.of(group, name); + } + + public static SimpleModuleVersionIdentifier moduleOf(String group, String name, String version) { + return SimpleModuleVersionIdentifier.of(group, name, version); + } + + public static SimpleModuleVersionIdentifier moduleOf(ModuleIdentifier module, String version) { + return SimpleModuleVersionIdentifier.of(module, version); + } + public static String dependencyToArtifactString(Dependency dependency) { var builder = new StringBuilder(); @@ -437,7 +562,7 @@ public static Comparator versionComparator() { public static Class> versionComparatorClass() { return StaticVersionComparator.class; } - //endergion + //endregion //region Domain Object Handling diff --git a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/Tool.java b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/Tool.java index afdce8b..5a66031 100644 --- a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/Tool.java +++ b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/Tool.java @@ -6,6 +6,7 @@ import org.gradle.api.Action; import org.gradle.api.Named; +import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; import org.gradle.api.provider.Property; @@ -23,38 +24,61 @@ public sealed interface Tool extends Named, Serializable permits ToolInternal, Tool.Resolved { /// Creates a new tool with the given information. /// - /// @param name The name for this tool (will be used in the file name) - /// @param version The version for this tool (will be used in the file name) - /// @param downloadUrl The download URL for this tool + /// @param name The name for this tool, used to reference it in configuration and for the file name + /// @param artifact The artifact for this tool, used to get the download URL + /// @param mavenUrl The maven URL this tool is hosted on (if protocol is omitted, prepends `https://`, and + /// appends adds trailing slash if missing) /// @param javaVersion The Java version this tool was built with, or should run on - /// @param mainClass The main class to use when executing this tool + /// @param mainClass The main class to use when executing this tool (optional) /// @return The tool - static Tool of(String name, String version, String downloadUrl, int javaVersion, String mainClass) { - return new ToolImpl(name, version, downloadUrl, javaVersion, mainClass); + static Tool of(String name, String artifact, String mavenUrl, int javaVersion, @Nullable String mainClass) { + return new ToolImpl(name, artifact, mavenUrl, javaVersion, mainClass); } /// Creates a new tool with the given information. /// - /// @param name The name for this tool (will be used in the file name) - /// @param version The version for this tool (will be used in the file name) - /// @param downloadUrl The download URL for this tool + /// @param name The name for this tool, used to reference it in configuration and for the file name + /// @param artifact The artifact for this tool, used to get the download URL + /// @param mavenUrl The maven URL this tool is hosted on (if protocol is omitted, prepends `https://`, and + /// appends adds trailing slash if missing) /// @param javaVersion The Java version this tool was built with, or should run on /// @return The tool - static Tool of(String name, String version, String downloadUrl, int javaVersion) { - return new ToolImpl(name, version, downloadUrl, javaVersion, null); + static Tool of(String name, String artifact, String mavenUrl, int javaVersion) { + return new ToolImpl(name, artifact, mavenUrl, javaVersion, null); } + /// Creates a new tool with the given information. + /// + /// @param name The name for this tool, used to reference it in configuration and for the file name + /// @param artifact The artifact for this tool, used to get the download URL + /// @param javaVersion The Java version this tool was built with, or should run on + /// @param mainClass The main class to use when executing this tool (optional) + /// @return The tool + static Tool ofForge(String name, String artifact, int javaVersion, String mainClass) { + return new ToolImpl(name, artifact, "https://maven.minecraftforge.net/", javaVersion, mainClass); + } + + /// Creates a new tool with the given information. + /// + /// @param name The name for this tool, used to reference it in configuration and for the file name + /// @param artifact The artifact for this tool, used to get the download URL + /// @param javaVersion The Java version this tool was built with, or should run on + /// @return The tool + static Tool ofForge(String name, String artifact, int javaVersion) { + return new ToolImpl(name, artifact, "https://maven.minecraftforge.net/", javaVersion, null); + } + + /// The module for this tool. + /// + /// @return The module for this tool + ModuleVersionIdentifier getModule(); + /// The name for this tool. Primarily used by [ToolExecBase] to create a default tool directory. /// /// @return The name of this tool @Override String getName(); - /// The version of this tool. - /// - /// @return The version of this tool - String getVersion(); - /// The Java version this tool was built with. Primarily used by [ToolExecBase] to determine the /// [org.gradle.jvm.toolchain.JavaLauncher]. /// diff --git a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolImpl.java b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolImpl.java index 27657e9..8dd7386 100644 --- a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolImpl.java +++ b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolImpl.java @@ -6,6 +6,8 @@ import net.minecraftforge.util.download.DownloadUtils; import net.minecraftforge.util.hash.HashStore; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.Directory; import org.gradle.api.file.FileCollection; @@ -27,22 +29,40 @@ import java.io.Serial; import java.nio.file.Files; -record ToolImpl(String getName, String getVersion, String fileName, String downloadUrl, int getJavaVersion, +record ToolImpl(String getName, ModuleVersionIdentifier getModule, String artifact, String fileName, String downloadUrl, int getJavaVersion, @Nullable String getMainClass) implements ToolInternal { private static final @Serial long serialVersionUID = -862411638019629688L; private static final Logger LOGGER = Logging.getLogger(Tool.class); - ToolImpl(String name, String version, String downloadUrl, int javaVersion, @Nullable String mainClass) { - this(name, version, String.format("%s-%s.jar", name, version), downloadUrl, javaVersion, mainClass); + ToolImpl(String name, String artifact, String mavenUrl, int javaVersion, @Nullable String mainClass) { + this(name, SharedUtil.moduleOf(artifact), artifact, mavenUrl, javaVersion, mainClass); + } + + ToolImpl(String name, SharedUtil.SimpleModuleVersionIdentifier module, String artifact, String mavenUrl, int javaVersion, @Nullable String mainClass) { + this( + name, + module, + artifact, + String.format("%s-%s.jar", name, module.getVersion()), + module.getDownloadUrl(mavenUrl), + javaVersion, + mainClass + ); } @Override public Tool.Resolved get(Provider cachesDir, ProviderFactory providers, ToolsExtensionImpl toolsExt) { var definition = toolsExt.definitions.maybeCreate(this.getName()); - var classpath = definition.getClasspath(); - if (classpath.isEmpty()) { - classpath = toolsExt.getObjects().fileCollection().from( + + FileCollection classpathFromGradle = toolsExt.getObjects().fileCollection(); + var classpathFromDownload = definition.getClasspath(); + + if (classpathFromDownload.isEmpty()) { + classpathFromGradle = toolsExt.getProject().getConfigurations().detachedConfiguration( + toolsExt.getDependencies().create(artifact) + ); + classpathFromDownload = toolsExt.getObjects().fileCollection().from( providers.of(Source.class, spec -> spec.parameters(parameters -> { parameters.getInputFile().set(cachesDir.map(d -> d.file("tools/" + this.fileName))); parameters.getDownloadUrl().set(this.downloadUrl); @@ -52,9 +72,10 @@ public Tool.Resolved get(Provider cachesDir, ProviderFactor return new ResolvedImpl( toolsExt.getObjects(), - classpath, + classpathFromGradle, + classpathFromDownload, definition.getMainClass().orElse(providers.provider(this::getMainClass)), - definition.getJavaLauncher().orElse(providers.provider(() -> SharedUtil.launcherForStrictly(toolsExt.javaToolchains.call(), this.getJavaVersion()).get())) + definition.getJavaLauncher().orElse(providers.provider(() -> SharedUtil.launcherForStrictly(toolsExt.getJavaToolchains(), this.getJavaVersion()).get())) ); } @@ -94,19 +115,31 @@ public Property getJavaLauncher() { @SuppressWarnings("serial") final class ResolvedImpl implements ToolInternal.Resolved { - private final FileCollection classpath; + private final FileCollection classpathFromGradle; + private final FileCollection classpathFromDownload; private final Property mainClass; private final Property javaLauncher; - private ResolvedImpl(ObjectFactory objects, FileCollection classpath, Provider mainClass, Provider javaLauncher) { - this.classpath = classpath; + private @Nullable Boolean useGradle = null; + + private ResolvedImpl(ObjectFactory objects, FileCollection classpathFromGradle, FileCollection classpathFromDownload, Provider mainClass, Provider javaLauncher) { + this.classpathFromGradle = classpathFromGradle; + this.classpathFromDownload = classpathFromDownload; this.mainClass = objects.property(String.class).value(mainClass); this.javaLauncher = objects.property(JavaLauncher.class).value(javaLauncher); } @Override public FileCollection getClasspath() { - return this.classpath; + if (useGradle == null) { + try { + useGradle = !classpathFromGradle.getFiles().isEmpty(); + } catch (Exception e) { + useGradle = false; + } + } + + return useGradle ? classpathFromGradle : classpathFromDownload; } @Override @@ -115,8 +148,8 @@ public String getName() { } @Override - public String getVersion() { - return ToolImpl.this.getVersion(); + public ModuleVersionIdentifier getModule() { + return ToolImpl.this.getModule(); } @Override diff --git a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolsExtensionImpl.java b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolsExtensionImpl.java index 17460ad..e319e9f 100644 --- a/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolsExtensionImpl.java +++ b/gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolsExtensionImpl.java @@ -6,6 +6,8 @@ import org.gradle.api.Action; import org.gradle.api.NamedDomainObjectContainer; +import org.gradle.api.Project; +import org.gradle.api.artifacts.dsl.DependencyFactory; import org.gradle.api.model.ObjectFactory; import org.gradle.jvm.toolchain.JavaToolchainService; @@ -13,15 +15,19 @@ import java.util.concurrent.Callable; abstract class ToolsExtensionImpl implements ToolsExtensionInternal { - final Callable javaToolchains; - final NamedDomainObjectContainer definitions; + final NamedDomainObjectContainer definitions; + + protected abstract @Inject Project getProject(); protected abstract @Inject ObjectFactory getObjects(); + protected abstract @Inject DependencyFactory getDependencies(); + + protected abstract @Inject JavaToolchainService getJavaToolchains(); + @Inject - public ToolsExtensionImpl(Callable javaToolchains) { - this.javaToolchains = javaToolchains; - this.definitions = this.getObjects().domainObjectContainer(ToolImpl.DefinitionImpl.class); + public ToolsExtensionImpl() { + this.definitions = this.getObjects().domainObjectContainer(Tool.Definition.class, name -> getObjects().newInstance(ToolImpl.DefinitionImpl.class, name)); } @Override diff --git a/gradlew b/gradlew index ef07e01..adff685 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee..e509b2d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflow.java b/src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflow.java index ba04bd8..d84b198 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflow.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflow.java @@ -17,10 +17,8 @@ /// /// If the project is also using the Git Version plugin (currently auto-applied by GradleUtils), it will respect any /// declared subprojects. -/// -/// @implNote See [GenerateActionsWorkflowImpl] @ApiStatus.Internal -public sealed interface GenerateActionsWorkflow extends Task permits GenerateActionsWorkflowInternal { +public interface GenerateActionsWorkflow extends Task { /// The name for this task. /// /// Each [project][org.gradle.api.Project] should only have one of this type of task and it must be named this. @@ -49,7 +47,6 @@ public sealed interface GenerateActionsWorkflow extends Task permits GenerateAct /// Default: Automatically detected by Git Version, otherwise `master` /// /// @return The property for the branch name - /// @implNote See [GenerateActionsWorkflowImpl#DEFAULT_BRANCH] @Optional @Input Property getBranch(); /// The local path from the [root project][org.gradle.api.Project#getRootProject()] to the current project to use in @@ -69,7 +66,6 @@ public sealed interface GenerateActionsWorkflow extends Task permits GenerateAct /// Default: The project's toolchain version, or `17` if it is lower than that. /// /// @return The property for the Gradle Java version - /// @implNote See [GenerateActionsWorkflowImpl#DEFAULT_GRADLE_JAVA] @Input Property getGradleJavaVersion(); /// The Shared Actions branch to use with this workflow. @@ -77,6 +73,5 @@ public sealed interface GenerateActionsWorkflow extends Task permits GenerateAct /// Default: `v0` /// /// @return The property for the Shared Actions branch - /// @implNote See [GenerateActionsWorkflowImpl#DEFAULT_SHARED_ACTIONS_BRANCH] @Input Property getSharedActionsBranch(); } diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtension.java b/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtension.java index aae81e7..00d0ed6 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtension.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtension.java @@ -5,8 +5,6 @@ package net.minecraftforge.gradleutils; import groovy.lang.Closure; -import kotlin.jvm.functions.Function0; -import net.minecraftforge.gradleutils.shared.Closures; import org.gradle.api.Action; import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import org.gradle.api.file.Directory; @@ -16,12 +14,11 @@ import java.io.File; import java.util.concurrent.Callable; -import java.util.function.Supplier; /// Contains various utilities for working with Gradle scripts. /// /// @see GradleUtilsExtensionForProject -public sealed interface GradleUtilsExtension permits GradleUtilsExtensionForProject, GradleUtilsExtensionInternal { +public interface GradleUtilsExtension { /// The name for this extension. String NAME = "gradleutils"; @@ -31,7 +28,10 @@ public sealed interface GradleUtilsExtension permits GradleUtilsExtensionForProj /// @deprecated Use [#getForgeMaven()] @Deprecated(forRemoval = true, since = "3.3.28") @ApiStatus.ScheduledForRemoval(inVersion = "4.0.0") - Action forgeMaven = GradleUtilsExtensionInternal.forgeMaven; + Action forgeMaven = repo -> { + repo.setName("MinecraftForge"); + repo.setUrl("https://maven.minecraftforge.net/"); + }; /** * A closure for the Forge maven to be passed into @@ -42,14 +42,15 @@ public sealed interface GradleUtilsExtension permits GradleUtilsExtensionForProj * } * */ - default Action getForgeMaven() { - return GradleUtilsExtensionInternal.forgeMaven; - } + Action getForgeMaven(); /// @deprecated Use [#getForgeReleaseMaven()] @Deprecated(forRemoval = true, since = "3.3.28") @ApiStatus.ScheduledForRemoval(inVersion = "4.0.0") - Action forgeReleaseMaven = GradleUtilsExtensionInternal.forgeReleaseMaven; + Action forgeReleaseMaven = repo -> { + repo.setName("MinecraftForge releases"); + repo.setUrl("https://maven.minecraftforge.net/releases"); + }; /** * A closure for the Forge releases maven to be passed into @@ -62,14 +63,15 @@ default Action getForgeMaven() { * * @see #forgeMaven */ - default Action getForgeReleaseMaven() { - return GradleUtilsExtensionInternal.forgeReleaseMaven; - } + Action getForgeReleaseMaven(); /// @deprecated Use [#getMinecraftLibsMaven()] @Deprecated(forRemoval = true, since = "3.3.28") @ApiStatus.ScheduledForRemoval(inVersion = "4.0.0") - Action minecraftLibsMaven = GradleUtilsExtensionInternal.minecraftLibsMaven; + Action minecraftLibsMaven = repo -> { + repo.setName("Minecraft libraries"); + repo.setUrl("https://libraries.minecraft.net/"); + }; /** * A closure for the Minecraft libraries maven to be passed into @@ -80,9 +82,7 @@ default Action getForgeReleaseMaven() { * } * */ - default Action getMinecraftLibsMaven() { - return GradleUtilsExtensionInternal.minecraftLibsMaven; - } + Action getMinecraftLibsMaven(); /* PUBLISHING */ @@ -106,9 +106,7 @@ default Action getMinecraftLibsMaven() { /// (`https://maven.minecraftforge.net/releases`). /// /// @return The closure - default Action getPublishingForgeMaven() { - return getPublishingForgeMaven(Constants.FORGE_MAVEN_RELEASE); - } + Action getPublishingForgeMaven(); /// Get a configuring closure to be passed into [org.gradle.api.artifacts.dsl.RepositoryHandler#maven(Closure)] in a /// publishing block. @@ -173,9 +171,7 @@ default Action getPublishingForgeMaven() { /// /// @param defaultFolder The default folder if the required maven information is not set /// @return The closure - default Action getPublishingForgeMaven(File defaultFolder) { - return this.getPublishingForgeMaven(Constants.FORGE_MAVEN_RELEASE, defaultFolder); - } + Action getPublishingForgeMaven(File defaultFolder); /// Get a configuring closure to be passed into [org.gradle.api.artifacts.dsl.RepositoryHandler#maven(Closure)] in a /// publishing block. **Important:** The following environment variables must be set for this to work: @@ -218,9 +214,7 @@ default Action getPublishingForgeMaven(File defaultFold /// /// @param defaultFolder The default folder if the required maven information is not set /// @return The closure - default Action getPublishingForgeMaven(Directory defaultFolder) { - return this.getPublishingForgeMaven(Constants.FORGE_MAVEN_RELEASE, defaultFolder); - } + Action getPublishingForgeMaven(Directory defaultFolder); /// Get a configuring closure to be passed into [org.gradle.api.artifacts.dsl.RepositoryHandler#maven(Closure)] in a /// publishing block. **Important:** The following environment variables must be set for this to work: @@ -263,9 +257,7 @@ default Action getPublishingForgeMaven(Directory defaul /// /// @param defaultFolder The default folder if the required maven information is not set /// @return The closure - default Action getPublishingForgeMaven(Provider defaultFolder) { - return this.getPublishingForgeMaven(Constants.FORGE_MAVEN_RELEASE, defaultFolder); - } + Action getPublishingForgeMaven(Provider defaultFolder); /// Get a configuring closure to be passed into [org.gradle.api.artifacts.dsl.RepositoryHandler#maven(Closure)] in a /// publishing block. **Important:** The following environment variables must be set for this to work: @@ -306,9 +298,7 @@ default Action getPublishingForgeMaven(Provider defa /// @param value The value to unpack /// @param The type of value held by the provider /// @return The unpacked value - default T unpack(Object value) { - return Util.unpack(value); - } + T unpack(Object value); /// Packs a (deferred) value as a provider. /// diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionForProject.java b/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionForProject.java index 52cdc4a..7a302eb 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionForProject.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionForProject.java @@ -12,12 +12,13 @@ import org.gradle.api.provider.ProviderConvertible; import org.gradle.api.publish.maven.MavenPublication; import org.gradle.api.tasks.TaskProvider; +import org.jetbrains.annotations.ApiStatus; import java.util.Map; /// A subset of [GradleUtilsExtension] that is given to projects. Includes additional convenience methods that only /// apply to projects. -public sealed interface GradleUtilsExtensionForProject extends GradleUtilsExtension permits GradleUtilsExtensionInternal.ForProject { +public interface GradleUtilsExtensionForProject extends GradleUtilsExtension { /// The display name for the project. /// /// If the relevant properties are enabled, it is used in areas such as the Javadoc window title, among other @@ -60,6 +61,10 @@ default void manifestDefaults(Manifest manifest, String packageName) { /// /// @param configurations The configurations container to apply defaults to /// @param gradleVersion The Gradle version to target + /// @deprecated This logic will be superseded by Forge's PluginDev plugin. + @ApiStatus.Internal + @Deprecated(forRemoval = true) + @ApiStatus.ScheduledForRemoval(inVersion = "4.0.0") void pluginDevDefaults(ConfigurationContainer configurations, CharSequence gradleVersion); /// Applies known defaults for Minecraft Forge's Gradle plugins. @@ -72,6 +77,10 @@ default void manifestDefaults(Manifest manifest, String packageName) { /// /// @param configurations The configurations container to apply defaults to /// @param gradleVersion The Gradle version to target + /// @deprecated This logic will be superseded by Forge's PluginDev plugin. + @ApiStatus.Internal + @Deprecated(forRemoval = true) + @ApiStatus.ScheduledForRemoval(inVersion = "4.0.0") void pluginDevDefaults(ConfigurationContainer configurations, Provider gradleVersion); /// Applies known defaults for Minecraft Forge's Gradle plugins. @@ -84,6 +93,9 @@ default void manifestDefaults(Manifest manifest, String packageName) { /// /// @param configurations The configurations container to apply defaults to /// @param gradleVersion The Gradle version to target + @ApiStatus.Internal + @Deprecated(forRemoval = true) + @ApiStatus.ScheduledForRemoval(inVersion = "4.0.0") default void pluginDevDefaults(ConfigurationContainer configurations, ProviderConvertible gradleVersion) { this.pluginDevDefaults(configurations, gradleVersion.asProvider()); } @@ -97,6 +109,7 @@ default void pluginDevDefaults(ConfigurationContainer configurations, ProviderCo /// /// @param publication The publication to promote /// @return The provider for the promotion task + @ApiStatus.Internal default TaskProvider promote(MavenPublication publication) { return this.promote(publication, null); } @@ -111,5 +124,6 @@ default TaskProvider promote(MavenPublication publ /// @param publication The publication to promote /// @param cfg A configuring action for the task /// @return The provider for the promotion task + @ApiStatus.Internal TaskProvider promote(MavenPublication publication, Action cfg); } diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionInternal.java b/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionInternal.java deleted file mode 100644 index 1c0e99d..0000000 --- a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionInternal.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ -package net.minecraftforge.gradleutils; - -import org.gradle.api.Action; -import org.gradle.api.artifacts.repositories.MavenArtifactRepository; -import org.gradle.api.reflect.HasPublicType; -import org.gradle.api.reflect.TypeOf; -import org.jetbrains.annotations.UnknownNullability; - -import java.util.Objects; - -non-sealed interface GradleUtilsExtensionInternal extends GradleUtilsExtension, HasPublicType { - @Override - default TypeOf getPublicType() { - return TypeOf.typeOf(GradleUtilsExtension.class); - } - - Action forgeMaven = repo -> { - repo.setName("MinecraftForge"); - repo.setUrl(Constants.FORGE_MAVEN); - }; - - Action forgeReleaseMaven = repo -> { - repo.setName("MinecraftForge releases"); - repo.setUrl(Constants.FORGE_MAVEN_RELEASE); - }; - - Action minecraftLibsMaven = repo -> { - repo.setName("Minecraft libraries"); - repo.setUrl(Constants.MC_LIBS_MAVEN); - }; - - /// Unpacks a deferred value or returns `null` if the value could not be unpacked or queried. - /// - /// @param value The value to unpack - /// @param The type of value held by the provider - /// @return The unpacked value - /// @see #unpack(Object) - default T unpackOrNull(@UnknownNullability Object value) { - try { - return this.unpack(Objects.requireNonNull(value)); - } catch (Throwable e) { - return null; - } - } - - non-sealed interface ForProject extends GradleUtilsExtensionInternal, GradleUtilsExtensionForProject, HasPublicType { - @Override - default TypeOf getPublicType() { - return TypeOf.typeOf(GradleUtilsExtensionForProject.class); - } - } -} diff --git a/src/main/groovy/net/minecraftforge/gradleutils/PomUtils.java b/src/main/groovy/net/minecraftforge/gradleutils/PomUtils.java index 80b95eb..03181c0 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/PomUtils.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/PomUtils.java @@ -4,6 +4,7 @@ */ package net.minecraftforge.gradleutils; +import net.minecraftforge.gradleutils.internal.PomUtilsInternalProxy; import org.gradle.api.Action; import org.gradle.api.publish.maven.MavenPom; import org.gradle.api.publish.maven.MavenPomDeveloper; @@ -14,10 +15,11 @@ /// Contains utilities to make working with [POMs][MavenPom] more ergonomic. /// /// This can be accessed using the [gradleutils][GradleUtilsExtension] extension. -public sealed interface PomUtils permits PomUtilsInternal { +public interface PomUtils { /// Allows accessing [licenses][Licenses] from buildscripts using `gradleutils.pom.licenses`. /// /// @return A reference to the licenses + /// @apiNote In GradleUtils 4.0.0, this method will instead return a [Map] of [Action]`<`[MavenPomLicense]`>`. /// @see Licenses Licenses getLicenses(); @@ -25,25 +27,25 @@ public sealed interface PomUtils permits PomUtilsInternal { /// that uses one. /// /// @see #getLicenses() - //@formatter:off - sealed interface Licenses permits PomUtilsInternal.Licenses { + interface Licenses { + //@formatter:off /// @see Apache License 2.0 on SPDX - Action Apache2_0 = PomUtilsInternal.makeLicense("Apache-2.0", "https://www.apache.org/licenses/LICENSE-2.0"); + Action Apache2_0 = PomUtilsInternalProxy.makeLicense("Apache-2.0", "https://www.apache.org/licenses/LICENSE-2.0"); /// @see GNU Lesser General Public License v2.1 only on SPDX - Action LGPLv2_1 = PomUtilsInternal.makeLicense("LGPL-2.1-only", "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html"); + Action LGPLv2_1 = PomUtilsInternalProxy.makeLicense("LGPL-2.1-only", "https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html"); /// @see GNU Lesser General Public License v3.0 only on SPDX - Action LGPLv3 = PomUtilsInternal.makeLicense("LGPL-3.0-only", "https://www.gnu.org/licenses/lgpl-3.0-standalone.html"); + Action LGPLv3 = PomUtilsInternalProxy.makeLicense("LGPL-3.0-only", "https://www.gnu.org/licenses/lgpl-3.0-standalone.html"); /// @see MIT License on SPDX - Action MIT = PomUtilsInternal.makeLicense("MIT", "https://opensource.org/license/mit/"); + Action MIT = PomUtilsInternalProxy.makeLicense("MIT", "https://opensource.org/license/mit/"); + //@formatter:on } - //@formatter:on /// Contains several developers within the MinecraftForge organization to reduce needing to manually write them out /// in each project they contribute to. /// /// If a queried developer does not exist, it is automatically created with the input which is set to the /// {@linkplain MavenPomDeveloper#getId() ID} and {@linkplain MavenPomDeveloper#getName() name}. - Map> developers = PomUtilsInternal.makeDevelopers(); + Map> developers = PomUtilsInternalProxy.makeDevelopers(); /// Adds details from the project's remote URL to the given POM. /// diff --git a/src/main/groovy/net/minecraftforge/gradleutils/PromotePublication.java b/src/main/groovy/net/minecraftforge/gradleutils/PromotePublication.java index 9200c68..c26be30 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/PromotePublication.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/PromotePublication.java @@ -14,7 +14,7 @@ /// @apiNote This task is [internal][org.jetbrains.annotations.ApiStatus.Internal] as it is meant for use in Forge /// projects only. @ApiStatus.Internal -public sealed interface PromotePublication extends Task permits PromotePublicationInternal { +public interface PromotePublication extends Task { /// The publication group to promote. /// /// By convention, this is [org.gradle.api.Project#getGroup()], but the set value is diff --git a/src/main/groovy/net/minecraftforge/gradleutils/WriteManifest.java b/src/main/groovy/net/minecraftforge/gradleutils/WriteManifest.java index b904f50..c3469b1 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/WriteManifest.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/WriteManifest.java @@ -4,7 +4,9 @@ */ package net.minecraftforge.gradleutils; +import org.gradle.api.Action; import org.gradle.api.DefaultTask; +import org.gradle.api.Project; import org.gradle.api.file.DuplicatesStrategy; import org.gradle.api.file.ProjectLayout; import org.gradle.api.file.RegularFileProperty; @@ -27,7 +29,7 @@ @ApiStatus.Internal @ApiStatus.Experimental -public abstract class WriteManifest extends DefaultTask implements GradleUtilsTask { +public abstract class WriteManifest extends DefaultTask { protected abstract @Input Property getInputBytes(); protected abstract @OutputFile RegularFileProperty getOutput(); @@ -49,7 +51,7 @@ public WriteManifest(TaskProvider jar) { }); }); - afterEvaluate(project -> { + Action afterEvaluate = project -> { try (var os = new ByteArrayOutputStream()) { // RATIONALE: ManifestInternal has not changed since Gradle 2.14 // Due to the hacky nature of needing the proper manifest in the resources, this is the only good way of doing this @@ -60,7 +62,13 @@ public WriteManifest(TaskProvider jar) { } catch (IOException e) { throw new RuntimeException(e); } - }); + }; + + try { + getProject().afterEvaluate(afterEvaluate); + } catch (Exception ignored) { + afterEvaluate.execute(getProject()); + } } @TaskAction diff --git a/src/main/groovy/net/minecraftforge/gradleutils/Constants.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/Constants.java similarity index 89% rename from src/main/groovy/net/minecraftforge/gradleutils/Constants.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/Constants.java index f0c90cd..5e785f3 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/Constants.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/Constants.java @@ -2,11 +2,11 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; final class Constants { static final String FORGE_MAVEN = "https://maven.minecraftforge.net/"; - static final String FORGE_MAVEN_RELEASE = FORGE_MAVEN + "releases"; + static final String FORGE_MAVEN_RELEASE = FORGE_MAVEN + "releases/"; static final String MC_LIBS_MAVEN = "https://libraries.minecraft.net/"; static final String FORGE_ORG_NAME = "Forge Development LLC"; diff --git a/src/main/groovy/net/minecraftforge/gradleutils/EnhancedVersionReporter.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/EnhancedVersionReporter.java similarity index 99% rename from src/main/groovy/net/minecraftforge/gradleutils/EnhancedVersionReporter.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/EnhancedVersionReporter.java index 05310ef..4ae64bd 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/EnhancedVersionReporter.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/EnhancedVersionReporter.java @@ -2,7 +2,7 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; import com.github.benmanes.gradle.versions.reporter.Reporter; import com.github.benmanes.gradle.versions.reporter.result.DependenciesGroup; diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflowImpl.groovy b/src/main/groovy/net/minecraftforge/gradleutils/internal/GenerateActionsWorkflowImpl.groovy similarity index 99% rename from src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflowImpl.groovy rename to src/main/groovy/net/minecraftforge/gradleutils/internal/GenerateActionsWorkflowImpl.groovy index e33882a..0c75228 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflowImpl.groovy +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/GenerateActionsWorkflowImpl.groovy @@ -2,7 +2,7 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils +package net.minecraftforge.gradleutils.internal import groovy.transform.CompileStatic import groovy.transform.PackageScope diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflowInternal.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/GenerateActionsWorkflowInternal.java similarity index 58% rename from src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflowInternal.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/GenerateActionsWorkflowInternal.java index 88c085a..669fca6 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GenerateActionsWorkflowInternal.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/GenerateActionsWorkflowInternal.java @@ -2,12 +2,13 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; +import net.minecraftforge.gradleutils.GenerateActionsWorkflow; import org.gradle.api.reflect.HasPublicType; import org.gradle.api.reflect.TypeOf; -non-sealed interface GenerateActionsWorkflowInternal extends GenerateActionsWorkflow, GradleUtilsTask, HasPublicType { +interface GenerateActionsWorkflowInternal extends GenerateActionsWorkflow, GradleUtilsTask, HasPublicType { @Override default TypeOf getPublicType() { return TypeOf.typeOf(GenerateActionsWorkflow.class); diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionImpl.groovy b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsExtensionImpl.groovy similarity index 98% rename from src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionImpl.groovy rename to src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsExtensionImpl.groovy index 0413e24..e4b4c6d 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionImpl.groovy +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsExtensionImpl.groovy @@ -2,18 +2,20 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils +package net.minecraftforge.gradleutils.internal import com.github.benmanes.gradle.versions.reporter.result.Result import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask import groovy.transform.CompileStatic import groovy.transform.PackageScope +import net.minecraftforge.gradleutils.GenerateActionsWorkflow +import net.minecraftforge.gradleutils.PomUtils +import net.minecraftforge.gradleutils.PromotePublication import org.codehaus.groovy.runtime.DefaultGroovyMethods import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ConfigurationContainer -import org.gradle.api.artifacts.DependencySet import org.gradle.api.artifacts.repositories.MavenArtifactRepository import org.gradle.api.attributes.plugin.GradlePluginApiVersion import org.gradle.api.file.Directory @@ -52,7 +54,7 @@ import javax.inject.Inject import java.nio.charset.Charset import java.nio.charset.StandardCharsets -import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER +import static net.minecraftforge.gradleutils.internal.GradleUtilsPlugin.LOGGER @CompileStatic @PackageScope abstract class GradleUtilsExtensionImpl implements GradleUtilsExtensionInternal { diff --git a/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsExtensionInternal.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsExtensionInternal.java new file mode 100644 index 0000000..d3dd293 --- /dev/null +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsExtensionInternal.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ +package net.minecraftforge.gradleutils.internal; + +import net.minecraftforge.gradleutils.GradleUtilsExtension; +import net.minecraftforge.gradleutils.GradleUtilsExtensionForProject; +import org.gradle.api.Action; +import org.gradle.api.artifacts.repositories.MavenArtifactRepository; +import org.gradle.api.file.Directory; +import org.gradle.api.provider.Provider; +import org.gradle.api.reflect.HasPublicType; +import org.gradle.api.reflect.TypeOf; +import org.jetbrains.annotations.UnknownNullability; + +import java.io.File; +import java.util.Objects; + +interface GradleUtilsExtensionInternal extends GradleUtilsExtension, HasPublicType { + @Override + default TypeOf getPublicType() { + return TypeOf.typeOf(GradleUtilsExtension.class); + } + + // NOTE: Rename from forgeMaven -> FORGE_MAVEN in GU4 + Action forgeMaven = repo -> { + repo.setName("MinecraftForge"); + repo.setUrl(Constants.FORGE_MAVEN); + }; + + // NOTE: Rename from forgeReleaseMaven -> FORGE_MAVEN_RELEASES in GU4 + Action forgeReleaseMaven = repo -> { + repo.setName("MinecraftForge releases"); + repo.setUrl(Constants.FORGE_MAVEN_RELEASE); + }; + + // NOTE: Rename from minecraftLibsMaven -> MINECRAFT_LIBS_MAVEN in GU4 + Action minecraftLibsMaven = repo -> { + repo.setName("Minecraft libraries"); + repo.setUrl("https://libraries.minecraft.net/"); + }; + + @Override + default Action getForgeMaven() { + return forgeMaven; + } + + @Override + default Action getForgeReleaseMaven() { + return forgeReleaseMaven; + } + + @Override + default Action getMinecraftLibsMaven() { + return minecraftLibsMaven; + } + + @Override + default Action getPublishingForgeMaven() { + return getPublishingForgeMaven(Constants.FORGE_MAVEN_RELEASE); + } + + @Override + default Action getPublishingForgeMaven(File defaultFolder) { + return this.getPublishingForgeMaven(Constants.FORGE_MAVEN_RELEASE, defaultFolder); + } + + @Override + default Action getPublishingForgeMaven(Directory defaultFolder) { + return this.getPublishingForgeMaven(Constants.FORGE_MAVEN_RELEASE, defaultFolder); + } + + @Override + default Action getPublishingForgeMaven(Provider defaultFolder) { + return this.getPublishingForgeMaven(Constants.FORGE_MAVEN_RELEASE, defaultFolder); + } + + @Override + default T unpack(Object value) { + return Util.unpack(value); + } + + /// Unpacks a deferred value or returns `null` if the value could not be unpacked or queried. + /// + /// @param value The value to unpack + /// @param The type of value held by the provider + /// @return The unpacked value + /// @see #unpack(Object) + default T unpackOrNull(@UnknownNullability Object value) { + try { + return this.unpack(Objects.requireNonNull(value)); + } catch (Throwable e) { + return null; + } + } + + interface ForProject extends GradleUtilsExtensionInternal, GradleUtilsExtensionForProject, HasPublicType { + @Override + default TypeOf getPublicType() { + return TypeOf.typeOf(GradleUtilsExtensionForProject.class); + } + } +} diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsFlowAction.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsFlowAction.java similarity index 96% rename from src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsFlowAction.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsFlowAction.java index a42c211..51aea4b 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsFlowAction.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsFlowAction.java @@ -2,7 +2,7 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; import net.minecraftforge.gradleutils.shared.EnhancedFlowAction; import org.jetbrains.annotations.Nullable; diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsPlugin.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsPlugin.java similarity index 90% rename from src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsPlugin.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsPlugin.java index b313502..eb7c52f 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsPlugin.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsPlugin.java @@ -2,8 +2,9 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; +import net.minecraftforge.gradleutils.GradleUtilsExtension; import net.minecraftforge.gradleutils.shared.EnhancedPlugin; import org.gradle.api.Project; import org.gradle.api.logging.Logger; diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsProblems.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsProblems.java similarity index 98% rename from src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsProblems.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsProblems.java index 3bbbc1c..342d277 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsProblems.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsProblems.java @@ -2,7 +2,7 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; import net.minecraftforge.gradleutils.shared.EnhancedProblems; import org.gradle.api.problems.Severity; diff --git a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsTask.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsTask.java similarity index 92% rename from src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsTask.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsTask.java index 9c626d8..118bd0a 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsTask.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/GradleUtilsTask.java @@ -2,7 +2,7 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; import net.minecraftforge.gradleutils.shared.EnhancedPlugin; import net.minecraftforge.gradleutils.shared.EnhancedTask; diff --git a/src/main/groovy/net/minecraftforge/gradleutils/PomUtilsImpl.groovy b/src/main/groovy/net/minecraftforge/gradleutils/internal/PomUtilsImpl.groovy similarity index 92% rename from src/main/groovy/net/minecraftforge/gradleutils/PomUtilsImpl.groovy rename to src/main/groovy/net/minecraftforge/gradleutils/internal/PomUtilsImpl.groovy index d2024af..3104aba 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/PomUtilsImpl.groovy +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/PomUtilsImpl.groovy @@ -2,7 +2,7 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils +package net.minecraftforge.gradleutils.internal import groovy.transform.CompileDynamic import groovy.transform.CompileStatic @@ -26,10 +26,10 @@ import javax.inject.Inject this.problems = this.objects.newInstance(GradleUtilsProblems) } - final Licenses licenses = this.objects.newInstance(Licenses) + final Licenses licenses = this.objects.newInstance(LicensesImpl) @CompileStatic - @PackageScope static abstract class Licenses implements PomUtilsInternal.Licenses { + @PackageScope static abstract class LicensesImpl implements Licenses { @Inject Licenses() { } } diff --git a/src/main/groovy/net/minecraftforge/gradleutils/PomUtilsInternal.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/PomUtilsInternal.java similarity index 93% rename from src/main/groovy/net/minecraftforge/gradleutils/PomUtilsInternal.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/PomUtilsInternal.java index 76e0f4a..0b1c5ef 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/PomUtilsInternal.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/PomUtilsInternal.java @@ -2,8 +2,9 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; +import net.minecraftforge.gradleutils.PomUtils; import org.gradle.api.Action; import org.gradle.api.publish.maven.MavenPom; import org.gradle.api.publish.maven.MavenPomDeveloper; @@ -16,19 +17,12 @@ import java.util.HashMap; import java.util.Map; -non-sealed interface PomUtilsInternal extends PomUtils, HasPublicType { +interface PomUtilsInternal extends PomUtils, HasPublicType { @Override default TypeOf getPublicType() { return TypeOf.typeOf(PomUtils.class); } - non-sealed interface Licenses extends PomUtils.Licenses, HasPublicType { - @Override - default TypeOf getPublicType() { - return TypeOf.typeOf(PomUtils.Licenses.class); - } - } - static Action makeLicense(String name, String url) { return license -> { license.getName().set(name); diff --git a/src/main/groovy/net/minecraftforge/gradleutils/internal/PomUtilsInternalProxy.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/PomUtilsInternalProxy.java new file mode 100644 index 0000000..c596300 --- /dev/null +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/PomUtilsInternalProxy.java @@ -0,0 +1,23 @@ +package net.minecraftforge.gradleutils.internal; + +import org.gradle.api.Action; +import org.gradle.api.publish.maven.MavenPomDeveloper; +import org.gradle.api.publish.maven.MavenPomLicense; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.VisibleForTesting; + +import java.util.Map; + +@VisibleForTesting +@ApiStatus.Internal +@Deprecated(forRemoval = true, since = "3.4.0") +@ApiStatus.ScheduledForRemoval(inVersion = "4.0.0") +public final class PomUtilsInternalProxy { + public static Action makeLicense(String name, String url) { + return PomUtilsInternal.makeLicense(name, url); + } + + public static Map> makeDevelopers() { + return PomUtilsInternal.makeDevelopers(); + } +} diff --git a/src/main/groovy/net/minecraftforge/gradleutils/PromotePublicationImpl.groovy b/src/main/groovy/net/minecraftforge/gradleutils/internal/PromotePublicationImpl.groovy similarity index 98% rename from src/main/groovy/net/minecraftforge/gradleutils/PromotePublicationImpl.groovy rename to src/main/groovy/net/minecraftforge/gradleutils/internal/PromotePublicationImpl.groovy index 8fc80a0..b2d9b21 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/PromotePublicationImpl.groovy +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/PromotePublicationImpl.groovy @@ -2,7 +2,7 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils +package net.minecraftforge.gradleutils.internal import groovy.json.JsonBuilder import groovy.transform.CompileStatic diff --git a/src/main/groovy/net/minecraftforge/gradleutils/PromotePublicationInternal.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/PromotePublicationInternal.java similarity index 54% rename from src/main/groovy/net/minecraftforge/gradleutils/PromotePublicationInternal.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/PromotePublicationInternal.java index 3ac65c7..b384e90 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/PromotePublicationInternal.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/PromotePublicationInternal.java @@ -2,16 +2,14 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; -import net.minecraftforge.gradleutils.shared.EnhancedPlugin; -import net.minecraftforge.gradleutils.shared.EnhancedTask; -import org.gradle.api.Project; +import net.minecraftforge.gradleutils.PromotePublication; import org.gradle.api.reflect.HasPublicType; import org.gradle.api.reflect.TypeOf; import org.gradle.api.tasks.Internal; -non-sealed interface PromotePublicationInternal extends PromotePublication, GradleUtilsTask, HasPublicType { +interface PromotePublicationInternal extends PromotePublication, GradleUtilsTask, HasPublicType { @Override default @Internal TypeOf getPublicType() { return TypeOf.typeOf(PromotePublication.class); diff --git a/src/main/groovy/net/minecraftforge/gradleutils/Util.java b/src/main/groovy/net/minecraftforge/gradleutils/internal/Util.java similarity index 80% rename from src/main/groovy/net/minecraftforge/gradleutils/Util.java rename to src/main/groovy/net/minecraftforge/gradleutils/internal/Util.java index 2b2f55b..6de5bf0 100644 --- a/src/main/groovy/net/minecraftforge/gradleutils/Util.java +++ b/src/main/groovy/net/minecraftforge/gradleutils/internal/Util.java @@ -2,7 +2,7 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.gradleutils; +package net.minecraftforge.gradleutils.internal; import net.minecraftforge.gradleutils.shared.SharedUtil;