Add validation for empty kotlin.build.report.json.directory property
#KT-66314: Fixed
This commit is contained in:
committed by
Space Team
parent
a77a1cf3db
commit
c2023142f5
+8
-6
@@ -71,8 +71,8 @@ import org.jetbrains.kotlin.util.prefixIfNot
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
internal class PropertiesProvider private constructor(private val project: Project) {
|
internal class PropertiesProvider private constructor(private val project: Project) {
|
||||||
val buildReportSingleFile: File?
|
val buildReportSingleFile: String?
|
||||||
get() = property(PropertyNames.KOTLIN_BUILD_REPORT_SINGLE_FILE).orNull?.let { File(it) }
|
get() = property(PropertyNames.KOTLIN_BUILD_REPORT_SINGLE_FILE).orNull
|
||||||
|
|
||||||
val buildReportOutputs: List<String>
|
val buildReportOutputs: List<String>
|
||||||
get() = property("kotlin.build.report.output").orNull?.split(",") ?: emptyList()
|
get() = property("kotlin.build.report.output").orNull?.split(",") ?: emptyList()
|
||||||
@@ -80,8 +80,8 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
val buildReportLabel: String?
|
val buildReportLabel: String?
|
||||||
get() = property("kotlin.build.report.label").orNull
|
get() = property("kotlin.build.report.label").orNull
|
||||||
|
|
||||||
val buildReportFileOutputDir: File?
|
val buildReportFileOutputDir: String?
|
||||||
get() = property("kotlin.build.report.file.output_dir").orNull?.let { File(it) }
|
get() = property(PropertyNames.KOTLIN_BUILD_REPORT_FILE_DIR).orNull
|
||||||
|
|
||||||
val buildReportHttpUrl: String?
|
val buildReportHttpUrl: String?
|
||||||
get() = property(PropertyNames.KOTLIN_BUILD_REPORT_HTTP_URL).orNull
|
get() = property(PropertyNames.KOTLIN_BUILD_REPORT_HTTP_URL).orNull
|
||||||
@@ -110,8 +110,8 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
val buildReportMetrics: Boolean
|
val buildReportMetrics: Boolean
|
||||||
get() = booleanProperty("kotlin.build.report.metrics") ?: false
|
get() = booleanProperty("kotlin.build.report.metrics") ?: false
|
||||||
|
|
||||||
val buildReportJsonDir: File?
|
val buildReportJsonDir: String?
|
||||||
get() = property(PropertyNames.KOTLIN_BUILD_REPORT_JSON_DIR).orNull?.let { File(it) }
|
get() = property(PropertyNames.KOTLIN_BUILD_REPORT_JSON_DIR).orNull
|
||||||
|
|
||||||
val buildReportVerbose: Boolean
|
val buildReportVerbose: Boolean
|
||||||
get() = booleanProperty("kotlin.build.report.verbose") ?: false
|
get() = booleanProperty("kotlin.build.report.verbose") ?: false
|
||||||
@@ -666,6 +666,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
val KOTLIN_BUILD_REPORT_SINGLE_FILE = property("kotlin.build.report.single_file")
|
val KOTLIN_BUILD_REPORT_SINGLE_FILE = property("kotlin.build.report.single_file")
|
||||||
val KOTLIN_BUILD_REPORT_HTTP_URL = property("kotlin.build.report.http.url")
|
val KOTLIN_BUILD_REPORT_HTTP_URL = property("kotlin.build.report.http.url")
|
||||||
val KOTLIN_BUILD_REPORT_JSON_DIR = property("kotlin.build.report.json.directory")
|
val KOTLIN_BUILD_REPORT_JSON_DIR = property("kotlin.build.report.json.directory")
|
||||||
|
val KOTLIN_BUILD_REPORT_FILE_DIR = property("kotlin.build.report.file.output_dir")
|
||||||
val KOTLIN_OPTIONS_SUPPRESS_FREEARGS_MODIFICATION_WARNING = property("kotlin.options.suppressFreeCompilerArgsModificationWarning")
|
val KOTLIN_OPTIONS_SUPPRESS_FREEARGS_MODIFICATION_WARNING = property("kotlin.options.suppressFreeCompilerArgsModificationWarning")
|
||||||
val KOTLIN_NATIVE_USE_XCODE_MESSAGE_STYLE = property("kotlin.native.useXcodeMessageStyle")
|
val KOTLIN_NATIVE_USE_XCODE_MESSAGE_STYLE = property("kotlin.native.useXcodeMessageStyle")
|
||||||
val KOTLIN_INCREMENTAL_USE_CLASSPATH_SNAPSHOT = property("kotlin.incremental.useClasspathSnapshot")
|
val KOTLIN_INCREMENTAL_USE_CLASSPATH_SNAPSHOT = property("kotlin.incremental.useClasspathSnapshot")
|
||||||
@@ -729,5 +730,6 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal val Project.kotlinPropertiesProvider get() = invoke(this)
|
internal val Project.kotlinPropertiesProvider get() = invoke(this)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-5
@@ -11,11 +11,13 @@ import org.jetbrains.kotlin.build.report.HttpReportSettings
|
|||||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
import org.jetbrains.kotlin.build.report.metrics.GradleBuildPerformanceMetric
|
||||||
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
import org.jetbrains.kotlin.build.report.metrics.GradleBuildTime
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_BUILD_REPORT_FILE_DIR
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_BUILD_REPORT_SINGLE_FILE
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_BUILD_REPORT_SINGLE_FILE
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_BUILD_REPORT_HTTP_URL
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_BUILD_REPORT_HTTP_URL
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_BUILD_REPORT_JSON_DIR
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_BUILD_REPORT_JSON_DIR
|
||||||
import org.jetbrains.kotlin.gradle.plugin.internal.isProjectIsolationEnabled
|
import org.jetbrains.kotlin.gradle.plugin.internal.isProjectIsolationEnabled
|
||||||
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toUpperCaseAsciiOnly
|
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toUpperCaseAsciiOnly
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
private val availableMetrics = GradleBuildTime.values().map { it.name } + GradleBuildPerformanceMetric.values().map { it.name }
|
private val availableMetrics = GradleBuildTime.values().map { it.name } + GradleBuildPerformanceMetric.values().map { it.name }
|
||||||
|
|
||||||
@@ -36,7 +38,10 @@ internal fun reportingSettings(project: Project): ReportingSettings {
|
|||||||
else -> BuildReportMode.VERBOSE
|
else -> BuildReportMode.VERBOSE
|
||||||
}
|
}
|
||||||
val fileReportSettings = if (buildReportOutputTypes.contains(BuildReportType.FILE)) {
|
val fileReportSettings = if (buildReportOutputTypes.contains(BuildReportType.FILE)) {
|
||||||
val buildReportDir = properties.buildReportFileOutputDir ?: (if (project.isProjectIsolationEnabled) {
|
val buildReportDir = properties.buildReportFileOutputDir?.let {
|
||||||
|
validateFileName(it, KOTLIN_BUILD_REPORT_FILE_DIR)
|
||||||
|
File(it)
|
||||||
|
} ?: (if (project.isProjectIsolationEnabled) {
|
||||||
// TODO: it's a workaround for KT-52963, should be reworked – KT-55763
|
// TODO: it's a workaround for KT-52963, should be reworked – KT-55763
|
||||||
project.rootDir.resolve("build")
|
project.rootDir.resolve("build")
|
||||||
} else {
|
} else {
|
||||||
@@ -75,13 +80,17 @@ internal fun reportingSettings(project: Project): ReportingSettings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val singleOutputFile = if (buildReportOutputTypes.contains(BuildReportType.SINGLE_FILE)) {
|
val singleOutputFile = if (buildReportOutputTypes.contains(BuildReportType.SINGLE_FILE)) {
|
||||||
properties.buildReportSingleFile
|
properties.buildReportSingleFile?.let {
|
||||||
?: throw IllegalStateException("Can't configure single file report: '$KOTLIN_BUILD_REPORT_SINGLE_FILE' property is mandatory")
|
validateFileName(it, KOTLIN_BUILD_REPORT_SINGLE_FILE)
|
||||||
|
File(it)
|
||||||
|
} ?: throw IllegalStateException("Can't configure single file report: '$KOTLIN_BUILD_REPORT_SINGLE_FILE' property is mandatory")
|
||||||
} else null
|
} else null
|
||||||
|
|
||||||
val jsonReportDir = if (buildReportOutputTypes.contains(BuildReportType.JSON)) {
|
val jsonReportDir = if (buildReportOutputTypes.contains(BuildReportType.JSON)) {
|
||||||
properties.buildReportJsonDir
|
properties.buildReportJsonDir?.let {
|
||||||
?: throw IllegalStateException("Can't configure json report: '$KOTLIN_BUILD_REPORT_JSON_DIR' property is mandatory")
|
validateFileName(it, KOTLIN_BUILD_REPORT_JSON_DIR)
|
||||||
|
File(it)
|
||||||
|
} ?: throw IllegalStateException("Can't configure json report: '$KOTLIN_BUILD_REPORT_JSON_DIR' property is mandatory")
|
||||||
} else null
|
} else null
|
||||||
|
|
||||||
return ReportingSettings(
|
return ReportingSettings(
|
||||||
@@ -98,4 +107,11 @@ internal fun reportingSettings(project: Project): ReportingSettings {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun validateFileName(fileName: String, propertyName: String) {
|
||||||
|
if (fileName.isBlank()) {
|
||||||
|
throw IllegalStateException("The property '$propertyName' must not be empty. Please provide a valid value.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2024 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.unitTests.report
|
||||||
|
|
||||||
|
import org.gradle.api.internal.plugins.PluginApplicationException
|
||||||
|
import org.jetbrains.kotlin.gradle.util.applyKotlinJvmPlugin
|
||||||
|
import org.jetbrains.kotlin.gradle.util.buildProject
|
||||||
|
import org.jetbrains.kotlin.gradle.util.propertiesExtension
|
||||||
|
import org.jetbrains.kotlin.util.assertThrows
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class ConfigureReportingTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun validateMandatoryJsonDirectory() {
|
||||||
|
val exception =
|
||||||
|
assertThrows<PluginApplicationException>("The property 'kotlin.build.report.json.directory' is mandatory for JSON output. Validation should fail.") {
|
||||||
|
buildProject {
|
||||||
|
propertiesExtension.set("kotlin.build.report.output", "json")
|
||||||
|
applyKotlinJvmPlugin()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals("Can't configure json report: 'kotlin.build.report.json.directory' property is mandatory", exception.cause?.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun validateInvalidJsonDirectory() {
|
||||||
|
val exception =
|
||||||
|
assertThrows<PluginApplicationException>("The property 'kotlin.build.report.json.directory' should not be empty. Validation should fail.") {
|
||||||
|
buildProject {
|
||||||
|
propertiesExtension.set("kotlin.build.report.output", "json")
|
||||||
|
propertiesExtension.set("kotlin.build.report.json.directory", "")
|
||||||
|
applyKotlinJvmPlugin()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals("The property 'kotlin.build.report.json.directory' must not be empty. Please provide a valid value.", exception.cause?.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user