Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Partially refactor to use more idiomatic Gradle (part 2) #242

Merged
merged 18 commits into from
Jul 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,13 @@
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() {
abstract class AbstractNexusStagingRepositoryTask : DefaultTask() {

@get:Internal
abstract val clientTimeout: Property<Duration>
Expand All @@ -36,16 +32,14 @@ constructor(objects: ObjectFactory, repository: NexusRepository) : DefaultTask()
abstract val connectTimeout: Property<Duration>

// TODO: Expose externally as interface with getters only
@Nested
val repository = objects.property<NexusRepository>().apply {
set(repository)
}
@get:Nested
abstract val repository: Property<NexusRepository>

@get:Input
abstract val repositoryDescription: Property<String>

@get:Internal
internal abstract val useStaging: Property<Boolean>
abstract val useStaging: Property<Boolean>

init {
this.onlyIf { useStaging.getOrElse(false) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,38 +17,26 @@
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.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<InvalidatingStagingRepositoryDescriptorRegistry>
) : AbstractNexusStagingRepositoryTask(objects, repository) {
abstract class AbstractTransitionNexusStagingRepositoryTask : AbstractNexusStagingRepositoryTask() {

@Input
val stagingRepositoryId = objects.property<String>().apply {
set(
registry.map {
it[repository.name].stagingRepositoryId
}
)
}
@get:Input
abstract val stagingRepositoryId: Property<String>

@get:Internal
abstract val transitionCheckOptions: Property<TransitionCheckOptions>

fun transitionCheckOptions(action: Action<in TransitionCheckOptions>) = action.execute(transitionCheckOptions.get())
fun transitionCheckOptions(action: Action<in TransitionCheckOptions>) {
action.execute(transitionCheckOptions.get())
}

@TaskAction
fun transitionStagingRepo() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,13 @@

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<InvalidatingStagingRepositoryDescriptorRegistry>
) : AbstractTransitionNexusStagingRepositoryTask(objects, repository, registry) {
abstract class CloseNexusStagingRepository : AbstractTransitionNexusStagingRepositoryTask() {
TWiStErRob marked this conversation as resolved.
Show resolved Hide resolved

@Option(option = "staging-repository-id", description = "staging repository id to close")
fun setStagingRepositoryId(stagingRepositoryId: String) {
fun setStagingRepositoryIdToClose(stagingRepositoryId: String) {
TWiStErRob marked this conversation as resolved.
Show resolved Hide resolved
this.stagingRepositoryId.set(stagingRepositoryId)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,36 +20,27 @@ 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.Provider
import org.gradle.api.provider.Property
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<InvalidatingStagingRepositoryDescriptorRegistry>
) : AbstractNexusStagingRepositoryTask(objects, repository) {
abstract class FindStagingRepository : AbstractNexusStagingRepositoryTask() {

@Optional
@Input
val packageGroup = objects.property<String>().apply {
set(extension.packageGroup)
}
@get:Internal
abstract val registry: Property<InvalidatingStagingRepositoryDescriptorRegistry>

@Input
val descriptionRegex = objects.property<String>().apply {
set(extension.repositoryDescription.map { "\\b" + Regex.escape(it) + "(\\s|$)" })
}
@get:Optional
@get:Input
abstract val packageGroup: Property<String>

@get:Input
abstract val descriptionRegex: Property<String>

@Internal
val stagingRepositoryId = objects.property<String>()
@get:Internal
abstract val stagingRepositoryId: Property<String>

init {
outputs.cacheIf("the task requests data from the external repository, so we don't want to cache it") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,26 +20,20 @@ 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.Provider
import org.gradle.api.provider.Property
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

abstract class InitializeNexusStagingRepository @Inject constructor(
objects: ObjectFactory,
extension: NexusPublishExtension,
repository: NexusRepository,
private val registry: Provider<InvalidatingStagingRepositoryDescriptorRegistry>
) : AbstractNexusStagingRepositoryTask(objects, repository) {
abstract class InitializeNexusStagingRepository : AbstractNexusStagingRepositoryTask() {

@Optional
@Input
val packageGroup = objects.property<String>().apply {
set(extension.packageGroup)
}
@get:Internal
abstract val registry: Property<InvalidatingStagingRepositoryDescriptorRegistry>

@get:Optional
@get:Input
abstract val packageGroup: Property<String>

@TaskAction
fun createStagingRepo() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -38,28 +37,23 @@ abstract class NexusPublishExtension @Inject constructor(objects: ObjectFactory)

abstract val repositoryDescription: Property<String>

// staging repository initialization can take a few minutes on Sonatype Nexus
abstract val clientTimeout: Property<Duration>

abstract val connectTimeout: Property<Duration>

@get:Nested
abstract val transitionCheckOptions: TransitionCheckOptions

fun transitionCheckOptions(action: Action<in TransitionCheckOptions>) = action.execute(transitionCheckOptions)
fun transitionCheckOptions(action: Action<in TransitionCheckOptions>) {
action.execute(transitionCheckOptions)
}

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)
TWiStErRob marked this conversation as resolved.
Show resolved Hide resolved
)

fun repositories(action: Action<in NexusRepositoryContainer>) = action.execute(repositories)
fun repositories(action: Action<in NexusRepositoryContainer>) {
action.execute(repositories)
}
}
Loading