Skip to content

Commit

Permalink
SourceTask in Gradle plugin
Browse files Browse the repository at this point in the history
### What's done:
- migrated to SourceTask
- removed inputs

It closes #1026
  • Loading branch information
nulls committed Nov 14, 2023
1 parent 7b7d2b6 commit dc47027
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 59 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand All @@ -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(),
Expand All @@ -106,6 +70,9 @@ abstract class DiktatTaskBase(

init {
ignoreFailures = extension.ignoreFailures
if (patternSet.includes.isEmpty() && patternSet.excludes.isEmpty()) {
patternSet.include("src/**/*.kt")
}
}

/**
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
}

0 comments on commit dc47027

Please sign in to comment.