Skip to content

Commit

Permalink
Fix errors with detektGenerateConfig (#5199)
Browse files Browse the repository at this point in the history
* Don't use a collection

* Don't use objects

* Always execute DetektGenerateConfigTask in serial
  • Loading branch information
BraisGabin committed Aug 8, 2022
1 parent 4e85866 commit 5f3ad3e
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 12 deletions.
Expand Up @@ -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
Expand All @@ -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."
Expand All @@ -45,34 +44,37 @@ 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<List<String>> = 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(),
classpath = detektClasspath.plus(pluginClasspath),
taskName = name,
)
}

@Suppress("UnnecessaryAbstractClass")
abstract class SingleExecutionBuildService : BuildService<BuildServiceParameters.None>
}
Expand Up @@ -60,8 +60,16 @@ class DetektPlugin : Plugin<Project> {
}

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)
}
}

Expand Down

0 comments on commit 5f3ad3e

Please sign in to comment.