[K/N] Safe determining Kotlin/Native meta version

This commit is contained in:
Dmitriy Dolovov
2018-09-14 17:08:08 +03:00
parent 88fb76bffc
commit 0059fcceb9
2 changed files with 20 additions and 6 deletions
@@ -20,12 +20,18 @@ interface KonanVersion : Serializable {
// major.minor.patch-meta-build where patch, meta and build are optional.
private val versionPattern = "(\\d+)\\.(\\d+)(?:\\.(\\d+))?(?:-(\\p{Alpha}\\p{Alnum}*))?(?:-(\\d+))?".toRegex()
fun fromString(version: String) : KonanVersion {
fun fromString(version: String): KonanVersion {
val (major, minor, maintenance, metaString, build) =
versionPattern.matchEntire(version)?.destructured ?:
throw IllegalArgumentException("Cannot parse Kotlin/Native version: $version")
val meta = metaString.ifEmpty { "release" }.let { MetaVersion.valueOf(it.toUpperCase()) }
return KonanVersionImpl(meta, major.toInt(), minor.toInt(), maintenance.toIntOrNull() ?: 0, build.toIntOrNull() ?: -1)
versionPattern.matchEntire(version)?.destructured
?: throw IllegalArgumentException("Cannot parse Kotlin/Native version: $version")
return KonanVersionImpl(
MetaVersion.findAppropriate(metaString),
major.toInt(),
minor.toInt(),
maintenance.toIntOrNull() ?: 0,
build.toIntOrNull() ?: -1
)
}
}
}
@@ -17,5 +17,13 @@ enum class MetaVersion(val metaString: String) {
BETA("beta"),
RC1("rc1"),
RC2("rc2"),
RELEASE("release")
RELEASE("release");
companion object {
fun findAppropriate(metaString: String): MetaVersion {
return MetaVersion.values().find { it.metaString.equals(metaString, ignoreCase = true) }
?: if (metaString.isBlank()) RELEASE else error("Unknown meta version: $metaString")
}
}
}