1
1
package main
2
2
3
3
import (
4
- "fmt"
4
+ "regexp"
5
+ "strconv"
5
6
"strings"
6
7
)
7
8
9
+ var versionRe = regexp .MustCompile (`((\w+)-)?v?(\d|x).(\d|x).(\d|x)(-(\w+))?` )
10
+
8
11
type tag struct {
9
12
Project string
10
13
Major int
11
14
Minor int
12
15
Patch int
16
+ Suffix string
13
17
}
14
18
15
19
func newTag (name string ) * tag {
16
- var (
17
- t tag
20
+ var ms = versionRe .FindStringSubmatch (name )
18
21
19
- version = name
20
- )
22
+ if len (ms ) != 8 {
23
+ return nil
24
+ }
21
25
22
- if splittedTagName := strings .Split (name , "-" ); len (splittedTagName ) > 1 {
23
- t .Project = strings .Join (splittedTagName [:len (splittedTagName )- 1 ], "-" )
24
- version = splittedTagName [len (splittedTagName )- 1 ]
26
+ return & tag {
27
+ Project : ms [2 ],
28
+ Major : parseVersionNumber (ms [3 ]),
29
+ Minor : parseVersionNumber (ms [4 ]),
30
+ Patch : parseVersionNumber (ms [5 ]),
31
+ Suffix : ms [7 ],
25
32
}
33
+ }
26
34
27
- if n , err := fmt .Sscanf (
28
- strings .TrimPrefix (version , "v" ),
29
- "%d.%d.%d" ,
30
- & t .Major ,
31
- & t .Minor ,
32
- & t .Patch ,
33
- ); n != 3 || err != nil {
34
- return nil
35
+ func parseVersionNumber (sv string ) int {
36
+ if v , err := strconv .Atoi (sv ); err == nil {
37
+ return v
35
38
}
36
39
37
- return & t
40
+ return - 1
38
41
}
39
42
40
43
func (t1 * tag ) Less (t2 * tag ) bool {
41
44
if t1 .Project != t2 .Project {
42
- return false
45
+ return strings .Compare (t1 .Project , t2 .Project ) < 0
46
+ }
47
+
48
+ if t1 .Major != t2 .Major {
49
+ return t1 .Major < t2 .Major
50
+ }
51
+
52
+ if t1 .Minor != t2 .Minor {
53
+ return t1 .Minor < t2 .Minor
54
+ }
55
+
56
+ if t1 .Patch != t2 .Patch {
57
+ return t1 .Patch < t2 .Patch
58
+ }
59
+
60
+ if t1 .Suffix == "" || t2 .Suffix == "" {
61
+ return t2 .Suffix == ""
43
62
}
44
63
45
- return t1 .Major < t2 .Major ||
46
- (t1 .Major == t2 .Major && t1 .Minor < t2 .Minor ) ||
47
- (t1 .Major == t2 .Major && t1 .Minor == t2 .Minor && t1 .Patch < t2 .Patch )
64
+ return strings .Compare (t1 .Suffix , t2 .Suffix ) < 0
48
65
}
49
66
50
67
func filterReleases (rs releases , scheme string ) releases {
@@ -65,7 +82,8 @@ func filterReleases(rs releases, scheme string) releases {
65
82
if r .Project == schemeTag .Project &&
66
83
(schemeTag .Major == - 1 || schemeTag .Major == r .Major ) &&
67
84
(schemeTag .Minor == - 1 || schemeTag .Minor == r .Minor ) &&
68
- (schemeTag .Patch == - 1 || schemeTag .Patch == r .Patch ) {
85
+ (schemeTag .Patch == - 1 || schemeTag .Patch == r .Patch ) &&
86
+ (schemeTag .Suffix == "*" || schemeTag .Suffix == r .Suffix ) {
69
87
filteredReleases = append (filteredReleases , release )
70
88
}
71
89
}
0 commit comments