123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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
- }
|