diff --git a/build-tools/src/main/kotlin/org/jetbrains/kotlin/BuildRegister.kt b/build-tools/src/main/kotlin/org/jetbrains/kotlin/BuildRegister.kt index b6bab51e040..5cde686e331 100644 --- a/build-tools/src/main/kotlin/org/jetbrains/kotlin/BuildRegister.kt +++ b/build-tools/src/main/kotlin/org/jetbrains/kotlin/BuildRegister.kt @@ -42,7 +42,7 @@ open class BuildRegister : DefaultTask() { val buildInfoTokens: Int = 4 val additionalInfoTokens: Int = 3 val compileTimeSamplesNumber: Int = 2 - val buildNumberTokens: Int = 3 + val buildNumberRegex: Regex = "\\d+(\\.\\d+)+(-M\\d)?-(\\w+)-\\d+".toRegex() val performanceServer = "https://kotlin-native-perf-summary.labs.jb.gg" private fun sendPostRequest(url: String, body: String) : String { @@ -174,11 +174,8 @@ open class BuildRegister : DefaultTask() { } } - val buildNumberParts = buildNumber.split("-") - if (buildNumberParts.size != buildNumberTokens) { - error("Wrong format of build number $buildNumber.") - } - val (_, buildType, _) = buildNumberParts + val matchResult = buildNumberRegex.find(buildNumber) ?: error("Wrong format of build number $buildNumber.") + val buildType = matchResult.groups[3]!!.value // Send post request to register build. val requestBody = buildString { diff --git a/build-tools/src/main/kotlin/org/jetbrains/kotlin/CollisionDetector.kt b/build-tools/src/main/kotlin/org/jetbrains/kotlin/CollisionDetector.kt index 07af788a0b1..59acad09ca9 100644 --- a/build-tools/src/main/kotlin/org/jetbrains/kotlin/CollisionDetector.kt +++ b/build-tools/src/main/kotlin/org/jetbrains/kotlin/CollisionDetector.kt @@ -55,7 +55,7 @@ open class CollisionDetector : DefaultTask() { resolvedConflicts[outputPath] = processedFile } else { // Skip class files from ignored libraries if version of libraries had collision are the same. - val versionRegex = "\\d+\\.\\d+(\\.\\d+)?(-\\w+(-\\d+)?)?".toRegex() + val versionRegex = "\\d+\\.\\d+(\\.\\d+)?(-M\\d)?(-\\w+(-\\d+)?)?".toRegex() val currentVersion = versionRegex.find(processedFile.name)?.groupValues?.get(0) val collisionLibVersion = versionRegex.find(filesInfo.getValue(outputPath))?.groupValues?.get(0) if (outputPath.endsWith(".class") && currentVersion == collisionLibVersion) { diff --git a/tools/performance-server/shared/src/main/kotlin/org/jetbrains/build/Build.kt b/tools/performance-server/shared/src/main/kotlin/org/jetbrains/build/Build.kt new file mode 100644 index 00000000000..28eb2c51624 --- /dev/null +++ b/tools/performance-server/shared/src/main/kotlin/org/jetbrains/build/Build.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.jetbrains.build + +import org.jetbrains.report.* +import org.jetbrains.report.json.* + +data class Build(val buildNumber: String, val startTime: String, val finishTime: String, val branch: String, + val commits: String, val buildType: String, val failuresNumber: Int, val executionTime: String, + val compileTime: String, val codeSize: String, val bundleSize: String?) { + + companion object: EntityFromJsonFactory { + override fun create(data: JsonElement): Build { + if (data is JsonObject) { + val buildNumber = elementToString(data.getRequiredField("buildNumber"), "buildNumber") + val startTime = elementToString(data.getRequiredField("startTime"), "startTime") + val finishTime = elementToString(data.getRequiredField("finishTime"), "finishTime") + val branch = elementToString(data.getRequiredField("branch"), "branch") + val commits = elementToString(data.getRequiredField("commits"), "commits") + val buildType = elementToString(data.getRequiredField("buildType"), "buildType") + val failuresNumber = elementToInt(data.getRequiredField("failuresNumber"), "failuresNumber") + val executionTime = elementToString(data.getRequiredField("executionTime"), "executionTime") + val compileTime = elementToString(data.getRequiredField("compileTime"), "compileTime") + val codeSize = elementToString(data.getRequiredField("codeSize"), "codeSize") + val bundleSize = elementToStringOrNull(data.getRequiredField("bundleSize"), "bundleSize") + return Build(buildNumber, startTime, finishTime, branch, commits, buildType, failuresNumber, executionTime, + compileTime, codeSize, bundleSize) + } else { + error("Top level entity is expected to be an object. Please, check origin files.") + } + } + } + + private fun formatTime(time: String, targetZone: Int = 3): String { + val matchResult = "^\\d{8}T(\\d{2})(\\d{2})\\d{2}((\\+|-)\\d{2})".toRegex().find(time)?.groupValues + matchResult?.let { + val timeZone = matchResult[3].toInt() + val timeDifference = targetZone - timeZone + var hours = (matchResult[1].toInt() + timeDifference) + if (hours > 23) { + hours -= 24 + } + return "${if (hours < 10) "0$hours" else "$hours"}:${matchResult[2]}" + } ?: error { "Wrong format of time $startTime" } + } + val date: String by lazy { + val matchResult = "^(\\d{4})(\\d{2})(\\d{2})".toRegex().find(startTime)?.groupValues + matchResult?.let { "${matchResult[3]}/${matchResult[2]}/${matchResult[1]}" } + ?: error { "Wrong format of time $startTime" } + } + val formattedStartTime: String by lazy { + formatTime(startTime) + } + val formattedFinishTime: String by lazy { + formatTime(finishTime) + } +} \ No newline at end of file diff --git a/tools/performance-server/src/main/kotlin/routes/route.kt b/tools/performance-server/src/main/kotlin/routes/route.kt index 938d80d327f..17480d5fde9 100644 --- a/tools/performance-server/src/main/kotlin/routes/route.kt +++ b/tools/performance-server/src/main/kotlin/routes/route.kt @@ -49,7 +49,7 @@ object LocalCache { buildsDescription.forEach { if (!it.isEmpty()) { val buildNumber = it.substringBefore(',') - if (!"\\d+(\\.\\d+)+-\\w+-\\d+".toRegex().matches(buildNumber)) { + if (!"\\d+(\\.\\d+)+(-M\\d)?-\\w+-\\d+".toRegex().matches(buildNumber)) { error("Build number $buildNumber differs from expected format. File with data for " + "target $onlyTarget could be corrupted.") } diff --git a/tools/performance-server/ui/src/main/kotlin/main.kt b/tools/performance-server/ui/src/main/kotlin/main.kt index 9b9364cdc09..fcfb38143d0 100644 --- a/tools/performance-server/ui/src/main/kotlin/main.kt +++ b/tools/performance-server/ui/src/main/kotlin/main.kt @@ -263,7 +263,7 @@ fun main(args: Array) { val branchesUrl = "$serverUrl/branches/${parameters["target"]}" val branches: Array = JSON.parse(sendGetRequest(branchesUrl)) - val releaseBranches = branches.filter { "^v\\d+\\.\\d+\\.\\d+-fixes$".toRegex().find(it) != null } + val releaseBranches = branches.filter { "^v\\d+(\\.\\d+)+(-M\\d)?-fixes$".toRegex().find(it) != null } // Fill autocomplete list. val buildsNumbersUrl = "$serverUrl/buildsNumbers/${parameters["target"]}"