[Build] Add gradle-warnings-detector plugin for integration tests
#KT-55972 In Progress
This commit is contained in:
committed by
Space Team
parent
7ae85ed68e
commit
7bcfa45c49
@@ -0,0 +1,6 @@
|
||||
## Description
|
||||
|
||||
Contains a plugin for Gradle integration tests
|
||||
that helps us to detect deprecation warnings presence regardless of the configured warning mode
|
||||
|
||||
Please don't use this module in real projects and don't rely on it as an example. It uses undocumented internal Gradle API.
|
||||
@@ -0,0 +1,29 @@
|
||||
import plugins.KotlinBuildPublishingPlugin
|
||||
|
||||
plugins {
|
||||
id("gradle-plugin-common-configuration")
|
||||
}
|
||||
|
||||
gradlePlugin {
|
||||
plugins {
|
||||
create("gradle-warnings-detector") {
|
||||
id = "org.jetbrains.kotlin.test.gradle-warnings-detector"
|
||||
displayName = "GradleWarningsDetectorPlugin"
|
||||
description = displayName
|
||||
implementationClass = "org.jetbrains.kotlin.gradle.test.GradleWarningsDetectorPlugin"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Disable releasing for this plugin
|
||||
// It is not intended to be released publicly
|
||||
tasks.withType<PublishToMavenRepository>()
|
||||
.configureEach {
|
||||
if (name.endsWith("PublicationTo${KotlinBuildPublishingPlugin.REPOSITORY_NAME}Repository")) {
|
||||
enabled = false
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named("publishPlugins") {
|
||||
enabled = false
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.test
|
||||
|
||||
import org.gradle.api.provider.Provider
|
||||
|
||||
internal class DeprecationBuildOperationListener(
|
||||
private val warningsReporter: Provider<GradleWarningsReporter>
|
||||
) : org.gradle.internal.operations.BuildOperationListener {
|
||||
override fun started(
|
||||
buildOperation: org.gradle.internal.operations.BuildOperationDescriptor,
|
||||
startEvent: org.gradle.internal.operations.OperationStartEvent
|
||||
) {
|
||||
// no-op
|
||||
}
|
||||
|
||||
override fun progress(
|
||||
operationIdentifier: org.gradle.internal.operations.OperationIdentifier,
|
||||
progressEvent: org.gradle.internal.operations.OperationProgressEvent
|
||||
) {
|
||||
val details = progressEvent.details
|
||||
if (details is org.gradle.internal.featurelifecycle.DefaultDeprecatedUsageProgressDetails) {
|
||||
warningsReporter.get().hasWarnings = true
|
||||
}
|
||||
}
|
||||
|
||||
override fun finished(
|
||||
buildOperation: org.gradle.internal.operations.BuildOperationDescriptor,
|
||||
finishEvent: org.gradle.internal.operations.OperationFinishEvent
|
||||
) {
|
||||
// no-op
|
||||
}
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.test
|
||||
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.initialization.Settings
|
||||
import org.gradle.api.logging.Logger
|
||||
import org.gradle.api.logging.Logging
|
||||
import org.gradle.internal.operations.BuildOperationListenerManager
|
||||
import javax.inject.Inject
|
||||
|
||||
class GradleWarningsDetectorPlugin @Inject constructor(
|
||||
private val buildOperationListenerManager: BuildOperationListenerManager
|
||||
) : Plugin<Settings> {
|
||||
private val logger: Logger = Logging.getLogger(this.javaClass)
|
||||
|
||||
override fun apply(target: Settings) {
|
||||
logger.warn("[${GradleWarningsDetectorPlugin::class.java.simpleName}] The plugin is being applied")
|
||||
val warningsReporter = GradleWarningsReporter.registerIfAbsent(target.gradle)
|
||||
val deprecationBuildOperationListener = DeprecationBuildOperationListener(warningsReporter)
|
||||
buildOperationListenerManager.addListener(deprecationBuildOperationListener)
|
||||
warningsReporter.get().executeAtBuildFinish = {
|
||||
buildOperationListenerManager.removeListener(deprecationBuildOperationListener)
|
||||
}
|
||||
}
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.test
|
||||
|
||||
import org.gradle.api.invocation.Gradle
|
||||
import org.gradle.api.logging.Logger
|
||||
import org.gradle.api.logging.Logging
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.gradle.api.services.BuildService
|
||||
import org.gradle.api.services.BuildServiceParameters
|
||||
|
||||
internal abstract class GradleWarningsReporter : BuildService<BuildServiceParameters.None>, AutoCloseable {
|
||||
internal var hasWarnings = false
|
||||
|
||||
private val logger: Logger = Logging.getLogger(this.javaClass)
|
||||
internal var executeAtBuildFinish: (() -> Unit)? = null
|
||||
|
||||
override fun close() {
|
||||
executeAtBuildFinish?.invoke()
|
||||
if (hasWarnings) {
|
||||
logger.warn("[${GradleWarningsDetectorPlugin::class.java.simpleName}] Some deprecation warnings were found during this build.")
|
||||
}
|
||||
}
|
||||
|
||||
internal companion object {
|
||||
private val serviceName =
|
||||
"${GradleWarningsReporter::class.java.canonicalName}_${GradleWarningsReporter::class.java.classLoader.hashCode()}"
|
||||
|
||||
fun registerIfAbsent(gradle: Gradle): Provider<GradleWarningsReporter> =
|
||||
gradle.sharedServices.registerIfAbsent(serviceName, GradleWarningsReporter::class.java) {}
|
||||
}
|
||||
}
|
||||
@@ -323,6 +323,7 @@ tasks.withType<Test> {
|
||||
dependsOn(":kotlin-gradle-plugin:validatePlugins")
|
||||
dependsOnKotlinGradlePluginInstall()
|
||||
dependsOn(":gradle:android-test-fixes:install")
|
||||
dependsOn(":gradle:gradle-warnings-detector:install")
|
||||
dependsOn(":examples:annotation-processor-example:install")
|
||||
|
||||
systemProperty("kotlinVersion", rootProject.extra["kotlinVersion"] as String)
|
||||
|
||||
Reference in New Issue
Block a user