Implement checkExpectedGradlePropertyValues to notify developers about changing Gradle properties
This commit is contained in:
committed by
Space
parent
cc30d99f6f
commit
1391c983a2
@@ -1084,3 +1084,7 @@ afterEvaluate {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
afterEvaluate {
|
||||
checkExpectedGradlePropertyValues()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright 2010-2022 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.
|
||||
*/
|
||||
|
||||
import GradlePropertyIssue.MissingProperty
|
||||
import GradlePropertyIssue.UnexpectedPropertyValue
|
||||
import org.gradle.api.Project
|
||||
|
||||
/**
|
||||
* Mechanism to warn developers when a given Gradle property does not match the developer's expectation.
|
||||
*
|
||||
* There may be some Gradle properties, that are defined in the project and will change over time (e.g. defaultSnapshotVersion).
|
||||
* Some developers (and QA) will need to be very clear about the value of this property.
|
||||
*
|
||||
* In order to get notified about the value of the property changing, it is possible to define the same property in
|
||||
* ~/.gradle/gradle.properties with a given `.kotlin_build.expected_value` suffix to ensure the value.
|
||||
*
|
||||
* e.g. if a developer set's
|
||||
*
|
||||
* `defaultSnapshotVersion.kotlin_build.expected_value=1.6.255-SNAPSHOT` and the value gets bumped to `1.7.255-SNAPSHOT` after pulling from master,
|
||||
* the developer will notice this during project configuration phase.
|
||||
*/
|
||||
fun Project.checkExpectedGradlePropertyValues() {
|
||||
val expectSuffix = ".kotlin_build.expected_value"
|
||||
val expectKeys = properties.keys.filter { it.endsWith(expectSuffix) }
|
||||
|
||||
val issues = expectKeys.mapNotNull { expectKey ->
|
||||
val actualKey = expectKey.removeSuffix(expectSuffix)
|
||||
val expectedValue = properties[expectKey]?.toString() ?: return@mapNotNull null
|
||||
|
||||
if (!properties.containsKey(actualKey))
|
||||
return@mapNotNull MissingProperty(actualKey, expectedValue)
|
||||
|
||||
val actualValue = properties[actualKey].toString()
|
||||
|
||||
if (expectedValue != actualValue)
|
||||
return@mapNotNull UnexpectedPropertyValue(actualKey, expectedValue, actualValue)
|
||||
|
||||
null
|
||||
}.toSet()
|
||||
|
||||
if (issues.isEmpty()) {
|
||||
return
|
||||
}
|
||||
|
||||
val unexpectedPropertyValues = issues.filterIsInstance<UnexpectedPropertyValue>()
|
||||
val missingProperties = issues.filterIsInstance<MissingProperty>()
|
||||
|
||||
throw IllegalArgumentException(
|
||||
buildString {
|
||||
if (unexpectedPropertyValues.isNotEmpty()) {
|
||||
appendLine("Unexpected Gradle property values found in ${project.displayName}:")
|
||||
unexpectedPropertyValues.forEach { issue ->
|
||||
appendLine("Expected ${issue.key} to be '${issue.expectedValue}', but found '${issue.actualValue}'")
|
||||
}
|
||||
}
|
||||
|
||||
if (missingProperties.isNotEmpty()) {
|
||||
if (unexpectedPropertyValues.isNotEmpty()) appendLine()
|
||||
appendLine("Missing Gradle properties found in ${project.displayName}:")
|
||||
missingProperties.forEach { issue ->
|
||||
appendLine("Expected ${issue.key} to be '${issue.expectedValue}', but the property is missing")
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private sealed class GradlePropertyIssue {
|
||||
data class UnexpectedPropertyValue(
|
||||
val key: String, val expectedValue: String, val actualValue: String
|
||||
) : GradlePropertyIssue()
|
||||
|
||||
data class MissingProperty(
|
||||
val key: String, val expectedValue: String
|
||||
) : GradlePropertyIssue()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user