diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/util/Cleanuper.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/util/Cleanuper.kt index bcd5ad8b220..266c63e8700 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/util/Cleanuper.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/util/Cleanuper.kt @@ -20,9 +20,7 @@ fun removeExtraFilesFromPreviousGeneration(previouslyGeneratedFiles: List, for (file in previouslyGeneratedFiles) { if (file.absolutePath !in generatedFilesPath) { - if (GeneratorsFileUtil.isTeamCityBuild) { - GeneratorsFileUtil.assertTeamCityMode() - } + if (GeneratorsFileUtil.failOnTeamCity("File delete `${file.absolutePath}`")) continue println("Deleted: ${file.absolutePath}") file.delete() } diff --git a/generators/main/GeneratorsFileUtil.kt b/generators/main/GeneratorsFileUtil.kt index 9897187c925..1f8df241e7f 100644 --- a/generators/main/GeneratorsFileUtil.kt +++ b/generators/main/GeneratorsFileUtil.kt @@ -20,7 +20,7 @@ object GeneratorsFileUtil { fun writeFileIfContentChanged(file: File, newText: String, logNotChanged: Boolean = true) { val parentFile = file.parentFile if (!parentFile.exists()) { - if (isTeamCityBuild) assertTeamCityMode() + if (failOnTeamCity("Create dir `${parentFile.path}`")) return if (parentFile.mkdirs()) { println("Directory created: " + parentFile.absolutePath) } else { @@ -33,7 +33,7 @@ object GeneratorsFileUtil { } return } - if (isTeamCityBuild) assertTeamCityMode() + if (failOnTeamCity("Write file `${file.toPath()}`")) return val useTempFile = !SystemInfo.isWindows val targetFile = file.toPath() val tempFile = @@ -47,8 +47,30 @@ object GeneratorsFileUtil { println() } - fun assertTeamCityMode(): Nothing { - throw IllegalStateException("You should commit all newly generated files before pushing them to TeamCity") + fun failOnTeamCity(message: String): Boolean { + if (!isTeamCityBuild) return false + + fun String.escapeForTC(): String = StringBuilder(length).apply { + for (char in this@escapeForTC) { + append( + when (char) { + '|' -> "||" + '\'' -> "|'" + '\n' -> "|n" + '\r' -> "|r" + '[' -> "|[" + ']' -> "|]" + else -> char + } + ) + } + }.toString() + + val fullMessage = "[Re-generation needed!] $message\n" + + "Run correspondent (check the log above) Gradle task locally and commit changes." + + println("##teamcity[buildProblem description='${fullMessage.escapeForTC()}']") + return true } fun isFileContentChangedIgnoringLineSeparators(file: File, content: String): Boolean {