Gradle, JS: support exotic versions while converting to semver
#KT-31563
This commit is contained in:
+82
-16
@@ -76,24 +76,90 @@ private fun isKotlinJsRuntimeFile(file: File): Boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal fun fixSemver(version: String): String {
|
internal fun fixSemver(version: String): String {
|
||||||
val c = version.split("-", limit = 2)
|
var i = 0
|
||||||
val main = c[0]
|
var number = 0
|
||||||
val preRelease = if (c.size > 1) c[1] else null
|
var major = "1"
|
||||||
val numbers = main.split(".")
|
var minor = "0"
|
||||||
val major = numbers[0]
|
var patch = "0"
|
||||||
val minor = if (numbers.size > 1) numbers[1] else null
|
val rest = StringBuilder()
|
||||||
val patch = if (numbers.size > 2) numbers[2] else null
|
val digits = StringBuilder()
|
||||||
return buildString {
|
|
||||||
append(major.filter { it.isDigit() })
|
fun setComponent() {
|
||||||
append(".")
|
val digitsFiltered = digits.toString().trimStart { it == '0' }.takeIf { it.isNotEmpty() } ?: "0"
|
||||||
append(minor?.filter { it.isDigit() } ?: "0")
|
when (number) {
|
||||||
append(".")
|
0 -> major = digitsFiltered
|
||||||
append(patch?.filter { it.isDigit() } ?: "0")
|
1 -> minor = digitsFiltered
|
||||||
if (preRelease != null) {
|
2 -> patch = digitsFiltered
|
||||||
append("-")
|
else -> error(number)
|
||||||
append(preRelease)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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(
|
fun makeNodeModule(
|
||||||
|
|||||||
+50
-4
@@ -8,11 +8,57 @@ package org.jetbrains.kotlin.gradle.targets.js.npm
|
|||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
import org.junit.Assert.*
|
import org.junit.Assert.*
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.junit.runners.Parameterized
|
||||||
|
|
||||||
|
@RunWith(Parameterized::class)
|
||||||
|
class GradleNodeModuleBuilderKtTest(val expected: String, val actual: String) {
|
||||||
|
companion object {
|
||||||
|
@Parameterized.Parameters(name = "fix({1}) == {0}")
|
||||||
|
@JvmStatic
|
||||||
|
fun data() = listOf(
|
||||||
|
arrayOf("1.3.0-SNAPSHOT", "1.3-SNAPSHOT"),
|
||||||
|
arrayOf("1.2.3-RC1-1234", "1.2.3-RC1-1234"),
|
||||||
|
arrayOf("0.0.0-abc-qx", "abc-qx"),
|
||||||
|
arrayOf("1.0.0-o.p-qx", "1.o.p-qx"),
|
||||||
|
arrayOf("1.2.3-o.p-qa", "1.o2.3p-qa"),
|
||||||
|
arrayOf("1.0.0", "1.0.0+"),
|
||||||
|
arrayOf("1.2.3-beta.11+sha.0nsfgkjkjsdf", "1.2.3-beta.11+sha.0nsfgkjkjsdf"),
|
||||||
|
arrayOf("1.2.0-beta.11+sha.0nsfgkjkjsdf", "1.2-beta.11+sha.0nsfgkjkjsdf"),
|
||||||
|
arrayOf("1.0.0-beta.11+sha.0nsfgkjkjsdf", "1-beta.11+sha.0nsfgkjkjsdf"),
|
||||||
|
arrayOf("1.2.3-beta.1-1.ab-c+sha.0nsfgkjkjs-df", "1.2.3-beta.1-1.ab-c+sha.0nsfgkjkjs-df"),
|
||||||
|
arrayOf("1.0.0-alpha.1", "1.0.0-alpha.1"),
|
||||||
|
arrayOf("1.0.0-alpha.beta", "1.0.0-alpha.beta"),
|
||||||
|
arrayOf("1.0.0-alpha.12.ab-c", "1.0.0-alpha.12.ab-c"),
|
||||||
|
arrayOf("1.0.0-alpha.12.x-yz", "1.0.0-alpha.12.x-yz"),
|
||||||
|
arrayOf("1.0.0", "1"),
|
||||||
|
arrayOf("1.2.0", "1.2"),
|
||||||
|
arrayOf("1.2.3", "1.2.3"),
|
||||||
|
arrayOf("1.2.3", "01.2.3"),
|
||||||
|
arrayOf("0.2.3", "0.2.3"),
|
||||||
|
arrayOf("0.0.3", "0.0.3"),
|
||||||
|
arrayOf("0.0.0", "0.0.0"),
|
||||||
|
arrayOf("1.2.3", "1.2.3-"),
|
||||||
|
arrayOf("1.2.3-x", "1.2.3-x"),
|
||||||
|
arrayOf("1.2.3-xy", "1.2.3-xy"),
|
||||||
|
arrayOf("1.2.3-xy-z", "1.2.3-xy-z"),
|
||||||
|
arrayOf("1.2.3-xy-z", "1.2.3-xy-z+"),
|
||||||
|
arrayOf("1.2.3-xy-z+1", "1.2.3-xy-z+1"),
|
||||||
|
arrayOf("1.2.3-x.xy-z+1", "1x.2.3-xy-z+1"),
|
||||||
|
arrayOf("1.2.3-x.y.xy-z+1", "1x.2y.3-xy-z+1"),
|
||||||
|
arrayOf("1.2.3-x.y.z-xy-z+1", "1x.2y.3z-xy-z+1"),
|
||||||
|
arrayOf("1.2.3-x.y.z-xy-z+1u", "1x.2y.3z-xy-z+1u"),
|
||||||
|
arrayOf("1.2.3-x.y.z-x.y-z+1u", "1x.2y.3z-x.y-z+1u"),
|
||||||
|
arrayOf("1.2.3-x.y.z-x.y-z+1u", "1x.2y.3z!-x.y-z+1u"),
|
||||||
|
arrayOf("1.2.3-x.y.z-x.y-z+1u", "1x.2y.3z-x.y!-z+1u"),
|
||||||
|
arrayOf("1.2.3-x.y.z-x.y-z+1u", "!1x.2y.3z-x.y!-z+1u"),
|
||||||
|
arrayOf("1.2.3-x.y.z-x.y-z+1u", "1x.!2y.3z-x.y!-z+1u")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class GradleNodeModuleBuilderKtTest {
|
|
||||||
@Test
|
@Test
|
||||||
fun fixSemver() {
|
fun testFixSemver() {
|
||||||
assertEquals("1.3.0-SNAPSHOT", fixSemver("1.3-SNAPSHOT"))
|
assertEquals(expected, fixSemver(actual))
|
||||||
assertEquals("1.2.3-RC1-1234", fixSemver("1.2.3-RC1-1234"))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user