From 5f3ad3e54388b180fc8f16be133b561c844f37b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brais=20Gab=C3=ADn?= Date: Mon, 8 Aug 2022 10:24:07 +0200 Subject: [PATCH] Fix errors with `detektGenerateConfig` (#5199) * Don't use a collection * Don't use objects * Always execute DetektGenerateConfigTask in serial --- .../detekt/DetektGenerateConfigTask.kt | 26 ++++++++++--------- .../gitlab/arturbosch/detekt/DetektPlugin.kt | 8 ++++++ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektGenerateConfigTask.kt b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektGenerateConfigTask.kt index 3bc6edc1e5f..f220abba3ea 100644 --- a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektGenerateConfigTask.kt +++ b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektGenerateConfigTask.kt @@ -8,8 +8,9 @@ import io.gitlab.arturbosch.detekt.invoke.DetektInvoker import io.gitlab.arturbosch.detekt.invoke.GenerateConfigArgument import org.gradle.api.DefaultTask import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Provider +import org.gradle.api.services.BuildService +import org.gradle.api.services.BuildServiceParameters import org.gradle.api.tasks.CacheableTask import org.gradle.api.tasks.Classpath import org.gradle.api.tasks.InputFiles @@ -19,13 +20,11 @@ import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.TaskAction import org.gradle.language.base.plugins.LifecycleBasePlugin +import java.io.File import java.nio.file.Files -import javax.inject.Inject @CacheableTask -abstract class DetektGenerateConfigTask @Inject constructor( - private val objects: ObjectFactory -) : DefaultTask() { +abstract class DetektGenerateConfigTask : DefaultTask() { init { description = "Generate a detekt configuration file inside your project." @@ -45,29 +44,29 @@ abstract class DetektGenerateConfigTask @Inject constructor( private val defaultConfigPath = project.rootDir.toPath().resolve(CONFIG_DIR_NAME).resolve(CONFIG_FILE) - private val configurationToUse: ConfigurableFileCollection + private val configurationToUse: File get() = if (config.isEmpty) { - objects.fileCollection().from(defaultConfigPath) + defaultConfigPath.toFile() } else { - config + config.last() } @get:Internal internal val arguments: Provider> = project.provider { listOf( GenerateConfigArgument, - ConfigArgument(configurationToUse.last()) + ConfigArgument(configurationToUse) ).flatMap(CliArgument::toArgument) } @TaskAction fun generateConfig() { - if (configurationToUse.last().exists()) { - logger.warn("Skipping config file generation; file already exists at ${configurationToUse.last()}") + if (configurationToUse.exists()) { + logger.warn("Skipping config file generation; file already exists at $configurationToUse") return } - Files.createDirectories(configurationToUse.last().parentFile.toPath()) + Files.createDirectories(configurationToUse.parentFile.toPath()) DetektInvoker.create(task = this).invokeCli( arguments = arguments.get(), @@ -75,4 +74,7 @@ abstract class DetektGenerateConfigTask @Inject constructor( taskName = name, ) } + + @Suppress("UnnecessaryAbstractClass") + abstract class SingleExecutionBuildService : BuildService } diff --git a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektPlugin.kt b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektPlugin.kt index 38f02436b12..43760179081 100644 --- a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektPlugin.kt +++ b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektPlugin.kt @@ -60,8 +60,16 @@ class DetektPlugin : Plugin { } private fun Project.registerGenerateConfigTask(extension: DetektExtension) { + val detektGenerateConfigSingleExecution = project.gradle.sharedServices.registerIfAbsent( + "DetektGenerateConfigSingleExecution", + DetektGenerateConfigTask.SingleExecutionBuildService::class.java + ) { spec -> + spec.maxParallelUsages.set(1) + } + tasks.register(GENERATE_CONFIG, DetektGenerateConfigTask::class.java) { it.config.setFrom(project.provider { extension.config }) + it.usesService(detektGenerateConfigSingleExecution) } }