aboutsummaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-09-20 09:56:32 +0200
committerMartin Polden <mpolden@mpolden.no>2021-09-20 14:35:29 +0200
commit0c9276b0935dbaa2979b75ecc53a6f1d54e0b27d (patch)
tree7d6d9cd473714e06853df2bb83e4206f8047005c /client
parentc561c995b715c73e83c90b66904a2de70c737c71 (diff)
Support version labels
Diffstat (limited to 'client')
-rw-r--r--client/go/version/version.go37
-rw-r--r--client/go/version/version_test.go13
2 files changed, 44 insertions, 6 deletions
diff --git a/client/go/version/version.go b/client/go/version/version.go
index e0dc8bf39ae..27b7da1d0f5 100644
--- a/client/go/version/version.go
+++ b/client/go/version/version.go
@@ -11,9 +11,22 @@ type Version struct {
Major int
Minor int
Patch int
+ Label string
}
-func (v Version) String() string { return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch) }
+func (v Version) String() string {
+ var sb strings.Builder
+ sb.WriteString(strconv.Itoa(v.Major))
+ sb.WriteRune('.')
+ sb.WriteString(strconv.Itoa(v.Minor))
+ sb.WriteRune('.')
+ sb.WriteString(strconv.Itoa(v.Patch))
+ if v.Label != "" {
+ sb.WriteRune('-')
+ sb.WriteString(v.Label)
+ }
+ return sb.String()
+}
// Compare returns a positive integer if v1 is greater than v2, a negative integer if v1 is less than v2 and zero if they
// are equal.
@@ -30,6 +43,19 @@ func (v1 Version) Compare(v2 Version) int {
if result != 0 {
return result
}
+ // Version without label always sorts first
+ if v1.Label == "" && v2.Label != "" {
+ return 1
+ }
+ if v1.Label != "" && v2.Label == "" {
+ return -1
+ }
+ if v1.Label > v2.Label {
+ return 1
+ }
+ if v1.Label < v2.Label {
+ return -1
+ }
return 0
}
@@ -53,9 +79,14 @@ func Parse(s string) (Version, error) {
if err != nil {
return Version{}, fmt.Errorf("invalid minor version: %s", parts[1])
}
- patch, err := strconv.Atoi(parts[2])
+ parts2 := strings.SplitN(parts[2], "-", 2)
+ patch, err := strconv.Atoi(parts2[0])
if err != nil {
return Version{}, fmt.Errorf("invalid patch version: %s", parts[2])
}
- return Version{Major: major, Minor: minor, Patch: patch}, nil
+ v := Version{Major: major, Minor: minor, Patch: patch}
+ if len(parts2) > 1 {
+ v.Label = parts2[1]
+ }
+ return v, nil
}
diff --git a/client/go/version/version_test.go b/client/go/version/version_test.go
index 6cfb82ed802..3602715cca8 100644
--- a/client/go/version/version_test.go
+++ b/client/go/version/version_test.go
@@ -11,9 +11,6 @@ func TestParse(t *testing.T) {
_, err := Parse("foo")
assert.NotNil(t, err)
- _, err = Parse("1.2.3-foo") // Labels are unsupported
- assert.NotNil(t, err)
-
v, err := Parse("1.2.3")
assert.Nil(t, err)
assert.Equal(t, "1.2.3", v.String())
@@ -21,6 +18,10 @@ func TestParse(t *testing.T) {
v, err = Parse("v4.5.6")
assert.Nil(t, err)
assert.Equal(t, "4.5.6", v.String())
+
+ v, err = Parse("1.2.3-foo")
+ assert.Nil(t, err)
+ assert.Equal(t, "1.2.3-foo", v.String())
}
func TestCompare(t *testing.T) {
@@ -38,6 +39,12 @@ func TestCompare(t *testing.T) {
assertComparison(t, "2.0.0", '>', "1.2.3")
assertComparison(t, "1.2.3", '<', "2.0.0")
+
+ assertComparison(t, "1.2.3-alpha1", '<', "1.2.3")
+ assertComparison(t, "1.2.3", '>', "1.2.3-alpha1")
+ assertComparison(t, "1.2.3-alpha1", '=', "1.2.3-alpha1")
+ assertComparison(t, "1.2.3-alpha1", '<', "1.2.3-alpha2")
+ assertComparison(t, "1.2.3-alpha2", '>', "1.2.3-alpha1")
}
func assertComparison(t *testing.T, s1 string, cmp rune, s2 string) {