From 5b9f31ddc3c3efc43148955c9a14ee3ed949855d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Thu, 25 May 2023 11:31:08 +0100 Subject: [PATCH 01/17] Move comment to a more relevant place. --- .../io/github/gradlenexus/publishplugin/NexusPublishExtension.kt | 1 - .../io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt index 543d3216..e7fc26a9 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt @@ -38,7 +38,6 @@ abstract class NexusPublishExtension @Inject constructor(objects: ObjectFactory) abstract val repositoryDescription: Property - // staging repository initialization can take a few minutes on Sonatype Nexus abstract val clientTimeout: Property abstract val connectTimeout: Property diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 28afbaec..8284e9aa 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -66,6 +66,7 @@ class NexusPublishPlugin : Plugin { useStaging.convention(project.provider { !project.version.toString().endsWith("-SNAPSHOT") }) packageGroup.convention(project.provider { project.group.toString() }) repositoryDescription.convention(project.provider { project.run { "$group:$name:$version" } }) + // Staging repository initialization can take a few minutes on Sonatype Nexus. clientTimeout.convention(Duration.ofMinutes(5)) connectTimeout.convention(Duration.ofMinutes(5)) transitionCheckOptions.maxRetries.convention(60) From ecd111e66b7a49684134a873a53453005a54b6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 17:05:57 +0100 Subject: [PATCH 02/17] Replace some throw IllegalStateException with Kotlin's error() --- .../io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt | 3 ++- .../gradlenexus/publishplugin/internal/StagingRepository.kt | 2 +- .../internal/StagingRepositoryDescriptorRegistry.kt | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 8284e9aa..3d64c86c 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -347,5 +347,6 @@ class NexusPublishPlugin : Plugin { inline fun Project.theExtension(): T = typeOf().let { - this.extensions.findByType(it) ?: throw IllegalStateException("The plugin cannot be applied without the publishing plugin") + this.extensions.findByType(it) + ?: error("The plugin cannot be applied without the publishing plugin") } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepository.kt index eb08f515..56657bfb 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepository.kt @@ -33,7 +33,7 @@ data class StagingRepository constructor(val id: String, val state: State, val t try { return valueOf(stateAsString.toUpperCase()) } catch (e: IllegalArgumentException) { - throw IllegalStateException("Unsupported repository state '$stateAsString'. Supported values: ${values()}") + error("Unsupported repository state '$stateAsString'. Supported values: ${values()}") } } } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepositoryDescriptorRegistry.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepositoryDescriptorRegistry.kt index bfd2632b..58d696c4 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepositoryDescriptorRegistry.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepositoryDescriptorRegistry.kt @@ -26,7 +26,7 @@ open class StagingRepositoryDescriptorRegistry { mapping[name] = descriptor } - operator fun get(name: String) = mapping[name] ?: throw IllegalStateException("No staging repository with name $name created") + operator fun get(name: String) = mapping[name] ?: error("No staging repository with name $name created") fun tryGet(name: String) = mapping[name] From b4032e0bbd73ea242aad75dae806235b00d6a425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 15:46:33 +0100 Subject: [PATCH 03/17] Hide utility function --- .../io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 3d64c86c..60acf410 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -345,7 +345,7 @@ class NexusPublishPlugin : Plugin { } } -inline fun Project.theExtension(): T = +private inline fun Project.theExtension(): T = typeOf().let { this.extensions.findByType(it) ?: error("The plugin cannot be applied without the publishing plugin") From defa76e0cf724609c504e357da513a9eb1e49b16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 11:27:02 +0100 Subject: [PATCH 04/17] More explicit types --- .../AbstractTransitionNexusStagingRepositoryTask.kt | 4 +++- .../gradlenexus/publishplugin/NexusPublishExtension.kt | 8 ++++++-- .../github/gradlenexus/publishplugin/NexusRepository.kt | 2 +- .../publishplugin/internal/StagingRepositoryDescriptor.kt | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt index b694678c..c1a86cf9 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt @@ -48,7 +48,9 @@ abstract class AbstractTransitionNexusStagingRepositoryTask( @get:Internal abstract val transitionCheckOptions: Property - fun transitionCheckOptions(action: Action) = action.execute(transitionCheckOptions.get()) + fun transitionCheckOptions(action: Action) { + action.execute(transitionCheckOptions.get()) + } @TaskAction fun transitionStagingRepo() { diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt index e7fc26a9..4eda433d 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt @@ -45,7 +45,9 @@ abstract class NexusPublishExtension @Inject constructor(objects: ObjectFactory) @get:Nested abstract val transitionCheckOptions: TransitionCheckOptions - fun transitionCheckOptions(action: Action) = action.execute(transitionCheckOptions) + fun transitionCheckOptions(action: Action) { + action.execute(transitionCheckOptions) + } val repositories: NexusRepositoryContainer = objects.newInstance( DefaultNexusRepositoryContainer::class, @@ -60,5 +62,7 @@ abstract class NexusPublishExtension @Inject constructor(objects: ObjectFactory) ) ) - fun repositories(action: Action) = action.execute(repositories) + fun repositories(action: Action) { + action.execute(repositories) + } } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusRepository.kt index 52881182..8be42c23 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusRepository.kt @@ -57,7 +57,7 @@ abstract class NexusRepository @Inject constructor(@Input val name: String) { abstract val stagingProfileId: Property @get:Internal - internal val capitalizedName by lazy { name.capitalize() } + internal val capitalizedName: String by lazy { name.capitalize() } @get:Optional @get:Input diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepositoryDescriptor.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepositoryDescriptor.kt index 5d90dcb5..52b4ae32 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepositoryDescriptor.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/StagingRepositoryDescriptor.kt @@ -19,7 +19,7 @@ package io.github.gradlenexus.publishplugin.internal import java.net.URI data class StagingRepositoryDescriptor(private val baseUrl: URI, val stagingRepositoryId: String) { - val stagingRepositoryUrl by lazy { + val stagingRepositoryUrl: URI by lazy { URI.create("${baseUrl.toString().removeSuffix("/")}/staging/deployByRepositoryId/$stagingRepositoryId") } } From c2e54cd4ee8013ecf4b70409d21ba44398ece79e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 15:26:50 +0100 Subject: [PATCH 05/17] Be more specific about reflection. invalidateDescriptor has existed since Gradle 4.10 https://github.com/gradle/gradle/commit/cea96d4361d86ce99835a028439b51ba5d075e36 Side effect of this is that it'll throw NoSuchMethodException if the method is not found so the warning will show instead of just silently (?.) ignoring it. --- .../InvalidatingStagingRepositoryDescriptorRegistry.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/InvalidatingStagingRepositoryDescriptorRegistry.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/InvalidatingStagingRepositoryDescriptorRegistry.kt index a959669e..541e28c2 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/InvalidatingStagingRepositoryDescriptorRegistry.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/internal/InvalidatingStagingRepositoryDescriptorRegistry.kt @@ -44,11 +44,12 @@ class InvalidatingStagingRepositoryDescriptorRegistry : StagingRepositoryDescrip private fun ArtifactRepository.invalidate() { if (this is AbstractResolutionAwareArtifactRepository<*>) { try { - val invalidateDescriptorMethod = AbstractResolutionAwareArtifactRepository::class.java.declaredMethods.find { it.name.contains("invalidateDescriptor") } - invalidateDescriptorMethod?.isAccessible = true - invalidateDescriptorMethod?.invoke(this) + AbstractResolutionAwareArtifactRepository::class.java + .getDeclaredMethod("invalidateDescriptor") + .apply { isAccessible = true } + .invoke(this) } catch (e: Exception) { - log.warn("Failed to invalidate artifacty repository URL, publishing will not work correctly") + log.warn("Failed to invalidate artifact repository URL, publishing will not work correctly.") } } } From 5fa5ea47b6c6485a4845b4f4a82ec3163a680878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 16:48:51 +0100 Subject: [PATCH 06/17] Simplify very long line --- .../gradlenexus/publishplugin/NexusPublishPlugin.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 60acf410..4dfed812 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -19,6 +19,7 @@ package io.github.gradlenexus.publishplugin import io.github.gradlenexus.publishplugin.NexusRepository.PublicationType import io.github.gradlenexus.publishplugin.internal.InvalidatingStagingRepositoryDescriptorRegistry import io.github.gradlenexus.publishplugin.internal.StagingRepositoryDescriptorRegistryBuildService +import org.gradle.api.Action import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.Task @@ -33,6 +34,7 @@ import org.gradle.kotlin.dsl.create import org.gradle.kotlin.dsl.invoke import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.register +import org.gradle.kotlin.dsl.registerIfAbsent import org.gradle.kotlin.dsl.typeOf import org.gradle.kotlin.dsl.withType import org.gradle.util.GradleVersion @@ -76,7 +78,11 @@ class NexusPublishPlugin : Plugin { private fun createRegistry(rootProject: Project): Provider { if (GradleVersion.current() >= GradleVersion.version("6.1")) { - return rootProject.gradle.sharedServices.registerIfAbsent("stagingRepositoryUrlRegistry", StagingRepositoryDescriptorRegistryBuildService::class.java) {}.map { it.registry } + return rootProject.gradle.sharedServices.registerIfAbsent( + "stagingRepositoryUrlRegistry", + StagingRepositoryDescriptorRegistryBuildService::class, + Action { } + ).map { it.registry } } val registry = InvalidatingStagingRepositoryDescriptorRegistry() return rootProject.provider { registry } From 5e5cbcac4d779ad3ae7756bc4b07681a4482bbaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 11:28:43 +0100 Subject: [PATCH 07/17] Simplify Kotlin DSL usage --- .../publishplugin/NexusPublishExtension.kt | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt index 4eda433d..5cb47d7b 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishExtension.kt @@ -17,7 +17,6 @@ package io.github.gradlenexus.publishplugin import org.gradle.api.Action -import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.tasks.Nested @@ -51,15 +50,7 @@ abstract class NexusPublishExtension @Inject constructor(objects: ObjectFactory) val repositories: NexusRepositoryContainer = objects.newInstance( DefaultNexusRepositoryContainer::class, - // `objects.domainObjectContainer(NexusRepository::class) { name -> ... }`, - // but in Kotlin 1.3 "New Inference" is not implemented yet, so we have to be explicit. - // https://kotlinlang.org/docs/whatsnew14.html#new-more-powerful-type-inference-algorithm - objects.domainObjectContainer( - NexusRepository::class, - NamedDomainObjectFactory { name -> - objects.newInstance(NexusRepository::class, name) - } - ) + objects.domainObjectContainer(NexusRepository::class) ) fun repositories(action: Action) { From 51e463ceb9dba5bca024515951e8ed579c418d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 16:54:03 +0100 Subject: [PATCH 08/17] Clarify who's "this". --- .../publishplugin/NexusPublishPlugin.kt | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 4dfed812..04ed8fcf 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -90,20 +90,21 @@ class NexusPublishPlugin : Plugin { private fun configureNexusTasks(rootProject: Project, extension: NexusPublishExtension, registry: Provider) { rootProject.tasks.withType(AbstractNexusStagingRepositoryTask::class.java).configureEach { - clientTimeout.convention(extension.clientTimeout) - connectTimeout.convention(extension.connectTimeout) - repositoryDescription.convention(extension.repositoryDescription) - useStaging.convention(extension.useStaging) + this.clientTimeout.convention(extension.clientTimeout) + this.connectTimeout.convention(extension.connectTimeout) + this.repositoryDescription.convention(extension.repositoryDescription) + this.useStaging.convention(extension.useStaging) } rootProject.tasks.withType(AbstractTransitionNexusStagingRepositoryTask::class.java).configureEach { - transitionCheckOptions.convention(extension.transitionCheckOptions) + this.transitionCheckOptions.convention(extension.transitionCheckOptions) } extension.repositories.all { - username.convention(rootProject.provider { rootProject.findProperty("${name}Username") as? String }) - password.convention(rootProject.provider { rootProject.findProperty("${name}Password") as? String }) - publicationType.convention(PublicationType.MAVEN) - val repository = this + + repository.username.convention(rootProject.provider { rootProject.findProperty("${name}Username") as? String }) + repository.password.convention(rootProject.provider { rootProject.findProperty("${name}Password") as? String }) + repository.publicationType.convention(PublicationType.MAVEN) + val retrieveStagingProfileTask = rootProject.tasks.register("retrieve${capitalizedName}StagingProfile", rootProject.objects, extension, repository) val initializeTask = rootProject.tasks.register( "initialize${capitalizedName}StagingRepository", From f4fec09ff7779e374c688d83016b615aa8c6f5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 15:45:55 +0100 Subject: [PATCH 09/17] Move task setup closer to their creation and ensure all tasks have a group and description. --- .../publishplugin/NexusPublishPlugin.kt | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 04ed8fcf..9f57c7ba 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -105,7 +105,18 @@ class NexusPublishPlugin : Plugin { repository.password.convention(rootProject.provider { rootProject.findProperty("${name}Password") as? String }) repository.publicationType.convention(PublicationType.MAVEN) - val retrieveStagingProfileTask = rootProject.tasks.register("retrieve${capitalizedName}StagingProfile", rootProject.objects, extension, repository) + val retrieveStagingProfileTask = rootProject.tasks.register( + "retrieve${capitalizedName}StagingProfile", + rootProject.objects, + extension, + repository + ) + retrieveStagingProfileTask { + this.group = PublishingPlugin.PUBLISH_TASK_GROUP + this.description = "Gets and displays a staging profile id for a given repository and package group. " + + "This is a diagnostic task to get the value and " + + "put it into the NexusRepository configuration closure as stagingProfileId." + } val initializeTask = rootProject.tasks.register( "initialize${capitalizedName}StagingRepository", rootProject.objects, @@ -113,6 +124,10 @@ class NexusPublishPlugin : Plugin { repository, registry ) + initializeTask { + this.group = PublishingPlugin.PUBLISH_TASK_GROUP + this.description = "Initializes the staging repository in '${repository.name}' Nexus instance." + } val findStagingRepository = rootProject.tasks.register( "find${capitalizedName}StagingRepository", rootProject.objects, @@ -121,7 +136,8 @@ class NexusPublishPlugin : Plugin { registry ) findStagingRepository { - description = "Finds the staging repository for ${repository.name}" + this.group = PublishingPlugin.PUBLISH_TASK_GROUP + this.description = "Finds the staging repository for ${repository.name}" } val closeTask = rootProject.tasks.register( "close${capitalizedName}StagingRepository", @@ -129,34 +145,37 @@ class NexusPublishPlugin : Plugin { repository, registry ) + closeTask { + this.group = PublishingPlugin.PUBLISH_TASK_GROUP + this.description = "Closes open staging repository in '${repository.name}' Nexus instance." + } val releaseTask = rootProject.tasks.register( "release${capitalizedName}StagingRepository", rootProject.objects, repository, registry ) + releaseTask { + this.group = PublishingPlugin.PUBLISH_TASK_GROUP + this.description = "Releases closed staging repository in '${repository.name}' Nexus instance." + } val closeAndReleaseTask = rootProject.tasks.register( "closeAndRelease${capitalizedName}StagingRepository" - ) - retrieveStagingProfileTask { - description = "Gets and displays a staging profile id for a given repository and package group. This is a diagnostic task to get the value and put it into the NexusRepository configuration closure as stagingProfileId." + ) { + this.group = PublishingPlugin.PUBLISH_TASK_GROUP + this.description = "Closes and releases open staging repository in '${repository.name}' Nexus instance." } + closeTask { - description = "Closes open staging repository in '${repository.name}' Nexus instance." - group = PublishingPlugin.PUBLISH_TASK_GROUP mustRunAfter(initializeTask) mustRunAfter(findStagingRepository) } releaseTask { - description = "Releases closed staging repository in '${repository.name}' Nexus instance." - group = PublishingPlugin.PUBLISH_TASK_GROUP mustRunAfter(initializeTask) mustRunAfter(findStagingRepository) mustRunAfter(closeTask) } closeAndReleaseTask { - description = "Closes and releases open staging repository in '${repository.name}' Nexus instance." - group = PublishingPlugin.PUBLISH_TASK_GROUP dependsOn(closeTask, releaseTask) } } @@ -178,8 +197,8 @@ class NexusPublishPlugin : Plugin { } } rootProject.tasks.register(SIMPLIFIED_CLOSE_AND_RELEASE_TASK_NAME) { - description = "Closes and releases open staging repositories in all configured Nexus instances." group = PublishingPlugin.PUBLISH_TASK_GROUP + description = "Closes and releases open staging repositories in all configured Nexus instances." enabled = false } } @@ -202,8 +221,8 @@ class NexusPublishPlugin : Plugin { val closeTask = rootProject.tasks.named("close${nexusRepo.capitalizedName}StagingRepository") val releaseTask = rootProject.tasks.named("release${nexusRepo.capitalizedName}StagingRepository") val publishAllTask = publishingProject.tasks.register("publishTo${nexusRepo.capitalizedName}") { - description = "Publishes all Maven/Ivy publications produced by this project to the '${nexusRepo.name}' Nexus repository." group = PublishingPlugin.PUBLISH_TASK_GROUP + description = "Publishes all Maven/Ivy publications produced by this project to the '${nexusRepo.name}' Nexus repository." } closeTask { mustRunAfter(publishAllTask) From 5c034d59352f0393ddf7bd5a299fab969c208519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 11:48:39 +0100 Subject: [PATCH 10/17] Remove all ObjectFactory usages from tasks. Note: Gradle gets confused about a mutable property when generating the decorated code. Renaming the setters detaches it from the real property. Example clash: AbstractTransitionNexusStagingRepositoryTask.stagingRepositoryId -> getStagingRepositoryId: Property ReleaseNexusStagingRepository.setStagingRepositoryId -> setStagingRepositoryId(String) together these two form a broken property. --- .../AbstractNexusStagingRepositoryTask.kt | 11 +++----- ...actTransitionNexusStagingRepositoryTask.kt | 13 +++++----- .../CloseNexusStagingRepository.kt | 6 ++--- .../publishplugin/FindStagingRepository.kt | 26 ++++++++----------- .../InitializeNexusStagingRepository.kt | 16 ++++++------ .../publishplugin/NexusPublishPlugin.kt | 5 ---- .../ReleaseNexusStagingRepository.kt | 6 ++--- .../publishplugin/RetrieveStagingProfile.kt | 14 +++++----- 8 files changed, 40 insertions(+), 57 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt index 96aaf461..10edb4fd 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt @@ -17,17 +17,15 @@ package io.github.gradlenexus.publishplugin import org.gradle.api.DefaultTask -import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Nested -import org.gradle.kotlin.dsl.property import java.time.Duration import javax.inject.Inject abstract class AbstractNexusStagingRepositoryTask @Inject -constructor(objects: ObjectFactory, repository: NexusRepository) : DefaultTask() { +constructor(repository: NexusRepository) : DefaultTask() { @get:Internal abstract val clientTimeout: Property @@ -36,10 +34,8 @@ constructor(objects: ObjectFactory, repository: NexusRepository) : DefaultTask() abstract val connectTimeout: Property // TODO: Expose externally as interface with getters only - @Nested - val repository = objects.property().apply { - set(repository) - } + @get:Nested + abstract val repository: Property @get:Input abstract val repositoryDescription: Property @@ -48,6 +44,7 @@ constructor(objects: ObjectFactory, repository: NexusRepository) : DefaultTask() internal abstract val useStaging: Property init { + this.repository.set(repository) this.onlyIf { useStaging.getOrElse(false) } } } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt index c1a86cf9..71a3c3bf 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt @@ -22,23 +22,22 @@ import io.github.gradlenexus.publishplugin.internal.NexusClient import io.github.gradlenexus.publishplugin.internal.StagingRepository import io.github.gradlenexus.publishplugin.internal.StagingRepositoryTransitioner import org.gradle.api.Action -import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.TaskAction -import org.gradle.kotlin.dsl.property abstract class AbstractTransitionNexusStagingRepositoryTask( - objects: ObjectFactory, repository: NexusRepository, registry: Provider -) : AbstractNexusStagingRepositoryTask(objects, repository) { +) : AbstractNexusStagingRepositoryTask(repository) { - @Input - val stagingRepositoryId = objects.property().apply { - set( + @get:Input + abstract val stagingRepositoryId: Property + + init { + this.stagingRepositoryId.set( registry.map { it[repository.name].stagingRepositoryId } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt index b6b37fb0..23d7ada2 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt @@ -18,19 +18,17 @@ package io.github.gradlenexus.publishplugin import io.github.gradlenexus.publishplugin.internal.InvalidatingStagingRepositoryDescriptorRegistry import io.github.gradlenexus.publishplugin.internal.StagingRepositoryTransitioner -import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Provider import org.gradle.api.tasks.options.Option import javax.inject.Inject abstract class CloseNexusStagingRepository @Inject constructor( - objects: ObjectFactory, repository: NexusRepository, registry: Provider -) : AbstractTransitionNexusStagingRepositoryTask(objects, repository, registry) { +) : AbstractTransitionNexusStagingRepositoryTask(repository, registry) { @Option(option = "staging-repository-id", description = "staging repository id to close") - fun setStagingRepositoryId(stagingRepositoryId: String) { + fun setStagingRepositoryIdToClose(stagingRepositoryId: String) { this.stagingRepositoryId.set(stagingRepositoryId) } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt index 426fa0fd..80e05038 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt @@ -20,38 +20,34 @@ import io.github.gradlenexus.publishplugin.internal.InvalidatingStagingRepositor import io.github.gradlenexus.publishplugin.internal.NexusClient import org.gradle.api.GradleException import org.gradle.api.Incubating -import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction -import org.gradle.kotlin.dsl.property import javax.inject.Inject @Incubating abstract class FindStagingRepository @Inject constructor( - objects: ObjectFactory, extension: NexusPublishExtension, repository: NexusRepository, private val registry: Provider -) : AbstractNexusStagingRepositoryTask(objects, repository) { +) : AbstractNexusStagingRepositoryTask(repository) { - @Optional - @Input - val packageGroup = objects.property().apply { - set(extension.packageGroup) - } + @get:Optional + @get:Input + abstract val packageGroup: Property - @Input - val descriptionRegex = objects.property().apply { - set(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" }) - } + @get:Input + abstract val descriptionRegex: Property - @Internal - val stagingRepositoryId = objects.property() + @get:Internal + abstract val stagingRepositoryId: Property init { + this.packageGroup.set(extension.packageGroup) + this.descriptionRegex.set(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" }) outputs.cacheIf("the task requests data from the external repository, so we don't want to cache it") { false } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt index 59ebae89..27992025 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt @@ -20,25 +20,25 @@ import io.github.gradlenexus.publishplugin.internal.InvalidatingStagingRepositor import io.github.gradlenexus.publishplugin.internal.NexusClient import okhttp3.HttpUrl import org.gradle.api.GradleException -import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction -import org.gradle.kotlin.dsl.property import javax.inject.Inject abstract class InitializeNexusStagingRepository @Inject constructor( - objects: ObjectFactory, extension: NexusPublishExtension, repository: NexusRepository, private val registry: Provider -) : AbstractNexusStagingRepositoryTask(objects, repository) { +) : AbstractNexusStagingRepositoryTask(repository) { - @Optional - @Input - val packageGroup = objects.property().apply { - set(extension.packageGroup) + @get:Optional + @get:Input + abstract val packageGroup: Property + + init { + this.packageGroup.set(extension.packageGroup) } @TaskAction diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 9f57c7ba..e8e04696 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -107,7 +107,6 @@ class NexusPublishPlugin : Plugin { val retrieveStagingProfileTask = rootProject.tasks.register( "retrieve${capitalizedName}StagingProfile", - rootProject.objects, extension, repository ) @@ -119,7 +118,6 @@ class NexusPublishPlugin : Plugin { } val initializeTask = rootProject.tasks.register( "initialize${capitalizedName}StagingRepository", - rootProject.objects, extension, repository, registry @@ -130,7 +128,6 @@ class NexusPublishPlugin : Plugin { } val findStagingRepository = rootProject.tasks.register( "find${capitalizedName}StagingRepository", - rootProject.objects, extension, repository, registry @@ -141,7 +138,6 @@ class NexusPublishPlugin : Plugin { } val closeTask = rootProject.tasks.register( "close${capitalizedName}StagingRepository", - rootProject.objects, repository, registry ) @@ -151,7 +147,6 @@ class NexusPublishPlugin : Plugin { } val releaseTask = rootProject.tasks.register( "release${capitalizedName}StagingRepository", - rootProject.objects, repository, registry ) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt index 918eef4c..f808bd9b 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt @@ -18,19 +18,17 @@ package io.github.gradlenexus.publishplugin import io.github.gradlenexus.publishplugin.internal.InvalidatingStagingRepositoryDescriptorRegistry import io.github.gradlenexus.publishplugin.internal.StagingRepositoryTransitioner -import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Provider import org.gradle.api.tasks.options.Option import javax.inject.Inject abstract class ReleaseNexusStagingRepository @Inject constructor( - objects: ObjectFactory, repository: NexusRepository, registry: Provider -) : AbstractTransitionNexusStagingRepositoryTask(objects, repository, registry) { +) : AbstractTransitionNexusStagingRepositoryTask(repository, registry) { @Option(option = "staging-repository-id", description = "staging repository id to release") - fun setStagingRepositoryId(stagingRepositoryId: String) { + fun setStagingRepositoryIdToRelease(stagingRepositoryId: String) { this.stagingRepositoryId.set(stagingRepositoryId) } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt index 822a2f93..161fcceb 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt @@ -19,10 +19,9 @@ package io.github.gradlenexus.publishplugin import io.github.gradlenexus.publishplugin.internal.NexusClient import org.gradle.api.GradleException import org.gradle.api.Incubating -import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction -import org.gradle.kotlin.dsl.property import javax.inject.Inject /** @@ -30,14 +29,15 @@ import javax.inject.Inject */ @Incubating abstract class RetrieveStagingProfile @Inject constructor( - objects: ObjectFactory, extension: NexusPublishExtension, repository: NexusRepository -) : AbstractNexusStagingRepositoryTask(objects, repository) { +) : AbstractNexusStagingRepositoryTask(repository) { - @Input - val packageGroup = objects.property().apply { - set(extension.packageGroup) + @get:Input + abstract val packageGroup: Property + + init { + this.packageGroup.set(extension.packageGroup) } @TaskAction From 6af4ca8826dedb9b595f83c19739c3a7b938f158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Thu, 25 May 2023 14:30:44 +0100 Subject: [PATCH 11/17] Remove last injected Extensions in tasks --- .../gradlenexus/publishplugin/FindStagingRepository.kt | 3 --- .../publishplugin/InitializeNexusStagingRepository.kt | 5 ----- .../github/gradlenexus/publishplugin/NexusPublishPlugin.kt | 7 ++++--- .../gradlenexus/publishplugin/RetrieveStagingProfile.kt | 5 ----- 4 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt index 80e05038..beeadd53 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt @@ -30,7 +30,6 @@ import javax.inject.Inject @Incubating abstract class FindStagingRepository @Inject constructor( - extension: NexusPublishExtension, repository: NexusRepository, private val registry: Provider ) : AbstractNexusStagingRepositoryTask(repository) { @@ -46,8 +45,6 @@ abstract class FindStagingRepository @Inject constructor( abstract val stagingRepositoryId: Property init { - this.packageGroup.set(extension.packageGroup) - this.descriptionRegex.set(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" }) outputs.cacheIf("the task requests data from the external repository, so we don't want to cache it") { false } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt index 27992025..6ab21d93 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt @@ -28,7 +28,6 @@ import org.gradle.api.tasks.TaskAction import javax.inject.Inject abstract class InitializeNexusStagingRepository @Inject constructor( - extension: NexusPublishExtension, repository: NexusRepository, private val registry: Provider ) : AbstractNexusStagingRepositoryTask(repository) { @@ -37,10 +36,6 @@ abstract class InitializeNexusStagingRepository @Inject constructor( @get:Input abstract val packageGroup: Property - init { - this.packageGroup.set(extension.packageGroup) - } - @TaskAction fun createStagingRepo() { val repository = repository.get() diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index e8e04696..340c41cf 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -107,7 +107,6 @@ class NexusPublishPlugin : Plugin { val retrieveStagingProfileTask = rootProject.tasks.register( "retrieve${capitalizedName}StagingProfile", - extension, repository ) retrieveStagingProfileTask { @@ -115,26 +114,28 @@ class NexusPublishPlugin : Plugin { this.description = "Gets and displays a staging profile id for a given repository and package group. " + "This is a diagnostic task to get the value and " + "put it into the NexusRepository configuration closure as stagingProfileId." + this.packageGroup.convention(extension.packageGroup) } val initializeTask = rootProject.tasks.register( "initialize${capitalizedName}StagingRepository", - extension, repository, registry ) initializeTask { this.group = PublishingPlugin.PUBLISH_TASK_GROUP this.description = "Initializes the staging repository in '${repository.name}' Nexus instance." + this.packageGroup.convention(extension.packageGroup) } val findStagingRepository = rootProject.tasks.register( "find${capitalizedName}StagingRepository", - extension, repository, registry ) findStagingRepository { this.group = PublishingPlugin.PUBLISH_TASK_GROUP this.description = "Finds the staging repository for ${repository.name}" + this.packageGroup.convention(extension.packageGroup) + this.descriptionRegex.convention(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" }) } val closeTask = rootProject.tasks.register( "close${capitalizedName}StagingRepository", diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt index 161fcceb..1e66410d 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt @@ -29,17 +29,12 @@ import javax.inject.Inject */ @Incubating abstract class RetrieveStagingProfile @Inject constructor( - extension: NexusPublishExtension, repository: NexusRepository ) : AbstractNexusStagingRepositoryTask(repository) { @get:Input abstract val packageGroup: Property - init { - this.packageGroup.set(extension.packageGroup) - } - @TaskAction fun retrieveStagingProfile() { val repository = repository.get() From dd632c07c72bc2b2ad518030c3a849cef101de0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 15:12:55 +0100 Subject: [PATCH 12/17] Remove constructor-injected Repository --- .../AbstractNexusStagingRepositoryTask.kt | 5 +---- ...tractTransitionNexusStagingRepositoryTask.kt | 5 ++--- .../CloseNexusStagingRepository.kt | 3 +-- .../publishplugin/FindStagingRepository.kt | 3 +-- .../InitializeNexusStagingRepository.kt | 3 +-- .../publishplugin/NexusPublishPlugin.kt | 17 +++++++++-------- .../ReleaseNexusStagingRepository.kt | 3 +-- .../publishplugin/RetrieveStagingProfile.kt | 5 +---- 8 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt index 10edb4fd..e38b9283 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt @@ -22,10 +22,8 @@ import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Nested import java.time.Duration -import javax.inject.Inject -abstract class AbstractNexusStagingRepositoryTask @Inject -constructor(repository: NexusRepository) : DefaultTask() { +abstract class AbstractNexusStagingRepositoryTask : DefaultTask() { @get:Internal abstract val clientTimeout: Property @@ -44,7 +42,6 @@ constructor(repository: NexusRepository) : DefaultTask() { internal abstract val useStaging: Property init { - this.repository.set(repository) this.onlyIf { useStaging.getOrElse(false) } } } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt index 71a3c3bf..ab4a1305 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt @@ -29,9 +29,8 @@ import org.gradle.api.tasks.Internal import org.gradle.api.tasks.TaskAction abstract class AbstractTransitionNexusStagingRepositoryTask( - repository: NexusRepository, registry: Provider -) : AbstractNexusStagingRepositoryTask(repository) { +) : AbstractNexusStagingRepositoryTask() { @get:Input abstract val stagingRepositoryId: Property @@ -39,7 +38,7 @@ abstract class AbstractTransitionNexusStagingRepositoryTask( init { this.stagingRepositoryId.set( registry.map { - it[repository.name].stagingRepositoryId + it[repository.get().name].stagingRepositoryId } ) } diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt index 23d7ada2..7a35b124 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt @@ -23,9 +23,8 @@ import org.gradle.api.tasks.options.Option import javax.inject.Inject abstract class CloseNexusStagingRepository @Inject constructor( - repository: NexusRepository, registry: Provider -) : AbstractTransitionNexusStagingRepositoryTask(repository, registry) { +) : AbstractTransitionNexusStagingRepositoryTask(registry) { @Option(option = "staging-repository-id", description = "staging repository id to close") fun setStagingRepositoryIdToClose(stagingRepositoryId: String) { diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt index beeadd53..d1ab29b2 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt @@ -30,9 +30,8 @@ import javax.inject.Inject @Incubating abstract class FindStagingRepository @Inject constructor( - repository: NexusRepository, private val registry: Provider -) : AbstractNexusStagingRepositoryTask(repository) { +) : AbstractNexusStagingRepositoryTask() { @get:Optional @get:Input diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt index 6ab21d93..e2d85d6e 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt @@ -28,9 +28,8 @@ import org.gradle.api.tasks.TaskAction import javax.inject.Inject abstract class InitializeNexusStagingRepository @Inject constructor( - repository: NexusRepository, private val registry: Provider -) : AbstractNexusStagingRepositoryTask(repository) { +) : AbstractNexusStagingRepositoryTask() { @get:Optional @get:Input diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 340c41cf..e9979153 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -94,6 +94,7 @@ class NexusPublishPlugin : Plugin { this.connectTimeout.convention(extension.connectTimeout) this.repositoryDescription.convention(extension.repositoryDescription) this.useStaging.convention(extension.useStaging) + // this.repository.convention() is set inside extension.repositories.all { }. } rootProject.tasks.withType(AbstractTransitionNexusStagingRepositoryTask::class.java).configureEach { this.transitionCheckOptions.convention(extension.transitionCheckOptions) @@ -105,55 +106,55 @@ class NexusPublishPlugin : Plugin { repository.password.convention(rootProject.provider { rootProject.findProperty("${name}Password") as? String }) repository.publicationType.convention(PublicationType.MAVEN) + @Suppress("UNUSED_VARIABLE") // Keep it consistent. val retrieveStagingProfileTask = rootProject.tasks.register( - "retrieve${capitalizedName}StagingProfile", - repository - ) - retrieveStagingProfileTask { + "retrieve${capitalizedName}StagingProfile" + ) { this.group = PublishingPlugin.PUBLISH_TASK_GROUP this.description = "Gets and displays a staging profile id for a given repository and package group. " + "This is a diagnostic task to get the value and " + "put it into the NexusRepository configuration closure as stagingProfileId." + this.repository.convention(repository) this.packageGroup.convention(extension.packageGroup) } val initializeTask = rootProject.tasks.register( "initialize${capitalizedName}StagingRepository", - repository, registry ) initializeTask { this.group = PublishingPlugin.PUBLISH_TASK_GROUP this.description = "Initializes the staging repository in '${repository.name}' Nexus instance." + this.repository.convention(repository) this.packageGroup.convention(extension.packageGroup) } val findStagingRepository = rootProject.tasks.register( "find${capitalizedName}StagingRepository", - repository, registry ) findStagingRepository { this.group = PublishingPlugin.PUBLISH_TASK_GROUP this.description = "Finds the staging repository for ${repository.name}" + this.repository.convention(repository) this.packageGroup.convention(extension.packageGroup) this.descriptionRegex.convention(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" }) } val closeTask = rootProject.tasks.register( "close${capitalizedName}StagingRepository", - repository, registry ) closeTask { this.group = PublishingPlugin.PUBLISH_TASK_GROUP this.description = "Closes open staging repository in '${repository.name}' Nexus instance." + this.repository.convention(repository) } val releaseTask = rootProject.tasks.register( "release${capitalizedName}StagingRepository", - repository, registry ) releaseTask { this.group = PublishingPlugin.PUBLISH_TASK_GROUP this.description = "Releases closed staging repository in '${repository.name}' Nexus instance." + this.repository.convention(repository) } val closeAndReleaseTask = rootProject.tasks.register( "closeAndRelease${capitalizedName}StagingRepository" diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt index f808bd9b..2fe58c3f 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt @@ -23,9 +23,8 @@ import org.gradle.api.tasks.options.Option import javax.inject.Inject abstract class ReleaseNexusStagingRepository @Inject constructor( - repository: NexusRepository, registry: Provider -) : AbstractTransitionNexusStagingRepositoryTask(repository, registry) { +) : AbstractTransitionNexusStagingRepositoryTask(registry) { @Option(option = "staging-repository-id", description = "staging repository id to release") fun setStagingRepositoryIdToRelease(stagingRepositoryId: String) { diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt index 1e66410d..d44bc8a0 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/RetrieveStagingProfile.kt @@ -22,15 +22,12 @@ import org.gradle.api.Incubating import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction -import javax.inject.Inject /** * Diagnostic task for retrieving the [NexusRepository.stagingProfileId] for the [packageGroup] from the provided [NexusRepository] and logging it */ @Incubating -abstract class RetrieveStagingProfile @Inject constructor( - repository: NexusRepository -) : AbstractNexusStagingRepositoryTask(repository) { +abstract class RetrieveStagingProfile : AbstractNexusStagingRepositoryTask() { @get:Input abstract val packageGroup: Property From 548b707e00b5846c29d8ad3a9c1ce9ea61dda02a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 16:18:15 +0100 Subject: [PATCH 13/17] Reduce constructor injection of registry by wiring the convention outside of the task. --- ...AbstractTransitionNexusStagingRepositoryTask.kt | 14 +------------- .../publishplugin/CloseNexusStagingRepository.kt | 7 +------ .../publishplugin/NexusPublishPlugin.kt | 13 +++++-------- .../publishplugin/ReleaseNexusStagingRepository.kt | 7 +------ 4 files changed, 8 insertions(+), 33 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt index ab4a1305..9813aba4 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractTransitionNexusStagingRepositoryTask.kt @@ -17,32 +17,20 @@ package io.github.gradlenexus.publishplugin import io.github.gradlenexus.publishplugin.internal.BasicActionRetrier -import io.github.gradlenexus.publishplugin.internal.InvalidatingStagingRepositoryDescriptorRegistry import io.github.gradlenexus.publishplugin.internal.NexusClient import io.github.gradlenexus.publishplugin.internal.StagingRepository import io.github.gradlenexus.publishplugin.internal.StagingRepositoryTransitioner import org.gradle.api.Action import org.gradle.api.provider.Property -import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.TaskAction -abstract class AbstractTransitionNexusStagingRepositoryTask( - registry: Provider -) : AbstractNexusStagingRepositoryTask() { +abstract class AbstractTransitionNexusStagingRepositoryTask : AbstractNexusStagingRepositoryTask() { @get:Input abstract val stagingRepositoryId: Property - init { - this.stagingRepositoryId.set( - registry.map { - it[repository.get().name].stagingRepositoryId - } - ) - } - @get:Internal abstract val transitionCheckOptions: Property diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt index 7a35b124..b12cb4ce 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/CloseNexusStagingRepository.kt @@ -16,15 +16,10 @@ package io.github.gradlenexus.publishplugin -import io.github.gradlenexus.publishplugin.internal.InvalidatingStagingRepositoryDescriptorRegistry import io.github.gradlenexus.publishplugin.internal.StagingRepositoryTransitioner -import org.gradle.api.provider.Provider import org.gradle.api.tasks.options.Option -import javax.inject.Inject -abstract class CloseNexusStagingRepository @Inject constructor( - registry: Provider -) : AbstractTransitionNexusStagingRepositoryTask(registry) { +abstract class CloseNexusStagingRepository : AbstractTransitionNexusStagingRepositoryTask() { @Option(option = "staging-repository-id", description = "staging repository id to close") fun setStagingRepositoryIdToClose(stagingRepositoryId: String) { diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index e9979153..24f18e25 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -98,6 +98,7 @@ class NexusPublishPlugin : Plugin { } rootProject.tasks.withType(AbstractTransitionNexusStagingRepositoryTask::class.java).configureEach { this.transitionCheckOptions.convention(extension.transitionCheckOptions) + this.stagingRepositoryId.convention(registry.map { it[repository.get().name].stagingRepositoryId }) } extension.repositories.all { val repository = this @@ -139,19 +140,15 @@ class NexusPublishPlugin : Plugin { this.descriptionRegex.convention(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" }) } val closeTask = rootProject.tasks.register( - "close${capitalizedName}StagingRepository", - registry - ) - closeTask { + "close${capitalizedName}StagingRepository" + ) { this.group = PublishingPlugin.PUBLISH_TASK_GROUP this.description = "Closes open staging repository in '${repository.name}' Nexus instance." this.repository.convention(repository) } val releaseTask = rootProject.tasks.register( - "release${capitalizedName}StagingRepository", - registry - ) - releaseTask { + "release${capitalizedName}StagingRepository" + ) { this.group = PublishingPlugin.PUBLISH_TASK_GROUP this.description = "Releases closed staging repository in '${repository.name}' Nexus instance." this.repository.convention(repository) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt index 2fe58c3f..4baaf6ec 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/ReleaseNexusStagingRepository.kt @@ -16,15 +16,10 @@ package io.github.gradlenexus.publishplugin -import io.github.gradlenexus.publishplugin.internal.InvalidatingStagingRepositoryDescriptorRegistry import io.github.gradlenexus.publishplugin.internal.StagingRepositoryTransitioner -import org.gradle.api.provider.Provider import org.gradle.api.tasks.options.Option -import javax.inject.Inject -abstract class ReleaseNexusStagingRepository @Inject constructor( - registry: Provider -) : AbstractTransitionNexusStagingRepositoryTask(registry) { +abstract class ReleaseNexusStagingRepository : AbstractTransitionNexusStagingRepositoryTask() { @Option(option = "staging-repository-id", description = "staging repository id to release") fun setStagingRepositoryIdToRelease(stagingRepositoryId: String) { From ef4ae209428e2397d07a9ce498f6668ca985a3d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 17:11:40 +0100 Subject: [PATCH 14/17] Reduce project.provider { } and .get() calls, and use lazy API instead. --- .../publishplugin/NexusPublishPlugin.kt | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 24f18e25..c2a70fd7 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -38,6 +38,7 @@ import org.gradle.kotlin.dsl.registerIfAbsent import org.gradle.kotlin.dsl.typeOf import org.gradle.kotlin.dsl.withType import org.gradle.util.GradleVersion +import java.net.URI import java.time.Duration class NexusPublishPlugin : Plugin { @@ -249,11 +250,11 @@ class NexusPublishPlugin : Plugin { registry: Provider ): ArtifactRepository = when (publicationType) { PublicationType.MAVEN -> project.theExtension().repositories.maven { - configureArtifactRepo(nexusRepo, project, extension, registry, false) + configureArtifactRepo(nexusRepo, extension, registry, false) } PublicationType.IVY -> project.theExtension().repositories.ivy { - configureArtifactRepo(nexusRepo, project, extension, registry, true) + configureArtifactRepo(nexusRepo, extension, registry, true) if (nexusRepo.ivyPatternLayout.isPresent) { nexusRepo.ivyPatternLayout.get().let { this.patternLayout(it) } } else { @@ -264,17 +265,12 @@ class NexusPublishPlugin : Plugin { private fun T.configureArtifactRepo( nexusRepo: NexusRepository, - project: Project, extension: NexusPublishExtension, registry: Provider, provideFallback: Boolean ) where T : UrlArtifactRepository, T : ArtifactRepository, T : AuthenticationSupported { name = nexusRepo.name - setUrl( - project.provider { - getRepoUrl(nexusRepo, extension, registry, provideFallback, this) - } - ) + setUrl(getRepoUrl(nexusRepo, extension, registry, provideFallback, this)) val allowInsecureProtocol = nexusRepo.allowInsecureProtocol.orNull if (allowInsecureProtocol != null) { isAllowInsecureProtocol = allowInsecureProtocol @@ -329,17 +325,21 @@ class NexusPublishPlugin : Plugin { registry: Provider, provideFallback: Boolean, artifactRepo: ArtifactRepository - ) = if (extension.useStaging.get()) { - val descriptorRegistry = registry.get() - if (provideFallback) { - descriptorRegistry.invalidateLater(nexusRepo.name, artifactRepo) - descriptorRegistry.tryGet(nexusRepo.name)?.stagingRepositoryUrl ?: nexusRepo.nexusUrl.get() - } else { - descriptorRegistry[nexusRepo.name].stagingRepositoryUrl + ): Provider = + extension.useStaging.flatMap { useStaging -> + if (useStaging) { + registry.map { descriptorRegistry -> + if (provideFallback) { + descriptorRegistry.invalidateLater(nexusRepo.name, artifactRepo) + descriptorRegistry.tryGet(nexusRepo.name)?.stagingRepositoryUrl ?: nexusRepo.nexusUrl.get() + } else { + descriptorRegistry[nexusRepo.name].stagingRepositoryUrl + } + } + } else { + nexusRepo.snapshotRepositoryUrl + } } - } else { - nexusRepo.snapshotRepositoryUrl.get() - } private fun configureSimplifiedCloseAndReleaseTask(rootProject: Project, extension: NexusPublishExtension) { if (extension.repositories.isNotEmpty()) { From 777dbdebc1f8fe90311d15421b7c157722ac6c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Sat, 8 Jul 2023 20:18:00 +0100 Subject: [PATCH 15/17] Extract task creation for each repository to make inputs more explicit. --- .../publishplugin/NexusPublishPlugin.kt | 163 +++++++++--------- 1 file changed, 85 insertions(+), 78 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index c2a70fd7..24ae89e0 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -29,6 +29,7 @@ import org.gradle.api.artifacts.repositories.UrlArtifactRepository import org.gradle.api.provider.Provider import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.plugins.PublishingPlugin +import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.create import org.gradle.kotlin.dsl.invoke @@ -91,88 +92,21 @@ class NexusPublishPlugin : Plugin { private fun configureNexusTasks(rootProject: Project, extension: NexusPublishExtension, registry: Provider) { rootProject.tasks.withType(AbstractNexusStagingRepositoryTask::class.java).configureEach { - this.clientTimeout.convention(extension.clientTimeout) - this.connectTimeout.convention(extension.connectTimeout) - this.repositoryDescription.convention(extension.repositoryDescription) - this.useStaging.convention(extension.useStaging) - // this.repository.convention() is set inside extension.repositories.all { }. + clientTimeout.convention(extension.clientTimeout) + connectTimeout.convention(extension.connectTimeout) + repositoryDescription.convention(extension.repositoryDescription) + useStaging.convention(extension.useStaging) + // repository.convention() is set in configureRepositoryTasks(). } rootProject.tasks.withType(AbstractTransitionNexusStagingRepositoryTask::class.java).configureEach { - this.transitionCheckOptions.convention(extension.transitionCheckOptions) - this.stagingRepositoryId.convention(registry.map { it[repository.get().name].stagingRepositoryId }) + transitionCheckOptions.convention(extension.transitionCheckOptions) + stagingRepositoryId.convention(registry.map { it[repository.get().name].stagingRepositoryId }) } extension.repositories.all { - val repository = this - - repository.username.convention(rootProject.provider { rootProject.findProperty("${name}Username") as? String }) - repository.password.convention(rootProject.provider { rootProject.findProperty("${name}Password") as? String }) - repository.publicationType.convention(PublicationType.MAVEN) - - @Suppress("UNUSED_VARIABLE") // Keep it consistent. - val retrieveStagingProfileTask = rootProject.tasks.register( - "retrieve${capitalizedName}StagingProfile" - ) { - this.group = PublishingPlugin.PUBLISH_TASK_GROUP - this.description = "Gets and displays a staging profile id for a given repository and package group. " + - "This is a diagnostic task to get the value and " + - "put it into the NexusRepository configuration closure as stagingProfileId." - this.repository.convention(repository) - this.packageGroup.convention(extension.packageGroup) - } - val initializeTask = rootProject.tasks.register( - "initialize${capitalizedName}StagingRepository", - registry - ) - initializeTask { - this.group = PublishingPlugin.PUBLISH_TASK_GROUP - this.description = "Initializes the staging repository in '${repository.name}' Nexus instance." - this.repository.convention(repository) - this.packageGroup.convention(extension.packageGroup) - } - val findStagingRepository = rootProject.tasks.register( - "find${capitalizedName}StagingRepository", - registry - ) - findStagingRepository { - this.group = PublishingPlugin.PUBLISH_TASK_GROUP - this.description = "Finds the staging repository for ${repository.name}" - this.repository.convention(repository) - this.packageGroup.convention(extension.packageGroup) - this.descriptionRegex.convention(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" }) - } - val closeTask = rootProject.tasks.register( - "close${capitalizedName}StagingRepository" - ) { - this.group = PublishingPlugin.PUBLISH_TASK_GROUP - this.description = "Closes open staging repository in '${repository.name}' Nexus instance." - this.repository.convention(repository) - } - val releaseTask = rootProject.tasks.register( - "release${capitalizedName}StagingRepository" - ) { - this.group = PublishingPlugin.PUBLISH_TASK_GROUP - this.description = "Releases closed staging repository in '${repository.name}' Nexus instance." - this.repository.convention(repository) - } - val closeAndReleaseTask = rootProject.tasks.register( - "closeAndRelease${capitalizedName}StagingRepository" - ) { - this.group = PublishingPlugin.PUBLISH_TASK_GROUP - this.description = "Closes and releases open staging repository in '${repository.name}' Nexus instance." - } - - closeTask { - mustRunAfter(initializeTask) - mustRunAfter(findStagingRepository) - } - releaseTask { - mustRunAfter(initializeTask) - mustRunAfter(findStagingRepository) - mustRunAfter(closeTask) - } - closeAndReleaseTask { - dependsOn(closeTask, releaseTask) - } + username.convention(rootProject.provider { rootProject.findProperty("${name}Username") as? String }) + password.convention(rootProject.provider { rootProject.findProperty("${name}Password") as? String }) + publicationType.convention(PublicationType.MAVEN) + configureRepositoryTasks(rootProject.tasks, extension, this, registry) } extension.repositories.whenObjectRemoved { rootProject.tasks.named("initialize${capitalizedName}StagingRepository").configure { @@ -198,6 +132,79 @@ class NexusPublishPlugin : Plugin { } } + private fun configureRepositoryTasks( + tasks: TaskContainer, + extension: NexusPublishExtension, + repo: NexusRepository, + registry: Provider + ) { + @Suppress("UNUSED_VARIABLE") // Keep it consistent. + val retrieveStagingProfileTask = tasks.register( + "retrieve${repo.capitalizedName}StagingProfile" + ) { + group = PublishingPlugin.PUBLISH_TASK_GROUP + description = "Gets and displays a staging profile id for a given repository and package group. " + + "This is a diagnostic task to get the value and " + + "put it into the NexusRepository configuration closure as stagingProfileId." + repository.convention(repo) + packageGroup.convention(extension.packageGroup) + } + val initializeTask = tasks.register( + "initialize${repo.capitalizedName}StagingRepository", + registry + ) + initializeTask { + group = PublishingPlugin.PUBLISH_TASK_GROUP + description = "Initializes the staging repository in '${repo.name}' Nexus instance." + repository.convention(repo) + packageGroup.convention(extension.packageGroup) + } + val findStagingRepository = tasks.register( + "find${repo.capitalizedName}StagingRepository", + registry + ) + findStagingRepository { + group = PublishingPlugin.PUBLISH_TASK_GROUP + description = "Finds the staging repository for ${repo.name}" + repository.convention(repo) + packageGroup.convention(extension.packageGroup) + descriptionRegex.convention(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" }) + } + val closeTask = tasks.register( + "close${repo.capitalizedName}StagingRepository" + ) { + group = PublishingPlugin.PUBLISH_TASK_GROUP + description = "Closes open staging repository in '${repo.name}' Nexus instance." + repository.convention(repo) + } + val releaseTask = tasks.register( + "release${repo.capitalizedName}StagingRepository" + ) { + group = PublishingPlugin.PUBLISH_TASK_GROUP + description = "Releases closed staging repository in '${repo.name}' Nexus instance." + repository.convention(repo) + } + val closeAndReleaseTask = tasks.register( + "closeAndRelease${repo.capitalizedName}StagingRepository" + ) { + group = PublishingPlugin.PUBLISH_TASK_GROUP + description = "Closes and releases open staging repository in '${repo.name}' Nexus instance." + } + + closeTask { + mustRunAfter(initializeTask) + mustRunAfter(findStagingRepository) + } + releaseTask { + mustRunAfter(initializeTask) + mustRunAfter(findStagingRepository) + mustRunAfter(closeTask) + } + closeAndReleaseTask { + dependsOn(closeTask, releaseTask) + } + } + private fun configurePublishingForAllProjects(rootProject: Project, extension: NexusPublishExtension, registry: Provider) { rootProject.afterEvaluate { allprojects { From e964697bcaf1e996feea3fc319df06777445bba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Thu, 13 Jul 2023 09:44:00 +0100 Subject: [PATCH 16/17] Move to managed property --- .../publishplugin/FindStagingRepository.kt | 9 ++++----- .../InitializeNexusStagingRepository.kt | 10 +++++----- .../publishplugin/NexusPublishPlugin.kt | 16 +++++++--------- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt index d1ab29b2..2c6a6bbf 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/FindStagingRepository.kt @@ -21,17 +21,16 @@ import io.github.gradlenexus.publishplugin.internal.NexusClient import org.gradle.api.GradleException import org.gradle.api.Incubating import org.gradle.api.provider.Property -import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction -import javax.inject.Inject @Incubating -abstract class FindStagingRepository @Inject constructor( - private val registry: Provider -) : AbstractNexusStagingRepositoryTask() { +abstract class FindStagingRepository : AbstractNexusStagingRepositoryTask() { + + @get:Internal + abstract val registry: Property @get:Optional @get:Input diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt index e2d85d6e..0357e79c 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/InitializeNexusStagingRepository.kt @@ -21,15 +21,15 @@ import io.github.gradlenexus.publishplugin.internal.NexusClient import okhttp3.HttpUrl import org.gradle.api.GradleException import org.gradle.api.provider.Property -import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction -import javax.inject.Inject -abstract class InitializeNexusStagingRepository @Inject constructor( - private val registry: Provider -) : AbstractNexusStagingRepositoryTask() { +abstract class InitializeNexusStagingRepository : AbstractNexusStagingRepositoryTask() { + + @get:Internal + abstract val registry: Property @get:Optional @get:Input diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt index 24ae89e0..313b4d26 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/NexusPublishPlugin.kt @@ -136,7 +136,7 @@ class NexusPublishPlugin : Plugin { tasks: TaskContainer, extension: NexusPublishExtension, repo: NexusRepository, - registry: Provider + registryProvider: Provider ) { @Suppress("UNUSED_VARIABLE") // Keep it consistent. val retrieveStagingProfileTask = tasks.register( @@ -150,22 +150,20 @@ class NexusPublishPlugin : Plugin { packageGroup.convention(extension.packageGroup) } val initializeTask = tasks.register( - "initialize${repo.capitalizedName}StagingRepository", - registry - ) - initializeTask { + "initialize${repo.capitalizedName}StagingRepository" + ) { group = PublishingPlugin.PUBLISH_TASK_GROUP description = "Initializes the staging repository in '${repo.name}' Nexus instance." + registry.set(registryProvider) repository.convention(repo) packageGroup.convention(extension.packageGroup) } val findStagingRepository = tasks.register( - "find${repo.capitalizedName}StagingRepository", - registry - ) - findStagingRepository { + "find${repo.capitalizedName}StagingRepository" + ) { group = PublishingPlugin.PUBLISH_TASK_GROUP description = "Finds the staging repository for ${repo.name}" + registry.set(registryProvider) repository.convention(repo) packageGroup.convention(extension.packageGroup) descriptionRegex.convention(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" }) From c4ad618a300107e7a89686241eea7d892a18ae3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=B3bert=20Papp=20=28TWiStErRob=29?= Date: Thu, 13 Jul 2023 09:47:12 +0100 Subject: [PATCH 17/17] Unhide only hidden property in the project --- .../publishplugin/AbstractNexusStagingRepositoryTask.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt index e38b9283..769fdac8 100644 --- a/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt +++ b/src/main/kotlin/io/github/gradlenexus/publishplugin/AbstractNexusStagingRepositoryTask.kt @@ -39,7 +39,7 @@ abstract class AbstractNexusStagingRepositoryTask : DefaultTask() { abstract val repositoryDescription: Property @get:Internal - internal abstract val useStaging: Property + abstract val useStaging: Property init { this.onlyIf { useStaging.getOrElse(false) }