1
0
Fork 0
mirror of https://codeberg.org/forgejo/forgejo.git synced 2024-11-29 09:31:11 -05:00
forgejo/vendor/github.com/mcuadros/go-version/normalize.go
2016-11-04 08:43:11 +01:00

116 lines
2.5 KiB
Go

package version
import (
"regexp"
"strings"
)
var modifierRegex = `[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)(?:[.-]?(\d+))?)?([.-]?dev)?`
var regexpMasterLikeBranches = regexp.MustCompile(`^(?:dev-)?(?:master|trunk|default)$`)
var regexpBranchNormalize = regexp.MustCompile(`(?i)^v?(\d+)(\.(?:\d+|[x*]))?(\.(?:\d+|[x*]))?(\.(?:\d+|[x*]))?$`)
// Normalizes a version string to be able to perform comparisons on it
//
// Example:
// version.Normalize("10.4.13-b")
// Returns: 10.4.13.0-beta
//
func Normalize(version string) string {
// ignore aliases and just assume the alias is required instead of the source
result := RegFind(`^([^,\s]+) +as +([^,\s]+)$`, version)
if result != nil {
version = result[1]
}
// match master-like branches
if regexpMasterLikeBranches.MatchString(strings.ToLower(version)) {
return "9999999-dev"
}
if strings.HasPrefix(strings.ToLower(version), "dev-") {
return "dev-" + version[4:len(version)]
}
index := 0
// match classical versioning
result = RegFind(`(?i)^v?(\d{1,3})(\.\d+)?(\.\d+)?(\.\d+)?`+modifierRegex+`$`, version)
if result != nil {
version = ""
for _, val := range result[1:5] {
if val != "" {
version = version + val
} else {
version = version + ".0"
}
}
index = 5
} else {
// match date-based versioning
result = RegFind(`(?i)^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3})?)`+modifierRegex+`$`, version)
if result != nil {
version = regexp.MustCompile(`\D`).ReplaceAllString(result[1], "-")
index = 2
}
}
if index != 0 {
if result[index] != "" {
if result[index] == "stable" {
return version
}
version = version + "-" + expandStability(result[index])
if result[index+1] != "" {
version = version + result[index+1]
}
}
if result[index+2] != "" {
version = version + "-dev"
}
return version
}
result = RegFind(`(?i)(.*?)[.-]?dev$`, version)
if result != nil {
return normalizeBranch(result[1])
}
return version
}
func normalizeBranch(name string) string {
name = strings.Trim(name, " ")
if name == "master" || name == "trunk" || name == "default" {
return Normalize(name)
}
replace := strings.NewReplacer("*", "9999999", "x", "9999999")
matched := regexpBranchNormalize.FindAllStringSubmatch(name, -1)
if matched != nil {
name = ""
for _, val := range matched[0][1:5] {
if val != "" {
name = name + replace.Replace(val)
} else {
name = name + ".9999999"
}
}
return name + "-dev"
}
if strings.HasSuffix(strings.ToLower(name), "-dev") {
return name
}
return "dev-" + name
}