From f5be0d806d91077c23f5d53585d54c909935eb1f Mon Sep 17 00:00:00 2001 From: Matthew Haughton <3flex@users.noreply.github.com> Date: Sun, 18 Sep 2022 03:06:51 +1000 Subject: [PATCH] Introduce configFile property on DetektGenerateTask (#5308) --- .../detekt/GenerateConfigTaskSpec.kt | 24 +++++++++++++++ .../detekt/DetektGenerateConfigTask.kt | 29 +++++++++++-------- .../arturbosch/detekt/invoke/CliArgument.kt | 2 +- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/detekt-gradle-plugin/src/functionalTest/kotlin/io/gitlab/arturbosch/detekt/GenerateConfigTaskSpec.kt b/detekt-gradle-plugin/src/functionalTest/kotlin/io/gitlab/arturbosch/detekt/GenerateConfigTaskSpec.kt index da4b2835829..9dcf74c5697 100644 --- a/detekt-gradle-plugin/src/functionalTest/kotlin/io/gitlab/arturbosch/detekt/GenerateConfigTaskSpec.kt +++ b/detekt-gradle-plugin/src/functionalTest/kotlin/io/gitlab/arturbosch/detekt/GenerateConfigTaskSpec.kt @@ -36,4 +36,28 @@ class GenerateConfigTaskSpec { assertThat(projectFile("config/other/detekt.yml")).exists() } } + + @Test + fun `setting configFile property overrides extension & task configs`() { + val builder = DslTestBuilder.kotlin() + val gradleRunner = builder.withDetektConfig( + @Suppress("TrimMultilineRawString") + """ + |detekt { + | config = files("config/wrongpath1/detekt.yml", "config/wrongpath2/detekt.yml") + |} + | + |tasks.detektGenerateConfig { + | config.setFrom("config/wrongpath3/detekt.yml") + | configFile.set(file("config/correctpath/detekt.yml")) + |} + """ + ).withConfigFile("config/detekt/detekt.yml").build() + gradleRunner.writeProjectFile("config/other/detekt.yml", content = "") + + gradleRunner.runTasksAndCheckResult("detektGenerateConfig") { result -> + assertThat(result.task(":detektGenerateConfig")?.outcome).isIn(TaskOutcome.SUCCESS, TaskOutcome.FROM_CACHE) + assertThat(projectFile("config/correctpath/detekt.yml")).exists() + } + } } 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 f220abba3ea..cfcf4867252 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,23 +8,25 @@ 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.file.RegularFileProperty +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 import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.Optional -import org.gradle.api.tasks.PathSensitive -import org.gradle.api.tasks.PathSensitivity +import org.gradle.api.tasks.OutputFile 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 : DefaultTask() { +abstract class DetektGenerateConfigTask @Inject constructor( + objects: ObjectFactory +) : DefaultTask() { init { description = "Generate a detekt configuration file inside your project." @@ -37,13 +39,16 @@ abstract class DetektGenerateConfigTask : DefaultTask() { @get:Classpath abstract val pluginClasspath: ConfigurableFileCollection - @get:InputFiles - @get:Optional - @get:PathSensitive(PathSensitivity.RELATIVE) + @get:OutputFile + val configFile: RegularFileProperty = objects.fileProperty().convention { configurationToUse } + + @get:Internal + @get:Deprecated("Replaced with configFile property") abstract val config: ConfigurableFileCollection private val defaultConfigPath = project.rootDir.toPath().resolve(CONFIG_DIR_NAME).resolve(CONFIG_FILE) + @Suppress("DEPRECATION") private val configurationToUse: File get() = if (config.isEmpty) { defaultConfigPath.toFile() @@ -55,18 +60,18 @@ abstract class DetektGenerateConfigTask : DefaultTask() { internal val arguments: Provider> = project.provider { listOf( GenerateConfigArgument, - ConfigArgument(configurationToUse) + ConfigArgument(configFile.get()) ).flatMap(CliArgument::toArgument) } @TaskAction fun generateConfig() { - if (configurationToUse.exists()) { - logger.warn("Skipping config file generation; file already exists at $configurationToUse") + if (configFile.get().asFile.exists()) { + logger.warn("Skipping config file generation; file already exists at ${configFile.get().asFile}") return } - Files.createDirectories(configurationToUse.parentFile.toPath()) + Files.createDirectories(configFile.get().asFile.parentFile.toPath()) DetektInvoker.create(task = this).invokeCli( arguments = arguments.get(), diff --git a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/invoke/CliArgument.kt b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/invoke/CliArgument.kt index 3ccc8a53db1..c2004b984b4 100644 --- a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/invoke/CliArgument.kt +++ b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/invoke/CliArgument.kt @@ -82,7 +82,7 @@ internal data class BasePathArgument(val basePath: String?) : CliArgument() { internal data class ConfigArgument(val files: Collection) : CliArgument() { - constructor(configFile: File) : this(listOf(configFile)) + constructor(configFile: RegularFile) : this(listOf(configFile.asFile)) constructor(config: FileCollection) : this(config.files) override fun toArgument() = if (files.isEmpty()) {