Skip to content

Commit

Permalink
Merge pull request #242 from TWiStErRob/idg
Browse files Browse the repository at this point in the history
Partially refactor to use more idiomatic Gradle (part 2)
  • Loading branch information
szpak authored Jul 14, 2023
2 parents 65863e1 + 7885598 commit 66f3284
Show file tree
Hide file tree
Showing 14 changed files with 161 additions and 196 deletions.
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() {

@Option(option = "staging-repository-id", description = "staging repository id to close")
fun setStagingRepositoryId(stagingRepositoryId: String) {
fun setStagingRepositoryIdToClose(stagingRepositoryId: String) {
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)
)

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

0 comments on commit 66f3284

Please sign in to comment.