mirror of https://github.com/gogits/gogs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
2.5 KiB
116 lines
2.5 KiB
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 |
|
}
|
|
|