From dc47027a5b601f9c0b8f3ce9b890eaab39438806 Mon Sep 17 00:00:00 2001 From: Nariman Abdullin Date: Tue, 14 Nov 2023 14:01:20 +0300 Subject: [PATCH] SourceTask in Gradle plugin ### What's done: - migrated to SourceTask - removed inputs It closes #1026 --- .../plugin/gradle/DiktatJavaExecTaskBase.kt | 9 ---- .../plugin/gradle/tasks/DiktatCheckTask.kt | 3 +- .../plugin/gradle/tasks/DiktatFixTask.kt | 3 +- .../plugin/gradle/tasks/DiktatTaskBase.kt | 51 +++---------------- .../gradle/tasks/SarifReportMergeTask.kt | 4 +- 5 files changed, 11 insertions(+), 59 deletions(-) delete mode 100644 diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt diff --git a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt b/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt deleted file mode 100644 index 25d1093126..0000000000 --- a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.saveourtool.diktat.plugin.gradle - -import org.gradle.api.Task - -/** - * An interface with old name for base class for backward compatibility in plugin configuration - */ -@Deprecated("will be removed in 2.x") -interface DiktatJavaExecTaskBase : Task diff --git a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatCheckTask.kt b/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatCheckTask.kt index 6f656825a8..b3d04b4496 100644 --- a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatCheckTask.kt +++ b/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatCheckTask.kt @@ -15,8 +15,7 @@ import javax.inject.Inject */ abstract class DiktatCheckTask @Inject constructor( extension: DiktatExtension, - inputs: PatternFilterable -) : DiktatTaskBase(extension, inputs) { +) : DiktatTaskBase(extension) { override fun doRun( runner: DiktatRunner, args: DiktatRunnerArguments diff --git a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatFixTask.kt b/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatFixTask.kt index 0e7fdc4e4e..3498494bab 100644 --- a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatFixTask.kt +++ b/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatFixTask.kt @@ -15,8 +15,7 @@ import javax.inject.Inject */ abstract class DiktatFixTask @Inject constructor( extension: DiktatExtension, - inputs: PatternFilterable -) : DiktatTaskBase(extension, inputs) { +) : DiktatTaskBase(extension) { override fun doRun( runner: DiktatRunner, args: DiktatRunnerArguments diff --git a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatTaskBase.kt b/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatTaskBase.kt index dd2e7d9e74..87c5e88ccf 100644 --- a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatTaskBase.kt +++ b/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/DiktatTaskBase.kt @@ -15,58 +15,22 @@ import com.saveourtool.diktat.ruleset.rules.DiktatRuleSetFactoryImpl import generated.DIKTAT_VERSION import generated.KTLINT_VERSION -import org.gradle.api.DefaultTask import org.gradle.api.GradleException -import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.IgnoreEmptyDirectories -import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.PathSensitive -import org.gradle.api.tasks.PathSensitivity -import org.gradle.api.tasks.SkipWhenEmpty +import org.gradle.api.tasks.SourceTask import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.VerificationTask -import org.gradle.api.tasks.util.PatternFilterable import java.nio.file.Path /** * A base task to run `diktat` * - * @param inputs * @property extension */ -@Suppress("WRONG_NEWLINES", "Deprecation") abstract class DiktatTaskBase( @get:Internal internal val extension: DiktatExtension, - private val inputs: PatternFilterable -) : DefaultTask(), VerificationTask, com.saveourtool.diktat.plugin.gradle.DiktatJavaExecTaskBase { - /** - * Files that will be analyzed by diktat - */ - @get:IgnoreEmptyDirectories - @get:SkipWhenEmpty - @get:PathSensitive(PathSensitivity.RELATIVE) - @get:InputFiles - val actualInputs: FileCollection by lazy { - if (inputs.includes.isEmpty() && inputs.excludes.isEmpty()) { - inputs.include("src/**/*.kt") - } - project.objects.fileCollection().from( - project.fileTree("${project.projectDir}").apply { - exclude("${project.buildDir}") - } - .matching(inputs) - ) - } - - /** - * Whether diktat should be executed - */ - @get:Internal - internal val shouldRun: Boolean by lazy { - !actualInputs.isEmpty - } +) : SourceTask(), VerificationTask { private val diktatRunnerFactory by lazy { DiktatRunnerFactory( diktatRuleConfigReader = DiktatRuleConfigReaderImpl(), @@ -80,7 +44,7 @@ abstract class DiktatTaskBase( DiktatRunnerArguments( configFile = extension.diktatConfigFile.toPath(), sourceRootDir = project.projectDir.toPath(), - files = actualInputs.files.map { it.toPath() }, + files = source.files.map { it.toPath() }, baselineFile = extension.baseline?.let { project.file(it).toPath() }, reporterType = project.getReporterType(extension), reporterOutput = project.getOutputFile(extension)?.outputStream(), @@ -106,6 +70,9 @@ abstract class DiktatTaskBase( init { ignoreFailures = extension.ignoreFailures + if (patternSet.includes.isEmpty() && patternSet.excludes.isEmpty()) { + patternSet.include("src/**/*.kt") + } } /** @@ -118,11 +85,7 @@ abstract class DiktatTaskBase( if (extension.debug) { project.logger.lifecycle("Running diktat $DIKTAT_VERSION with ktlint $KTLINT_VERSION") } - if (!shouldRun) { - /* - If ktlint receives empty patterns, it implicitly uses **/*.kt, **/*.kts instead. - This can lead to diktat analyzing gradle buildscripts and so on. We want to prevent it. - */ + if (source.isEmpty) { project.logger.warn("Inputs for $name do not exist, will not run diktat") project.logger.info("Skipping diktat execution") } else { diff --git a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/SarifReportMergeTask.kt b/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/SarifReportMergeTask.kt index 7991df9f01..c108fb395d 100644 --- a/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/SarifReportMergeTask.kt +++ b/diktat-gradle-plugin/src/main/kotlin/com/saveourtool/diktat/plugin/gradle/tasks/SarifReportMergeTask.kt @@ -96,7 +96,7 @@ internal fun Project.configureMergeReportsTask(diktatExtension: DiktatExtension) reportMergeTask.shouldRunAfter(tasks.withType(DiktatTaskBase::class.java)) } } - tasks.withType(DiktatTaskBase::class.java).configureEach { diktatJavaExecTaskBase -> - diktatJavaExecTaskBase.finalizedBy(rootProject.tasks.withType(SarifReportMergeTask::class.java)) + tasks.withType(DiktatTaskBase::class.java).configureEach { diktatTaskBase -> + diktatTaskBase.finalizedBy(rootProject.tasks.withType(SarifReportMergeTask::class.java)) } }