This repository was archived by the owner on Feb 19, 2021. It is now read-only.
forked from concourse/github-release-resource
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcheck_command.go
More file actions
107 lines (84 loc) · 2.16 KB
/
check_command.go
File metadata and controls
107 lines (84 loc) · 2.16 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package resource
import (
"sort"
"github.com/cppforlife/go-semi-semantic/version"
"github.com/xanzy/go-gitlab"
)
type CheckCommand struct {
gitlab GitLab
}
func NewCheckCommand(gitlab GitLab) *CheckCommand {
return &CheckCommand{
gitlab: gitlab,
}
}
func (c *CheckCommand) Run(request CheckRequest) ([]Version, error) {
var tags []*gitlab.Tag
var err error
if (request.Version == Version{}) {
tags, err = c.gitlab.ListTags()
} else {
tags, err = c.gitlab.ListTagsUntil(request.Version.Tag)
}
if err != nil {
return []Version{}, err
}
if len(tags) == 0 {
return []Version{}, nil
}
var filteredTags []*gitlab.Tag
// TODO: make ListTagsUntil work better with this
versionParser, err := newVersionParser(request.Source.TagFilter)
if err != nil {
return []Version{}, err
}
for _, tag := range tags {
if _, err := version.NewVersionFromString(versionParser.parse(tag.Name)); err != nil {
continue
}
if tag.Release == nil {
continue
}
filteredTags = append(filteredTags, tag)
}
sort.Slice(filteredTags, func(i, j int) bool {
first, err := version.NewVersionFromString(versionParser.parse(filteredTags[i].Name))
if err != nil {
return true
}
second, err := version.NewVersionFromString(versionParser.parse(filteredTags[j].Name))
if err != nil {
return false
}
return first.IsLt(second)
})
if len(filteredTags) == 0 {
return []Version{}, nil
}
latestTag := filteredTags[len(filteredTags)-1]
if (request.Version == Version{}) {
return []Version{versionFromTag(latestTag)}, nil
}
if latestTag.Name == request.Version.Tag {
return []Version{versionFromTag(latestTag)}, nil
}
upToLatest := false
nextVersions := []Version{} // contains the requested version and all newer ones
for _, release := range filteredTags {
if !upToLatest {
version := release.Name
upToLatest = request.Version.Tag == version
}
if upToLatest {
nextVersions = append(nextVersions, Version{Tag: release.Name})
}
}
if !upToLatest {
// current version was removed; start over from latest
nextVersions = append(
nextVersions,
versionFromTag(filteredTags[len(filteredTags)-1]),
)
}
return nextVersions, nil
}