Skip to content

Commit 8c60af8

Browse files
authored
remove semver (#1028)
* update semver to semver/v3 * remove semver * wildcard behavior, extend tests * feedback
1 parent 8f53f5c commit 8c60af8

File tree

4 files changed

+54
-15
lines changed

4 files changed

+54
-15
lines changed

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ toolchain go1.24.2
77
require (
88
filippo.io/edwards25519 v1.1.0
99
github.com/BurntSushi/toml v1.3.2
10-
github.com/Masterminds/semver v1.5.0
1110
github.com/go-sql-driver/mysql v1.7.1
1211
github.com/goccy/go-json v0.10.2
1312
github.com/google/uuid v1.3.0

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
22
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
33
github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
44
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
5-
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
6-
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
75
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
86
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
97
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

mysql/util.go

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package mysql
22

33
import (
44
"bytes"
5+
"cmp"
56
"compress/zlib"
67
"crypto/rand"
78
"crypto/rsa"
@@ -13,11 +14,11 @@ import (
1314
"io"
1415
mrand "math/rand"
1516
"runtime"
17+
"strconv"
1618
"strings"
1719
"time"
1820

1921
"filippo.io/edwards25519"
20-
"github.com/Masterminds/semver"
2122
"github.com/go-mysql-org/go-mysql/utils"
2223
"github.com/pingcap/errors"
2324
)
@@ -452,21 +453,46 @@ func ErrorEqual(err1, err2 error) bool {
452453
return e1.Error() == e2.Error()
453454
}
454455

456+
func compareSubVersion(typ, a, b, aFull, bFull string) (int, error) {
457+
if a == "" || b == "" {
458+
return 0, nil
459+
}
460+
461+
var aNum, bNum int
462+
var err error
463+
464+
if aNum, err = strconv.Atoi(a); err != nil {
465+
return 0, fmt.Errorf("cannot parse %s version %s of %s", typ, a, aFull)
466+
}
467+
if bNum, err = strconv.Atoi(b); err != nil {
468+
return 0, fmt.Errorf("cannot parse %s version %s of %s", typ, b, bFull)
469+
}
470+
471+
return cmp.Compare(aNum, bNum), nil
472+
}
473+
474+
// Compares version triplet strings, ignoring anything past `-` in version.
475+
// A version string like 8.0 will compare as if third triplet were a wildcard.
476+
// A version string like 8 will compare as if second & third triplets were wildcards.
455477
func CompareServerVersions(a, b string) (int, error) {
456-
var (
457-
aVer, bVer *semver.Version
458-
err error
459-
)
478+
aNumbers, _, _ := strings.Cut(a, "-")
479+
bNumbers, _, _ := strings.Cut(b, "-")
460480

461-
if aVer, err = semver.NewVersion(a); err != nil {
462-
return 0, fmt.Errorf("cannot parse %q as semver: %w", a, err)
481+
aMajor, aRest, _ := strings.Cut(aNumbers, ".")
482+
bMajor, bRest, _ := strings.Cut(bNumbers, ".")
483+
484+
if majorCompare, err := compareSubVersion("major", aMajor, bMajor, a, b); err != nil || majorCompare != 0 {
485+
return majorCompare, err
463486
}
464487

465-
if bVer, err = semver.NewVersion(b); err != nil {
466-
return 0, fmt.Errorf("cannot parse %q as semver: %w", b, err)
488+
aMinor, aPatch, _ := strings.Cut(aRest, ".")
489+
bMinor, bPatch, _ := strings.Cut(bRest, ".")
490+
491+
if minorCompare, err := compareSubVersion("minor", aMinor, bMinor, a, b); err != nil || minorCompare != 0 {
492+
return minorCompare, err
467493
}
468494

469-
return aVer.Compare(bVer), nil
495+
return compareSubVersion("patch", aPatch, bPatch, a, b)
470496
}
471497

472498
var encodeRef = map[byte]byte{

mysql/util_test.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,29 @@ func TestCompareServerVersions(t *testing.T) {
1515
}{
1616
{A: "1.2.3", B: "1.2.3", Expect: 0},
1717
{A: "5.6-999", B: "8.0", Expect: -1},
18+
{A: "5.6.3-999", B: "5.6", Expect: 0},
19+
{A: "5.6.3-999", B: "5.5-tag", Expect: 1},
1820
{A: "8.0.32-0ubuntu0.20.04.2", B: "8.0.28", Expect: 1},
21+
{A: "a.b.c", B: "8.0", Expect: 2},
1922
}
2023

2124
for _, test := range tests {
2225
got, err := CompareServerVersions(test.A, test.B)
23-
require.NoError(t, err)
24-
require.Equal(t, test.Expect, got)
26+
if test.Expect == 2 {
27+
require.Error(t, err)
28+
} else {
29+
require.NoError(t, err)
30+
require.Equal(t, test.Expect, got)
31+
}
32+
33+
// test logic is commutative
34+
got, err = CompareServerVersions(test.B, test.A)
35+
if test.Expect == 2 {
36+
require.Error(t, err)
37+
} else {
38+
require.NoError(t, err)
39+
require.Equal(t, -test.Expect, got)
40+
}
2541
}
2642
}
2743

0 commit comments

Comments
 (0)