Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Restructure build to add flexibility for detekt-gradle-plugin #6415

Draft
wants to merge 16 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
45 changes: 45 additions & 0 deletions build-logic-internal-gradle-detekt-plugin/build.gradle.kts
@@ -0,0 +1,45 @@
plugins {
alias(libs.plugins.kotlin)
`java-gradle-plugin`
}

repositories {
mavenCentral()
google()
}

version = "1"

sourceSets.main {
java.setSrcDirs(listOf(layout.projectDirectory.dir("../detekt-gradle-plugin/src/main/kotlin")))
}

dependencies {
compileOnly(libs.android.gradle.minSupported)
compileOnly(libs.kotlin.gradle)
compileOnly(libs.kotlin.gradlePluginApi)
compileOnly("io.gitlab.arturbosch.detekt:detekt-cli:1.23.1")
}

gradlePlugin {
plugins {
create("detektPlugin") {
id = "detekt-internal"
implementationClass = "io.gitlab.arturbosch.detekt.DetektPlugin"
}
}
}

tasks {
val writeDetektVersionProperties by registering(WriteProperties::class) {
description = "Write the properties file with the detekt version to be used by the plugin."
encoding = "UTF-8"
destinationFile = layout.buildDirectory.file("detekt-versions.properties")
property("detektVersion", project.version)
property("detektCompilerPluginVersion", project.version)
}

processResources {
from(writeDetektVersionProperties)
}
}
@@ -1,2 +1 @@
kotlin.stdlib.default.dependency=false
org.gradle.kotlin.dsl.allWarningsAsErrors=true
9 changes: 9 additions & 0 deletions build-logic-internal-gradle-detekt-plugin/settings.gradle.kts
@@ -0,0 +1,9 @@
rootProject.name = "build-logic-internal-gradle-detekt-plugin"

dependencyResolutionManagement {
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
}
15 changes: 15 additions & 0 deletions build-logic/src/main/kotlin/module.gradle.kts
Expand Up @@ -6,6 +6,7 @@ plugins {
kotlin("jvm")
`maven-publish`
jacoco
`ivy-publish`
}

// Add attributes to JAR manifest, to be used at runtime
Expand Down Expand Up @@ -70,3 +71,17 @@ java {
useCompileClasspathVersions()
}
}

publishing {
repositories {
ivy {
name = "gradlePluginFunctionalTest"
url = uri(rootProject.layout.projectDirectory.dir("detekt-gradle-plugin/build/repo"))
}
}
publications {
create<IvyPublication>("ivy") {
from(components["java"])
}
}
}
3 changes: 0 additions & 3 deletions build-logic/src/main/kotlin/releasing.gradle.kts
Expand Up @@ -104,7 +104,6 @@ tasks.register("publishToMavenLocal") {
dependsOn(tasks.named("publishToMavenLocal"))
}
}
dependsOn(gradle.includedBuild("detekt-gradle-plugin").task(":publishToMavenLocal"))
}

tasks.register("publishAllToSonatypeSnapshot") {
Expand All @@ -114,7 +113,6 @@ tasks.register("publishAllToSonatypeSnapshot") {
dependsOn(tasks.named("publishAllPublicationsToSonatypeSnapshotRepository"))
}
}
dependsOn(gradle.includedBuild("detekt-gradle-plugin").task(":publishAllPublicationsToSonatypeSnapshotRepository"))
}

tasks.register("publishAllToMavenCentral") {
Expand All @@ -124,5 +122,4 @@ tasks.register("publishAllToMavenCentral") {
dependsOn(tasks.named("publishAllPublicationsToMavenCentralRepository"))
}
}
dependsOn(gradle.includedBuild("detekt-gradle-plugin").task(":publishAllPublicationsToMavenCentralRepository"))
}
16 changes: 2 additions & 14 deletions build.gradle.kts
Expand Up @@ -5,7 +5,7 @@ import io.gitlab.arturbosch.detekt.report.ReportMergeTask

plugins {
id("releasing")
id("io.gitlab.arturbosch.detekt")
id("detekt-internal")
alias(libs.plugins.gradleVersions)
}

