From 619ee8717b0060ac3936d06e70c1db252d9fb2b7 Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Fri, 31 May 2019 11:09:14 +0300 Subject: [PATCH] Gradle, npm: extract semver utils to separate file --- .../targets/js/npm/GradleNodeModuleBuilder.kt | 87 ----------------- .../kotlin/gradle/targets/js/npm/semver.kt | 93 +++++++++++++++++++ ...oduleBuilderKtTest.kt => SemVerFixTest.kt} | 2 +- 3 files changed, 94 insertions(+), 88 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/semver.kt rename libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/{GradleNodeModuleBuilderKtTest.kt => SemVerFixTest.kt} (97%) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt index aaaa098392d..eef7b1ef484 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt @@ -75,93 +75,6 @@ private fun isKotlinJsRuntimeFile(file: File): Boolean { || name.endsWith(".js.map") } -internal fun fixSemver(version: String): String { - var i = 0 - var number = 0 - var major = "1" - var minor = "0" - var patch = "0" - val rest = StringBuilder() - val digits = StringBuilder() - - fun setComponent() { - val digitsFiltered = digits.toString().trimStart { it == '0' }.takeIf { it.isNotEmpty() } ?: "0" - when (number) { - 0 -> major = digitsFiltered - 1 -> minor = digitsFiltered - 2 -> patch = digitsFiltered - else -> error(number) - } - } - - while (i < version.length) { - val c = version[i++] - if (c.isDigit()) digits.append(c) - else if (c == '-' || c == '+') { - // examples: - // 1.2.3-RC1-1234, - // 1.2-RC1-1234 - // 1.2-beta.11+sha.0x - setComponent() - number = 3 - rest.append(c) - break - } else if (c == '.') { - rest.append(c) - setComponent() - digits.setLength(0) - number++ - if (number > 2) break - } else rest.append(c) - } - - if (number <= 2) setComponent() - - rest.append(version.substring(i)) - - val restFiltered = rest.filter { - it in '0'..'9' || - it in 'A'..'Z' || - it in 'a'..'z' || - it == '.' || - it == '-' || - it == '+' - } - val restComponents = restFiltered.split('+', limit = 2) - - val preRelease = restComponents.getOrNull(0) - ?.foldDelimiters() - ?.trim { it == '-' || it == '.' } - ?.takeIf { it.isNotEmpty() } - - val build = restComponents.getOrNull(1) - ?.filter { it != '+' } - ?.trim { it == '-' || it == '.' } - ?.takeIf { it.isNotEmpty() } - - return "$major.$minor.$patch" + - (if (preRelease != null) "-$preRelease" else "") + - (if (build != null) "+$build" else "") -} - -private fun String.foldDelimiters(): String { - val result = StringBuilder(length) - var endsWithDelimiter = false - for (i in 0 until length) { - val c = this[i] - if (c == '+' || c == '-' || c == '.') { - if (!endsWithDelimiter) { - result.append(c) - endsWithDelimiter = true - } - } else { - endsWithDelimiter = false - result.append(c) - } - } - return result.toString() -} - fun makeNodeModule( container: File, packageJson: PackageJson, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/semver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/semver.kt new file mode 100644 index 00000000000..edccd5e0d4d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/semver.kt @@ -0,0 +1,93 @@ +/* + * Copyright 2010-2019 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.targets.js.npm + +internal fun fixSemver(version: String): String { + var i = 0 + var number = 0 + var major = "0" + var minor = "0" + var patch = "0" + val rest = StringBuilder() + val digits = StringBuilder() + + fun setComponent() { + val digitsFiltered = digits.toString().trimStart { it == '0' }.takeIf { it.isNotEmpty() } ?: "0" + when (number) { + 0 -> major = digitsFiltered + 1 -> minor = digitsFiltered + 2 -> patch = digitsFiltered + else -> error(number) + } + } + + while (i < version.length) { + val c = version[i++] + if (c.isDigit()) digits.append(c) + else if (c == '-' || c == '+') { + // examples: + // 1.2.3-RC1-1234, + // 1.2-RC1-1234 + // 1.2-beta.11+sha.0x + setComponent() + number = 3 + rest.append(c) + break + } else if (c == '.') { + rest.append(c) + setComponent() + digits.setLength(0) + number++ + if (number > 2) break + } else rest.append(c) + } + + if (number <= 2) setComponent() + + rest.append(version.substring(i)) + + val restFiltered = rest.filter { + it in '0'..'9' || + it in 'A'..'Z' || + it in 'a'..'z' || + it == '.' || + it == '-' || + it == '+' + } + val restComponents = restFiltered.split('+', limit = 2) + + val preRelease = restComponents.getOrNull(0) + ?.foldDelimiters() + ?.trim { it == '-' || it == '.' } + ?.takeIf { it.isNotEmpty() } + + val build = restComponents.getOrNull(1) + ?.filter { it != '+' } + ?.trim { it == '-' || it == '.' } + ?.takeIf { it.isNotEmpty() } + + return "$major.$minor.$patch" + + (if (preRelease != null) "-$preRelease" else "") + + (if (build != null) "+$build" else "") +} + +private fun String.foldDelimiters(): String { + val result = StringBuilder(length) + var endsWithDelimiter = false + for (i in 0 until length) { + val c = this[i] + if (c == '+' || c == '-' || c == '.') { + if (!endsWithDelimiter) { + result.append(c) + endsWithDelimiter = true + } + } else { + endsWithDelimiter = false + result.append(c) + } + } + return result.toString() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilderKtTest.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/SemVerFixTest.kt similarity index 97% rename from libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilderKtTest.kt rename to libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/SemVerFixTest.kt index 3015ed32b3c..de104a85669 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilderKtTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/SemVerFixTest.kt @@ -12,7 +12,7 @@ import org.junit.runner.RunWith import org.junit.runners.Parameterized @RunWith(Parameterized::class) -class GradleNodeModuleBuilderKtTest(val expected: String, val actual: String) { +class SemVerFixTest(val expected: String, val actual: String) { companion object { @Parameterized.Parameters(name = "fix({1}) == {0}") @JvmStatic