Skip to content

Commit c6657ec

Browse files
authoredMay 5, 2025
goversion: fix development version parsing (#3999)
Fix development version parsing for go1.25.
1 parent 64ac23d commit c6657ec

File tree

2 files changed

+54
-28
lines changed

2 files changed

+54
-28
lines changed
 

‎pkg/goversion/go_version.go

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func Parse(ver string) (GoVersion, bool) {
5050
return GoVersion{-1, 0, 0, "", ""}, true
5151
}
5252

53-
// new development build: devel goX.Y-COMMIT DATE ARCH
53+
// go1.24 development build: devel goX.Y-COMMIT DATE ARCH
5454
ver = strings.Split(ver[2:], "-")[0]
5555
v := strings.SplitN(ver, ".", 2)
5656
if len(v) != 2 {
@@ -70,40 +70,65 @@ func Parse(ver string) (GoVersion, bool) {
7070
switch len(v) {
7171
case 2:
7272
r.Major, err1 = strconv.Atoi(v[0])
73-
var vr []string
7473

75-
if vr = strings.SplitN(v[1], "beta", 2); len(vr) == 2 {
74+
var minorstr, rest string
75+
var found bool
76+
77+
for i, ch := range v[1] {
78+
if ch < '0' || ch > '9' {
79+
minorstr = v[1][:i]
80+
rest = v[1][i:]
81+
found = true
82+
break
83+
}
84+
}
85+
if !found {
86+
minorstr = v[1]
87+
}
88+
89+
r.Minor, err2 = strconv.Atoi(minorstr)
90+
r.Proposal = ""
91+
92+
if err1 != nil || err2 != nil {
93+
return GoVersion{}, false
94+
}
95+
96+
if rest == "" {
97+
// old major release: goX.Y
98+
return r, true
99+
}
100+
101+
hasPrefix := func(pfx string) bool {
102+
if strings.HasPrefix(rest, pfx) {
103+
rest = rest[len(pfx):]
104+
return true
105+
}
106+
return false
107+
}
108+
109+
switch {
110+
case hasPrefix("-devel_"):
111+
// go1.25 development version: go1.25-devel_COMMIT DATE ARCH
112+
r.Rev = versionedDevel
113+
case hasPrefix("beta"):
76114
// old beta releases goX.YbetaZ
77115
var beta int
78-
beta, err3 = strconv.Atoi(vr[1])
116+
beta, err3 = strconv.Atoi(rest)
79117
r.Rev = betaRev(beta)
80-
} else if vr = strings.SplitN(v[1], "b", 2); len(vr) == 2 {
118+
case hasPrefix("b"):
81119
// old boringcrypto version goX.YbZ
82-
if _, err := strconv.Atoi(vr[1]); err != nil {
83-
return GoVersion{}, false
84-
}
85-
} else {
86-
vr = strings.SplitN(v[1], "rc", 2)
87-
if len(vr) == 2 {
88-
// rc release goX.YrcZ
89-
var rc int
90-
rc, err3 = strconv.Atoi(vr[1])
91-
r.Rev = rcRev(rc)
92-
} else {
93-
r.Minor, err2 = strconv.Atoi(v[1])
94-
if err2 != nil {
95-
return GoVersion{}, false
96-
}
97-
return r, true
98-
}
120+
_, err3 = strconv.Atoi(rest)
121+
case hasPrefix("rc"):
122+
// old rc release goX.YrcZ
123+
var rc int
124+
rc, err3 = strconv.Atoi(rest)
125+
r.Rev = rcRev(rc)
126+
default:
127+
// what is this?
128+
return GoVersion{}, false
99129
}
100130

101-
// old major release (if none of the options above apply) goX.Y
102-
103-
r.Minor, err2 = strconv.Atoi(vr[0])
104-
r.Proposal = ""
105-
106-
if err1 != nil || err2 != nil || err3 != nil {
131+
if err3 != nil {
107132
return GoVersion{}, false
108133
}
109134

‎pkg/goversion/version_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ func TestParseVersionStringEqual(t *testing.T) {
7878
versionEqual(t, "go1.21.1-something", GoVersion{1, 21, 1, "", "something"})
7979
versionEqual(t, "devel +17efbfc Tue Jul 28 17:39:19 2015 +0000 linux/amd64", GoVersion{Major: -1})
8080
versionEqual(t, "devel go1.24-1bb6f19a25 Mon Oct 14 15:17:20 2024 -0400 linux/amd64", GoVersion{1, 24, versionedDevel, "", ""})
81+
versionEqual(t, "go1.25-devel_6953ef86cd Mon May 5 04:05:18 2025 -0700 linux/amd64", GoVersion{1, 25, versionedDevel, "", ""})
8182
}
8283

8384
func TestRoundtrip(t *testing.T) {

0 commit comments

Comments
 (0)