diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-09-20 09:56:32 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-09-20 14:35:29 +0200 |
commit | 0c9276b0935dbaa2979b75ecc53a6f1d54e0b27d (patch) | |
tree | 7d6d9cd473714e06853df2bb83e4206f8047005c /client | |
parent | c561c995b715c73e83c90b66904a2de70c737c71 (diff) |
Support version labels
Diffstat (limited to 'client')
-rw-r--r-- | client/go/version/version.go | 37 | ||||
-rw-r--r-- | client/go/version/version_test.go | 13 |
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) { |