Skip to content

Commit 37e2a8d

Browse files
committed
chore: handling empty prerelease parameter
1 parent 75c6a96 commit 37e2a8d

2 files changed

Lines changed: 50 additions & 16 deletions

File tree

pkg/version/semver.go

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,45 @@ import (
1111
)
1212

1313
type 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

2020
func 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

3355
func 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

5678
func (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

87121
func (v Semver) lessThan(v1 string, v2 string) (bool, error) {

pkg/version/semver_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func TestSemVer(t *testing.T) {
1818
{v1: "1.0.0", v2: "2.0.0", lessThan: true},
1919
{v1: "1.0.0", v2: "1.1.0", lessThan: true},
2020
{v1: "1.0.0", v2: "1.0.1", lessThan: true},
21-
{v1: "1.0.0.A", v2: "1.0.0.B", lessThan: true},
21+
{v1: "1.0.0-A", v2: "1.0.0-B", lessThan: true},
2222
{v1: "2.0-alpha-1", v2: "2.5", lessThan: true},
2323
{v1: "2.5", v2: "2.0-alpha-1", lessThan: false},
2424
{v1: "2.5", v2: "2.0-alpha-2", lessThan: false},
@@ -52,7 +52,7 @@ func TestSemVer(t *testing.T) {
5252
{v1: "2.0-alpha-4", v2: "2.0-beta-1", lessThan: true},
5353
{v1: "2.4", v2: "2.0-beta-1", lessThan: false},
5454
{v1: "1.518.JENKINS-14362-jzlib", v2: "1.518", lessThan: true},
55-
{v1: "1.518", v2: "1.518.JENKINS-14362-jzlib", lessThan: true},
55+
{v1: "1.518", v2: "1.518.JENKINS-14362-jzlib", lessThan: false},
5656
{v1: "1.513.JENKINS-14362-jzlib", v2: "1.513", lessThan: true},
5757
{v1: "1.516.JENKINS-14362-jzlib", v2: "1.516", lessThan: true},
5858
}

0 commit comments

Comments
 (0)