-
Notifications
You must be signed in to change notification settings - Fork 0
/
checker.go
89 lines (75 loc) · 2.07 KB
/
checker.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
package version
import (
"github.com/hashicorp/go-version"
"sort"
"strings"
)
type PinMode int
const (
PIN_NONE PinMode = iota
PIN_MAJOR
PIN_MINOR
)
type Checker struct {
}
func NewChecker() (*Checker, error) {
return &Checker{}, nil
}
func (c *Checker) GetDifference(current string, available []string, pinMode PinMode) (major, minor, patch int64, err error) {
currentParsed, err := version.NewSemver(current)
if err != nil {
return
}
versions := make([]*version.Version, 0, len(available))
for _, v := range available {
// If it doesn't start with a v and doesn't contain a dot, then it's most likely not a semver
if !strings.HasPrefix(v, "v") && !strings.Contains(v, ".") {
continue
}
parsedVersion, err := version.NewSemver(v)
// Skip non-semver versions
if err != nil {
continue
}
// Skip prereleases
if parsedVersion.Prerelease() != "" {
continue
}
// Skip all older version
if parsedVersion.LessThanOrEqual(currentParsed) {
continue
}
// Filter all major versions that are not equal to the current major version
if pinMode == PIN_MAJOR && parsedVersion.Segments()[0] != currentParsed.Segments()[0] {
continue
}
// Filter all minor and major version that don't match the current version
if pinMode == PIN_MINOR && (parsedVersion.Segments()[0] != currentParsed.Segments()[0] || parsedVersion.Segments()[1] != currentParsed.Segments()[1]) {
continue
}
versions = append(versions, parsedVersion)
}
if len(versions) == 0 {
return
}
sort.Sort(version.Collection(versions))
latestVersion := versions[len(versions)-1]
latestSegments := latestVersion.Segments64()
currentSegments := currentParsed.Segments64()
if latestSegments[0] > currentSegments[0] {
major = latestSegments[0] - currentSegments[0]
minor = latestSegments[1]
patch = latestSegments[1]
return
}
if latestSegments[1] > currentSegments[1] {
minor = latestSegments[1] - currentSegments[1]
patch = latestSegments[2]
return
}
if latestSegments[2] > currentSegments[2] {
patch = latestSegments[2] - currentSegments[2]
return
}
return
}