From c6657ecd33ba18a8177519db36d1993cd984d76f Mon Sep 17 00:00:00 2001 From: Alessandro Arzilli Date: Mon, 5 May 2025 17:38:11 +0200 Subject: [PATCH] goversion: fix development version parsing (#3999) Fix development version parsing for go1.25. --- pkg/goversion/go_version.go | 83 +++++++++++++++++++++++------------ pkg/goversion/version_test.go | 1 + 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/pkg/goversion/go_version.go b/pkg/goversion/go_version.go index 5628c003..f0cef273 100644 --- a/pkg/goversion/go_version.go +++ b/pkg/goversion/go_version.go @@ -50,7 +50,7 @@ func Parse(ver string) (GoVersion, bool) { return GoVersion{-1, 0, 0, "", ""}, true } - // new development build: devel goX.Y-COMMIT DATE ARCH + // go1.24 development build: devel goX.Y-COMMIT DATE ARCH ver = strings.Split(ver[2:], "-")[0] v := strings.SplitN(ver, ".", 2) if len(v) != 2 { @@ -70,40 +70,65 @@ func Parse(ver string) (GoVersion, bool) { switch len(v) { case 2: r.Major, err1 = strconv.Atoi(v[0]) - var vr []string - if vr = strings.SplitN(v[1], "beta", 2); len(vr) == 2 { - // old beta releases goX.YbetaZ - var beta int - beta, err3 = strconv.Atoi(vr[1]) - r.Rev = betaRev(beta) - } else if vr = strings.SplitN(v[1], "b", 2); len(vr) == 2 { - // old boringcrypto version goX.YbZ - if _, err := strconv.Atoi(vr[1]); err != nil { - return GoVersion{}, false - } - } else { - vr = strings.SplitN(v[1], "rc", 2) - if len(vr) == 2 { - // rc release goX.YrcZ - var rc int - rc, err3 = strconv.Atoi(vr[1]) - r.Rev = rcRev(rc) - } else { - r.Minor, err2 = strconv.Atoi(v[1]) - if err2 != nil { - return GoVersion{}, false - } - return r, true + var minorstr, rest string + var found bool + + for i, ch := range v[1] { + if ch < '0' || ch > '9' { + minorstr = v[1][:i] + rest = v[1][i:] + found = true + break } } + if !found { + minorstr = v[1] + } - // old major release (if none of the options above apply) goX.Y - - r.Minor, err2 = strconv.Atoi(vr[0]) + r.Minor, err2 = strconv.Atoi(minorstr) r.Proposal = "" - if err1 != nil || err2 != nil || err3 != nil { + if err1 != nil || err2 != nil { + return GoVersion{}, false + } + + if rest == "" { + // old major release: goX.Y + return r, true + } + + hasPrefix := func(pfx string) bool { + if strings.HasPrefix(rest, pfx) { + rest = rest[len(pfx):] + return true + } + return false + } + + switch { + case hasPrefix("-devel_"): + // go1.25 development version: go1.25-devel_COMMIT DATE ARCH + r.Rev = versionedDevel + case hasPrefix("beta"): + // old beta releases goX.YbetaZ + var beta int + beta, err3 = strconv.Atoi(rest) + r.Rev = betaRev(beta) + case hasPrefix("b"): + // old boringcrypto version goX.YbZ + _, err3 = strconv.Atoi(rest) + case hasPrefix("rc"): + // old rc release goX.YrcZ + var rc int + rc, err3 = strconv.Atoi(rest) + r.Rev = rcRev(rc) + default: + // what is this? + return GoVersion{}, false + } + + if err3 != nil { return GoVersion{}, false } diff --git a/pkg/goversion/version_test.go b/pkg/goversion/version_test.go index a66a48bd..48b0aa7f 100644 --- a/pkg/goversion/version_test.go +++ b/pkg/goversion/version_test.go @@ -78,6 +78,7 @@ func TestParseVersionStringEqual(t *testing.T) { versionEqual(t, "go1.21.1-something", GoVersion{1, 21, 1, "", "something"}) versionEqual(t, "devel +17efbfc Tue Jul 28 17:39:19 2015 +0000 linux/amd64", GoVersion{Major: -1}) versionEqual(t, "devel go1.24-1bb6f19a25 Mon Oct 14 15:17:20 2024 -0400 linux/amd64", GoVersion{1, 24, versionedDevel, "", ""}) + versionEqual(t, "go1.25-devel_6953ef86cd Mon May 5 04:05:18 2025 -0700 linux/amd64", GoVersion{1, 25, versionedDevel, "", ""}) } func TestRoundtrip(t *testing.T) {