@@ -11,23 +11,45 @@ import (
1111)
1212
1313type Semver struct {
14- Major string
15- Minor string
16- Patch string
17- Other string
14+ Major string
15+ Minor string
16+ Patch string
17+ Prerelease string
1818}
1919
2020func NewVersion (in string ) Semver {
21+ s := Semver {}
22+
23+ if strings .Contains (in , "+" ) {
24+ panic ("this library does not support build numbers '" + in + "'" )
25+ }
26+
27+ if strings .Contains (in , ".JENKINS" ) {
28+ in = strings .ReplaceAll (in , ".JENKINS" , "-JENKINS" )
29+ }
30+
31+ if strings .Contains (in , "-" ) {
32+ parts := strings .SplitN (in , "-" , 2 )
33+ s .Prerelease = parts [1 ]
34+ // parse the first part
35+ in = parts [0 ]
36+ }
37+
2138 parts := strings .Split (in , "." )
2239 if len (parts ) == 1 {
23- return Semver { Major : parts [0 ]}
40+ s . Major = parts [0 ]
2441 } else if len (parts ) == 2 {
25- return Semver {Major : parts [0 ], Minor : parts [1 ]}
42+ s .Major = parts [0 ]
43+ s .Minor = parts [1 ]
2644 } else if len (parts ) == 3 {
27- return Semver {Major : parts [0 ], Minor : parts [1 ], Patch : parts [2 ]}
45+ s .Major = parts [0 ]
46+ s .Minor = parts [1 ]
47+ s .Patch = parts [2 ]
2848 } else {
29- return Semver { Major : parts [ 0 ], Minor : parts [ 1 ], Patch : parts [ 2 ], Other : parts [ 3 ]}
49+ panic ( "invalid number of parts '" + in + "'" )
3050 }
51+
52+ return s
3153}
3254
3355func toInt (in string ) (int , error ) {
@@ -46,18 +68,18 @@ func (v *Semver) String() string {
4668 return v .Major
4769 } else if v .Patch == "" {
4870 return fmt .Sprintf ("%s.%s" , v .Major , v .Minor )
49- } else if v .Other == "" {
71+ } else if v .Prerelease == "" {
5072 return fmt .Sprintf ("%s.%s.%s" , v .Major , v .Minor , v .Patch )
5173 } else {
52- return fmt .Sprintf ("%s.%s.%s. %s" , v .Major , v .Minor , v .Patch , v .Other )
74+ return fmt .Sprintf ("%s.%s.%s- %s" , v .Major , v .Minor , v .Patch , v .Prerelease )
5375 }
5476}
5577
5678func (v Semver ) LessThan (o Semver ) bool {
5779 if v .Major != o .Major {
5880 val , err := v .lessThan (v .Major , o .Major )
5981 if err != nil {
60- logrus .Warnf ("unable to compare '%s' & '%s'" , v .String (), o .String ())
82+ logrus .Warnf ("unable to compare '%s' & '%s' - %s " , v .String (), o .String (), err )
6183 return false
6284 }
6385 return val
@@ -66,7 +88,7 @@ func (v Semver) LessThan(o Semver) bool {
6688 if v .Minor != o .Minor {
6789 val , err := v .lessThan (v .Minor , o .Minor )
6890 if err != nil {
69- logrus .Warnf ("unable to compare '%s' & '%s'" , v .String (), o .String ())
91+ logrus .Warnf ("unable to compare '%s' & '%s' - %s " , v .String (), o .String (), err )
7092 return false
7193 }
7294 return val
@@ -75,13 +97,25 @@ func (v Semver) LessThan(o Semver) bool {
7597 if v .Patch != o .Patch {
7698 val , err := v .lessThan (v .Patch , o .Patch )
7799 if err != nil {
78- logrus .Warnf ("unable to compare '%s' & '%s'" , v .String (), o .String ())
100+ logrus .Warnf ("unable to compare '%s' & '%s' - %s " , v .String (), o .String (), err )
79101 return false
80102 }
81103 return val
82104 }
83105
84- return strings .Compare (v .Other , o .Other ) < 0
106+ if v .Prerelease == o .Prerelease {
107+ return false
108+ }
109+
110+ if v .Prerelease == "" {
111+ return false
112+ }
113+
114+ if o .Prerelease == "" {
115+ return true
116+ }
117+
118+ return strings .Compare (v .Prerelease , o .Prerelease ) < 0
85119}
86120
87121func (v Semver ) lessThan (v1 string , v2 string ) (bool , error ) {
0 commit comments