Files
nebula/pkg/util/version.go
2026-03-10 16:26:48 +08:00

111 lines
2.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package util
import (
"strconv"
"strings"
)
// CompareVersion 比较两个语义化版本号
// 返回值1 表示 v1 > v2-1 表示 v1 < v20 表示 v1 == v2
// 支持格式1.0.0, v1.0.0, 1.0.0-beta.1, 1.0.0+build.123
func CompareVersion(v1, v2 string) int {
// 移除 v 前缀
v1 = strings.TrimPrefix(v1, "v")
v2 = strings.TrimPrefix(v2, "v")
// 分离主版本号和预发布/构建元数据
v1Main, v1Pre := splitVersion(v1)
v2Main, v2Pre := splitVersion(v2)
// 比较主版本号
result := compareMainVersion(v1Main, v2Main)
if result != 0 {
return result
}
// 主版本号相同,比较预发布版本
return comparePreRelease(v1Pre, v2Pre)
}
// splitVersion 分离主版本号和预发布标识
func splitVersion(version string) (main, preRelease string) {
// 移除构建元数据 (+build.xxx)
if idx := strings.Index(version, "+"); idx != -1 {
version = version[:idx]
}
// 分离预发布标识 (-beta.1)
if idx := strings.Index(version, "-"); idx != -1 {
return version[:idx], version[idx+1:]
}
return version, ""
}
// compareMainVersion 比较主版本号 (major.minor.patch)
func compareMainVersion(v1, v2 string) int {
parts1 := strings.Split(v1, ".")
parts2 := strings.Split(v2, ".")
// 补齐到相同长度
maxLen := len(parts1)
if len(parts2) > maxLen {
maxLen = len(parts2)
}
for i := 0; i < maxLen; i++ {
var num1, num2 int
if i < len(parts1) {
num1, _ = strconv.Atoi(parts1[i])
}
if i < len(parts2) {
num2, _ = strconv.Atoi(parts2[i])
}
if num1 > num2 {
return 1
}
if num1 < num2 {
return -1
}
}
return 0
}
// comparePreRelease 比较预发布版本
// 没有预发布标识的版本 > 有预发布标识的版本
// 例如1.0.0 > 1.0.0-beta
func comparePreRelease(pre1, pre2 string) int {
// 都没有预发布标识,相等
if pre1 == "" && pre2 == "" {
return 0
}
// v1 是正式版v2 是预发布版
if pre1 == "" && pre2 != "" {
return 1
}
// v1 是预发布版v2 是正式版
if pre1 != "" && pre2 == "" {
return -1
}
// 都是预发布版,按字典序比较
if pre1 < pre2 {
return -1
}
if pre1 > pre2 {
return 1
}
return 0
}
// IsNewerVersion 检查 newVer 是否比 currentVer 新
func IsNewerVersion(currentVer, newVer string) bool {
return CompareVersion(newVer, currentVer) > 0
}