| package cmd |
| |
| import ( |
| "errors" |
| "regexp" |
| "sort" |
| |
| "github.com/Masterminds/vcs" |
| "github.com/hashicorp/go-version" |
| ) |
| |
| // The SemVer handling by github.com/hashicorp/go-version provides the ability |
| // to work with versions |
| |
| // The compiled regular expression used to test the validity of a version. |
| var versionRegexp *regexp.Regexp |
| |
| const versionRegexpRaw string = `v?(([0-9]+(\.[0-9]+){0,2})` + |
| `(-([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?` + |
| `(\+([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*))?)` + |
| `?` |
| |
| func init() { |
| versionRegexp = regexp.MustCompile("^" + versionRegexpRaw + "$") |
| } |
| |
| // Filter the leading v from the version. Returns an error if there |
| // was an issue including if the version was not SemVer |
| // returns: |
| // - the semantic verions (stripping any leading v if present) |
| // - error if there was one |
| func filterVersion(v string) (string, error) { |
| matches := versionRegexp.FindStringSubmatch(v) |
| if matches == nil || matches[1] == "" { |
| return "", errors.New("No SemVer found.") |
| } |
| return matches[1], nil |
| } |
| |
| // Filter a list of versions to only included semantic versions. The response |
| // is a mapping of the original version to the semantic version. |
| func getSemVers(refs []string) map[string]string { |
| sv := map[string]string{} |
| for _, r := range refs { |
| nv, err := filterVersion(r) |
| if err == nil { |
| sv[nv] = r |
| } |
| } |
| |
| return sv |
| } |
| |
| // Get all the references for a repo. This includes the tags and branches. |
| func getAllVcsRefs(repo vcs.Repo) ([]string, error) { |
| tags, err := repo.Tags() |
| if err != nil { |
| return []string{}, err |
| } |
| |
| branches, err := repo.Branches() |
| if err != nil { |
| return []string{}, err |
| } |
| |
| return append(branches, tags...), nil |
| } |
| |
| func isBranch(branch string, repo vcs.Repo) (bool, error) { |
| branches, err := repo.Branches() |
| if err != nil { |
| return false, err |
| } |
| for _, b := range branches { |
| if b == branch { |
| return true, nil |
| } |
| } |
| return false, nil |
| } |
| |
| func getSortedSemVerList(v []string) []*version.Version { |
| versions := make([]*version.Version, len(v)) |
| for i, raw := range v { |
| v, err := version.NewVersion(raw) |
| if err == nil { |
| versions[i] = v |
| } |
| } |
| |
| sort.Sort(sort.Reverse(version.Collection(versions))) |
| return versions |
| } |