Merge remote-tracking branch 'origin/master'

This commit is contained in:
Karlatemp 2020-09-20 13:56:52 +08:00
commit 46ec2460b3
No known key found for this signature in database
GPG Key ID: 21FBDDF664FF06F8

View File

@ -12,6 +12,8 @@
* @author Karlatemp <karlatemp@vip.qq.com> <https://github.com/Karlatemp> * @author Karlatemp <karlatemp@vip.qq.com> <https://github.com/Karlatemp>
*/ */
@file:Suppress("unused")
package net.mamoe.mirai.console.util package net.mamoe.mirai.console.util
import kotlinx.serialization.KSerializer import kotlinx.serialization.KSerializer
@ -21,20 +23,14 @@ import kotlinx.serialization.builtins.serializer
import net.mamoe.mirai.console.internal.data.map import net.mamoe.mirai.console.internal.data.map
import net.mamoe.mirai.console.internal.util.SemVersionInternal import net.mamoe.mirai.console.internal.util.SemVersionInternal
import net.mamoe.mirai.console.util.SemVersion.Companion.equals import net.mamoe.mirai.console.util.SemVersion.Companion.equals
import net.mamoe.mirai.console.util.SemVersion.RangeRequirement
/** /**
* 语义化版本支持 * [语义化版本](https://semver.org/lang/zh-CN/) 支持
* *
* 在阅读此文件前, 请先阅读 https://semver.org/lang/zh-CN/ * 解析示例:
* 该文档说明了语义化版本是什么, 此文件不再过多描述
* *
* ---- * `1.0.0-M4+c25733b8` 将会解析出三个内容, mainVersion (核心版本号), [identifier] (先行版本号) [metadata] (元数据).
*
* 这是一个例子 `1.0.0-M4+c25733b8`
*
* 将会解析出三个内容, mainVersion(核心版本号), identifier(先行版本号) metadata(元数据).
*
* 对这个例子进行解析会得到
* ``` * ```
* SemVersion( * SemVersion(
* mainVersion = IntArray [1, 0, 0], * mainVersion = IntArray [1, 0, 0],
@ -43,9 +39,10 @@ import net.mamoe.mirai.console.util.SemVersion.Companion.equals
* ) * )
* ``` * ```
* 其中 identifier metadata 都是可选的. * 其中 identifier metadata 都是可选的.
* 对于核心版本号, 此实现稍微比 semver 宽松一些, 允许 x.y 的存在.
* 但是不允许 0.0.0.0 之类的存在
* *
* 对于核心版本号, 此实现稍微比 semver 宽松一些, 允许 x.y 的存在.
*
* @see RangeRequirement
*/ */
@Serializable(with = SemVersion.SemVersionAsStringSerializer::class) @Serializable(with = SemVersion.SemVersionAsStringSerializer::class)
public data class SemVersion internal constructor( public data class SemVersion internal constructor(
@ -83,7 +80,7 @@ public data class SemVersion internal constructor(
* 解析一个版本号, 将会返回一个 [SemVersion], * 解析一个版本号, 将会返回一个 [SemVersion],
* 如果发生解析错误将会抛出一个 [IllegalArgumentException] 或者 [NumberFormatException] * 如果发生解析错误将会抛出一个 [IllegalArgumentException] 或者 [NumberFormatException]
* *
* 对于版本号的组成, 我们有以下规定: * 对于版本号的组成, 有以下规定:
* - 必须包含主版本号和次版本号 * - 必须包含主版本号和次版本号
* - 存在 先行版本号 的时候 先行版本号 不能为空 * - 存在 先行版本号 的时候 先行版本号 不能为空
* - 存在 元数据 的时候 元数据 不能为空 * - 存在 元数据 的时候 元数据 不能为空
@ -104,7 +101,7 @@ public data class SemVersion internal constructor(
if (!SEM_VERSION_REGEX.matches(version)) { if (!SEM_VERSION_REGEX.matches(version)) {
throw IllegalArgumentException("`$version` not a valid version") throw IllegalArgumentException("`$version` not a valid version")
} }
var mainVersionEnd: Int = 0 var mainVersionEnd = 0
kotlin.run { kotlin.run {
val iterator = version.iterator() val iterator = version.iterator()
while (iterator.hasNext()) { while (iterator.hasNext()) {
@ -154,7 +151,7 @@ public data class SemVersion internal constructor(
* - `< 1.0.0-RC` 要求 1.0.0-RC 之前的版本, 不能是 1.0.0-RC * - `< 1.0.0-RC` 要求 1.0.0-RC 之前的版本, 不能是 1.0.0-RC
* - `<= 1.0.0-RC` 要求 1.0.0-RC 或之前的版本, 可以是 1.0.0-RC * - `<= 1.0.0-RC` 要求 1.0.0-RC 或之前的版本, 可以是 1.0.0-RC
* *
* 对于多个规则, 也允许使用 `||` 拼接在一起. * 对于多个规则, 也允许使用 `||` 拼接.
* 例如: * 例如:
* - `1.x || 2.x || 3.0.0` * - `1.x || 2.x || 3.0.0`
* - `<= 0.5.3 || >= 1.0.0` * - `<= 0.5.3 || >= 1.0.0`
@ -191,23 +188,22 @@ public data class SemVersion internal constructor(
} }
@Transient @Transient
private var toString: String? = null // For cache. private val toString: String by lazy(LazyThreadSafetyMode.NONE) {
override fun toString(): String { buildString {
return toString ?: kotlin.run { mainVersion.joinTo(this, ".")
buildString { identifier?.let { identifier ->
mainVersion.joinTo(this, ".") append('-')
identifier?.let { identifier -> append(identifier)
append('-') }
append(identifier) metadata?.let { metadata ->
} append('+')
metadata?.let { metadata -> append(metadata)
append('+') }
append(metadata)
}
}.also { toString = it }
} }
} }
override fun toString(): String = toString
/** /**
* [SemVersion] 转为 Kotlin data class 风格的 [String] * [SemVersion] 转为 Kotlin data class 风格的 [String]
*/ */