Expand All @@ -17,7 +17,7 @@ allprojects {
group = "io.gitlab.arturbosch.detekt"
version = Versions.currentOrSnapshot()

apply(plugin = "io.gitlab.arturbosch.detekt")
apply(plugin = "detekt-internal")

detekt {
source.setFrom(
Expand Down Expand Up @@ -71,15 +71,3 @@ subprojects {
}
}
}

setOf(
"build",
"detektMain",
"detektTest",
"detektFunctionalTest",
"detektTestFixtures",
).forEach { taskName ->
tasks.register(taskName) {
dependsOn(gradle.includedBuild("detekt-gradle-plugin").task(":$taskName"))
}
}
Expand Up @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
import java.nio.file.FileSystems
import java.nio.file.Path
import kotlin.io.path.Path
import kotlin.io.path.relativeTo

class DetektAnalysisExtension(
private val log: MessageCollector,
Expand All @@ -32,7 +33,7 @@ class DetektAnalysisExtension(
}
val matchers = excludes.map { FileSystems.getDefault().getPathMatcher("glob:$it") }
val (includedFiles, excludedFiles) = files.partition { file ->
matchers.none { it.matches(rootPath.relativize(Path(file.virtualFilePath))) }
matchers.none { it.matches(Path(file.virtualFilePath).relativeTo(rootPath)) }
}
log.info("Running detekt on module '${module.name.asString()}'")
excludedFiles.forEach { log.info("File excluded by filter: ${it.virtualFilePath}") }
Expand Down
44 changes: 38 additions & 6 deletions detekt-gradle-plugin/build.gradle.kts
Expand Up @@ -11,8 +11,7 @@ plugins {
`java-test-fixtures`
idea
alias(libs.plugins.pluginPublishing)
// We use this published version of the detekt plugin to self analyse this project.
id("io.gitlab.arturbosch.detekt") version "1.23.1"
id("detekt-internal")
}

repositories {
Expand Down Expand Up @@ -45,7 +44,7 @@ testing {
dependencies {
compileOnly("org.jetbrains:annotations:24.0.1")
implementation(libs.assertj)
implementation(testFixtures(project(":")))
implementation(testFixtures(project()))
}

targets {
Expand All @@ -55,6 +54,40 @@ testing {
val isAndroidSdkInstalled = providers.environmentVariable("ANDROID_SDK_ROOT").isPresent ||
providers.environmentVariable("ANDROID_HOME").isPresent
inputs.property("isAndroidSdkInstalled", isAndroidSdkInstalled).optional(true)

// Manually add all project runtime dependencies. This repo is referenced from functional tests.
setOf(
"detekt-api",
"detekt-core",
"detekt-cli",
"detekt-metrics",
"detekt-parser",
"detekt-psi-utils",
"detekt-report-html",
"detekt-report-md",
"detekt-report-sarif",
"detekt-report-txt",
"detekt-report-xml",
"detekt-rules",
"detekt-rules-complexity",
"detekt-rules-coroutines",
"detekt-rules-documentation",
"detekt-rules-empty",
"detekt-rules-errorprone",
"detekt-rules-exceptions",
"detekt-rules-naming",
"detekt-rules-performance",
"detekt-rules-style",
"detekt-tooling",
"detekt-utils",
).forEach { projectName ->
dependsOn(":$projectName:publishIvyPublicationToGradlePluginFunctionalTestRepository")
}

environment(
"DGP_PROJECT_DEPS_REPO_PATH",
layout.buildDirectory.dir("repo").get().asFile.invariantSeparatorsPath
)
}
}
}
Expand All @@ -70,13 +103,12 @@ dependencies {
compileOnly(libs.kotlin.gradle)
compileOnly(libs.kotlin.gradlePluginApi)
testFixturesCompileOnly("org.jetbrains:annotations:24.0.1")
compileOnly("io.gitlab.arturbosch.detekt:detekt-cli:1.23.1")
compileOnly(projects.detektCli)

testKitRuntimeOnly(libs.kotlin.gradle)
testKitJava17RuntimeOnly(libs.android.gradle.maxSupported)

// We use this published version of the detekt-formatting to self analyse this project.
detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.1")
detektPlugins(projects.detektFormatting)
}

gradlePlugin {
Expand Down
10 changes: 10 additions & 0 deletions detekt-gradle-plugin/config/gradle-plugin-detekt.yml
Expand Up @@ -2,6 +2,16 @@ complexity:
TooManyFunctions:
excludes: ["**/test/**", "**/functionalTest/**"]

libraries:
ForbiddenPublicDataClass:
active: false
LibraryEntitiesShouldNotBePublic:
active: false
LibraryCodeMustSpecifyReturnType:
active: true
excludes: ['**/*.kt']
includes: ['**/detekt-api/src/main/**/api/*.kt']

naming:
ClassNaming:
ignoreAnnotated: ['org.junit.jupiter.api.Nested']
Expand Down
17 changes: 0 additions & 17 deletions detekt-gradle-plugin/settings.gradle.kts

This file was deleted.

Expand Up @@ -739,7 +739,16 @@ private fun createGradleRunnerAndSetupProject(
repositories {
mavenCentral()
google()
mavenLocal()
exclusiveContent {
forRepository {
ivy {
url = uri("${System.getenv("DGP_PROJECT_DEPS_REPO_PATH")}")
}
}
filter {
includeGroup("io.gitlab.arturbosch.detekt")
}
}
}
}
""".trimIndent(),
Expand Down
Expand Up @@ -350,7 +350,16 @@ private fun setupProject(projectLayoutAction: ProjectLayout.() -> Unit): DslGrad
repositories {
mavenCentral()
google()
mavenLocal()
exclusiveContent {
forRepository {
ivy {
url = uri("${System.getenv("DGP_PROJECT_DEPS_REPO_PATH")}")
}
}
filter {
includeGroup("io.gitlab.arturbosch.detekt")
}
}
}
}
""".trimIndent(),
Expand Down
Expand Up @@ -55,13 +55,13 @@ class DetektReportMergeSpec {
assertThat(result.output).containsIgnoringWhitespaces(
"""
Execution failed for task ':child1:detekt'.
> Analysis failed with 2 weighted issues.
> Analysis failed with 2 issues.
""".trimIndent()
)
assertThat(result.output).containsIgnoringWhitespaces(
"""
Execution failed for task ':child2:detekt'.
> Analysis failed with 4 weighted issues.
> Analysis failed with 4 issues.
""".trimIndent()
)
assertThat(projectFile("build/reports/detekt/detekt.sarif")).doesNotExist()
Expand Down Expand Up @@ -121,13 +121,13 @@ class DetektReportMergeSpec {
assertThat(result.output).containsIgnoringWhitespaces(
"""
Execution failed for task ':child1:detekt'.
> Analysis failed with 2 weighted issues.
> Analysis failed with 2 issues.
""".trimIndent()
)
assertThat(result.output).containsIgnoringWhitespaces(
"""
Execution failed for task ':child2:detekt'.
> Analysis failed with 4 weighted issues.
> Analysis failed with 4 issues.
""".trimIndent()
)
assertThat(projectFile("build/reports/detekt/detekt.xml")).doesNotExist()
Expand Down
Expand Up @@ -45,7 +45,7 @@ class DetektTaskSpec {
.build()

gradleRunner.runDetektTaskAndExpectFailure { result ->
assertThat(result.output).contains("Analysis failed with 15 weighted issues.")
assertThat(result.output).contains("Analysis failed with 15 issues.")
}
}
}
Expand Up @@ -14,7 +14,7 @@ class JvmSpec {
.withArguments("detektMain")
.buildAndFail()

assertThat(result.output).contains("failed with 3 weighted issues.")
assertThat(result.output).contains("failed with 3 issues.")
assertThat(result.output).contains(
"Do not directly exit the process outside the `main` function. Throw an exception(...)"
)
Expand Down
Expand Up @@ -153,7 +153,16 @@ class ReportMergeSpec {
repositories {
mavenCentral()
google()
mavenLocal()
exclusiveContent {
forRepository {
ivy {
url = uri("${System.getenv("DGP_PROJECT_DEPS_REPO_PATH")}")
}
}
filter {
includeGroup("io.gitlab.arturbosch.detekt")
}
}
}
}

Expand Down
Expand Up @@ -5,7 +5,16 @@ plugins {

repositories {
mavenCentral()
mavenLocal()
exclusiveContent {
forRepository {
ivy {
url = uri("${System.getenv("DGP_PROJECT_DEPS_REPO_PATH")}")
}
}
filter {
includeGroup("io.gitlab.arturbosch.detekt")
}
}
}

tasks.detektMain {
Expand Down
Expand Up @@ -78,6 +78,5 @@ abstract class DetektGenerateConfigTask @Inject constructor(
}
}

@Suppress("UnnecessaryAbstractClass")
abstract class SingleExecutionBuildService : BuildService<BuildServiceParameters.None>
interface SingleExecutionBuildService : BuildService<BuildServiceParameters.None>
}