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