goversion: fix development version parsing (#3999)

Fix development version parsing for go1.25.
This commit is contained in:
Alessandro Arzilli
2025-05-05 17:38:11 +02:00
committed by GitHub
parent 64ac23de8c
commit c6657ecd33
2 changed files with 55 additions and 29 deletions

View File

@ -50,7 +50,7 @@ func Parse(ver string) (GoVersion, bool) {
return GoVersion{-1, 0, 0, "", ""}, true 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] ver = strings.Split(ver[2:], "-")[0]
v := strings.SplitN(ver, ".", 2) v := strings.SplitN(ver, ".", 2)
if len(v) != 2 { if len(v) != 2 {
@ -70,40 +70,65 @@ func Parse(ver string) (GoVersion, bool) {
switch len(v) { switch len(v) {
case 2: case 2:
r.Major, err1 = strconv.Atoi(v[0]) r.Major, err1 = strconv.Atoi(v[0])
var vr []string
if vr = strings.SplitN(v[1], "beta", 2); len(vr) == 2 { var minorstr, rest string
// old beta releases goX.YbetaZ var found bool
var beta int
beta, err3 = strconv.Atoi(vr[1]) for i, ch := range v[1] {
r.Rev = betaRev(beta) if ch < '0' || ch > '9' {
} else if vr = strings.SplitN(v[1], "b", 2); len(vr) == 2 { minorstr = v[1][:i]
// old boringcrypto version goX.YbZ rest = v[1][i:]
if _, err := strconv.Atoi(vr[1]); err != nil { found = true
return GoVersion{}, false break
}
} 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
} }
} }
if !found {
minorstr = v[1]
}
// old major release (if none of the options above apply) goX.Y r.Minor, err2 = strconv.Atoi(minorstr)
r.Minor, err2 = strconv.Atoi(vr[0])
r.Proposal = "" 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 return GoVersion{}, false
} }

View File

@ -78,6 +78,7 @@ func TestParseVersionStringEqual(t *testing.T) {
versionEqual(t, "go1.21.1-something", GoVersion{1, 21, 1, "", "something"}) 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 +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, "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) { func TestRoundtrip(t *testing.T) {