-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathreleases.go
93 lines (76 loc) · 2.12 KB
/
releases.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package changelog
import (
"fmt"
"regexp"
"time"
"github.com/pkg/errors"
"golang.org/x/mod/semver"
)
// Releases is a slice of releases
type Releases []*Release
// Len return a total amount of Releases.
func (r Releases) Len() int {
return len(r)
}
// Less compares versions of two releases.
func (r Releases) Less(i, j int) bool {
return semver.Compare(fmt.Sprintf("v%v", *r[i].Version), fmt.Sprintf("v%v", *r[j].Version)) == -1
}
// Swap replaces positions of two releases.
func (r Releases) Swap(i, j int) {
r[i], r[j] = r[j], r[i]
}
// GetRelease returns a release for a provided version.
func (r Releases) GetRelease(version string) *Release {
for _, release := range r {
if *release.Version == version {
return release
}
}
return nil
}
// CreateRelease creates new empty release.
func (r *Releases) CreateRelease(version, date string) (*Release, error) {
for _, e := range *r {
if *e.Version == version {
return nil, errors.New(fmt.Sprintf("version %v already exists", version))
}
}
var d *time.Time
dateMatcher := regexp.MustCompile(DateRegex)
if dateMatcher.MatchString(date) {
d = parseDate(date)
if d == nil {
return nil, errors.New(fmt.Sprintf("invalid date %v, expected format %v", date, DateFormat))
}
} else {
return nil, errors.New(fmt.Sprintf("invalid date %v, expected to match regex %v", date, DateRegex))
}
var v string
versionMatcher := regexp.MustCompile(SemVerRegex)
if versionMatcher.MatchString(version) {
v = version
} else {
return nil, errors.New(fmt.Sprintf("invalid semantic version %v, expected to match regex %v", version, SemVerRegex))
}
release := &Release{
Changes: &Changes{},
Date: d,
Version: &v,
}
*r = append(*r, release)
return release, nil
}
// CreateReleaseWithURL creates new empty release.
//
// Identical to CreateRelease but with an extra step of adding a URL to the release.
func (r *Releases) CreateReleaseWithURL(version, date, url string) (*Release, error) {
release, err := r.CreateRelease(version, date)
if err != nil {
return release, err
}
if err := release.SetURL(url); err != nil {
return nil, err
}
return release, nil
}