From 0cd6d17b1d1af0a4b60d601dffee95b03cfbbb32 Mon Sep 17 00:00:00 2001 From: Peter Trifanov Date: Thu, 7 Jul 2022 22:16:15 +0300 Subject: [PATCH 1/2] gradle-plugin: Set `user.home` property if SARIF reporter is active (#1426) ### What's done: * Updated logic * Improved logging * Added tests Closes #1269 --- .../plugin/gradle/DiktatJavaExecTaskBase.kt | 28 +++++++++++++------ .../plugin/gradle/DiktatJavaExecTaskTest.kt | 21 ++++++++++++++ 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt index 95e7df7d2f..35b9cc5ca0 100644 --- a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt +++ b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskBase.kt @@ -170,22 +170,32 @@ open class DiktatJavaExecTaskBase @Inject constructor( return flag.toString() } - @Suppress("SAY_NO_TO_VAR") private fun setReporter(diktatExtension: DiktatExtension, flag: java.lang.StringBuilder) { val name = diktatExtension.reporter.trim() val validReporters = listOf("sarif", "plain", "json", "html") - var reporterFlag = if (name.isEmpty() || !validReporters.contains(name)) { - project.logger.warn("Reporter name $name was not specified or is invalid. Falling to 'plain' reporter") - "--reporter=plain" - } else { - "--reporter=$name" + val reporterFlag = when { + diktatExtension.githubActions -> { + if (diktatExtension.reporter.isNotEmpty()) { + // githubActions should have higher priority than custom input + project.logger.warn("`diktat.githubActions` is set to true, so custom reporter [$name] will be ignored and SARIF reporter will be used") + } + "--reporter=sarif" + } + name.isEmpty() -> { + project.logger.info("Reporter name was not set. Using 'plain' reporter") + "--reporter=plain" + } + name !in validReporters -> { + project.logger.warn("Reporter name is invalid (provided value: [$name]). Falling back to 'plain' reporter") + "--reporter=plain" + } + else -> "--reporter=$name" } - // githubActions should have higher priority than a custom input - if (diktatExtension.githubActions) { + val isSarifReporterActive = reporterFlag.contains("sarif") + if (isSarifReporterActive) { // need to set user.home specially for ktlint, so it will be able to put a relative path URI in SARIF systemProperty("user.home", project.rootDir.toString()) - reporterFlag = "--reporter=sarif" } flag.append(reporterFlag) diff --git a/diktat-gradle-plugin/src/test/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskTest.kt b/diktat-gradle-plugin/src/test/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskTest.kt index f9b6ab1d00..07af3cd3b9 100644 --- a/diktat-gradle-plugin/src/test/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskTest.kt +++ b/diktat-gradle-plugin/src/test/kotlin/org/cqfn/diktat/plugin/gradle/DiktatJavaExecTaskTest.kt @@ -121,6 +121,11 @@ class DiktatJavaExecTaskTest { diktatConfigFile = project.file("../diktat-analysis.yml") githubActions = true } + val task = project.tasks.getByName(DIKTAT_CHECK_TASK) as DiktatJavaExecTaskBase + Assertions.assertEquals( + project.rootDir.toString(), + task.systemProperties["user.home"] + ) } @Test @@ -137,6 +142,22 @@ class DiktatJavaExecTaskTest { } } + @Test + fun `should set system property with SARIF reporter`() { + assertCommandLineEquals( + listOf(null, "--reporter=sarif") + ) { + inputs { exclude("*") } + diktatConfigFile = project.file("../diktat-analysis.yml") + reporter = "sarif" + } + val task = project.tasks.getByName(DIKTAT_CHECK_TASK) as DiktatJavaExecTaskBase + Assertions.assertEquals( + project.rootDir.toString(), + task.systemProperties["user.home"] + ) + } + @Test fun `check system property with multiproject build with default config`() { setupMultiProject() From 739bd3a9e327fca02646e7cc92f51a5ddbd3d411 Mon Sep 17 00:00:00 2001 From: Peter Trifanov Date: Fri, 8 Jul 2022 11:14:01 +0300 Subject: [PATCH 2/2] gradle-plugin: fix docs and tests for Groovy DSL (#1428) ### What's done: * Update build.gradle in examples * Add functional test for Groovy DSL with explicit inputs * Fix docs for `diktatExtension.output`: reporter treats any non-empty string as a file name, there are no special values * Remove `dependsOn` relation between `test` and `functionalTest`, use `shouldRunAfter` instead This pull request closes #1422 --- diktat-gradle-plugin/build.gradle.kts | 9 +++---- .../DiktatGradlePluginGroovyFunctionalTest.kt | 24 ++++++++++++++----- .../org/cqfn/diktat/plugin/gradle/Utils.kt | 12 ++++++++++ .../diktat/plugin/gradle/DiktatExtension.kt | 3 +-- examples/gradle-groovy-dsl/build.gradle | 3 ++- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/diktat-gradle-plugin/build.gradle.kts b/diktat-gradle-plugin/build.gradle.kts index 3a1b0f0423..95c506dbe5 100644 --- a/diktat-gradle-plugin/build.gradle.kts +++ b/diktat-gradle-plugin/build.gradle.kts @@ -27,8 +27,9 @@ repositories { } // default value is needed for correct gradle loading in IDEA; actual value from maven is used during build -val ktlintVersion = project.properties.getOrDefault("ktlintVersion", "0.43.0") as String -val diktatVersion = project.version.takeIf { it.toString() != Project.DEFAULT_VERSION } ?: "1.1.0" +// To debug gradle plugin, please set `diktatVersion` manually to the current maven project version. +val ktlintVersion = project.properties.getOrDefault("ktlintVersion", "0.46.1") as String +val diktatVersion = project.version.takeIf { it.toString() != Project.DEFAULT_VERSION } ?: "1.2.1" val junitVersion = project.properties.getOrDefault("junitVersion", "5.8.1") as String val jacocoVersion = project.properties.getOrDefault("jacocoVersion", "0.8.7") as String dependencies { @@ -107,7 +108,7 @@ val functionalTest = sourceSets.create("functionalTest") { runtimeClasspath += output + compileClasspath } tasks.getByName("functionalTest") { - dependsOn("test") + shouldRunAfter("test") testClassesDirs = functionalTest.output.classesDirs classpath = functionalTest.runtimeClasspath maxParallelForks = Runtime.getRuntime().availableProcessors() @@ -131,7 +132,7 @@ jacocoTestKit { applyTo("functionalTestRuntimeOnly", tasks.named("functionalTest")) } tasks.jacocoTestReport { - dependsOn(tasks.withType()) + shouldRunAfter(tasks.withType()) executionData( fileTree("$buildDir/jacoco").apply { include("*.exec") diff --git a/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/DiktatGradlePluginGroovyFunctionalTest.kt b/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/DiktatGradlePluginGroovyFunctionalTest.kt index 27200776e0..d883729d26 100644 --- a/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/DiktatGradlePluginGroovyFunctionalTest.kt +++ b/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/DiktatGradlePluginGroovyFunctionalTest.kt @@ -27,14 +27,26 @@ class DiktatGradlePluginGroovyFunctionalTest { } @Test - fun `should execute diktatCheck on default values`() { + fun `should execute diktatCheck with default values`() { val result = runDiktat(testProjectDir, shouldSucceed = false) - val diktatCheckBuildResult = result.task(":${DiktatGradlePlugin.DIKTAT_CHECK_TASK}") - requireNotNull(diktatCheckBuildResult) - Assertions.assertEquals(TaskOutcome.FAILED, diktatCheckBuildResult.outcome) - Assertions.assertTrue( - result.output.contains("[FILE_NAME_MATCH_CLASS]") + assertDiktatExecuted(result) + } + + @Test + fun `should execute diktatCheck with explicit configuration`() { + buildFile.appendText( + """${System.lineSeparator()} + diktat { + inputs { it.include("src/**/*.kt") } + reporter = "plain" + diktatConfigFile = file(rootDir.path + "/diktat-analysis.yml") + } + """.trimIndent() ) + + val result = runDiktat(testProjectDir, shouldSucceed = false) + + assertDiktatExecuted(result) } } diff --git a/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/Utils.kt b/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/Utils.kt index 246c54f705..4a0d552e28 100644 --- a/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/Utils.kt +++ b/diktat-gradle-plugin/src/functionalTest/kotlin/org/cqfn/diktat/plugin/gradle/Utils.kt @@ -2,7 +2,10 @@ package org.cqfn.diktat.plugin.gradle import org.gradle.buildinit.plugins.internal.modifiers.BuildInitDsl import org.gradle.internal.impldep.org.junit.rules.TemporaryFolder +import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.TaskOutcome +import org.junit.jupiter.api.Assertions import java.io.File import java.util.concurrent.atomic.AtomicInteger @@ -71,3 +74,12 @@ private fun GradleRunner.withJaCoCo(number: Int) = apply { } } } + +fun assertDiktatExecuted(result: BuildResult) { + val diktatCheckBuildResult = result.task(":${DiktatGradlePlugin.DIKTAT_CHECK_TASK}") + requireNotNull(diktatCheckBuildResult) + Assertions.assertEquals(TaskOutcome.FAILED, diktatCheckBuildResult.outcome) + Assertions.assertTrue( + result.output.contains("[FILE_NAME_MATCH_CLASS]") + ) +} diff --git a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatExtension.kt b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatExtension.kt index 48595df852..f2d4c5e1c9 100644 --- a/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatExtension.kt +++ b/diktat-gradle-plugin/src/main/kotlin/org/cqfn/diktat/plugin/gradle/DiktatExtension.kt @@ -34,8 +34,7 @@ open class DiktatExtension( var reporter: String = "plain" /** - * Type of output - * Default: System.out + * Destination for reporter. If empty, will write to stdout. */ var output: String = "" diff --git a/examples/gradle-groovy-dsl/build.gradle b/examples/gradle-groovy-dsl/build.gradle index b471212824..034bb0c144 100644 --- a/examples/gradle-groovy-dsl/build.gradle +++ b/examples/gradle-groovy-dsl/build.gradle @@ -7,5 +7,6 @@ repositories { } diktat { - inputs { include ("src/**/*.kt") } + inputs { it.include ("src/**/*.kt") } + diktatConfigFile = file(rootDir.path + "/diktat-analysis.yml") }