in versions/versions.go [36:84]
func Parse(fork, version string) (*Info, error) {
vi := &Info{Fork: fork, Value: version, IsFork: isFork(fork)}
if m := releasePattern.FindStringSubmatch(version); m != nil {
vi.IsRelease = true
if m[2] == "x" {
track, err := strconv.Atoi(m[1])
if err != nil {
return nil, fmt.Errorf("invalid version %q, expected something like '5.2.1' or '5.x'", version)
}
vi.IsRelative = true
vi.TrackRestriction = track
}
} else if patchPattern.MatchString(version) {
vi.IsRelease = true
} else if m := latestReleasePattern.FindStringSubmatch(version); m != nil {
vi.IsRelease = true
vi.IsRelative = true
if m[1] != "" {
offset, err := strconv.Atoi(m[1])
if err != nil {
return nil, fmt.Errorf("invalid version \"%s\", could not parse offset: %v", version, err)
}
vi.LatestOffset = offset
}
} else if candidatePattern.MatchString(version) {
vi.IsCandidate = true
} else if version == "last_rc" {
vi.IsCandidate = true
vi.IsRelative = true
} else if commitPattern.MatchString(version) {
vi.IsCommit = true
} else if version == "last_green" {
vi.IsCommit = true
vi.IsRelative = true
} else if version == "last_downstream_green" {
vi.IsCommit = true
vi.IsRelative = true
vi.IsDownstream = true
} else if rollingPattern.MatchString(version) {
vi.IsRolling = true
} else if version == "rolling" {
vi.IsRolling = true
vi.IsRelative = true
} else {
return nil, fmt.Errorf("Invalid version '%s'", version)
}
return vi, nil
}