func Parse()

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
}