mirror of
https://github.com/golang/go.git
synced 2025-05-29 03:11:26 +00:00
runtime: add a simple version number parser
This will be used to parse the Linux kernel versions, but this code is generic and can be tested on its own. For #35777. Change-Id: If1df48d07250e5855dde45bc9d57c66f777b9fb4 Reviewed-on: https://go-review.googlesource.com/c/go/+/209597 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
709dbd2870
commit
fa3a121a79
@ -43,6 +43,8 @@ var PhysHugePageSize = physHugePageSize
|
|||||||
|
|
||||||
var NetpollGenericInit = netpollGenericInit
|
var NetpollGenericInit = netpollGenericInit
|
||||||
|
|
||||||
|
var ParseRelease = parseRelease
|
||||||
|
|
||||||
const PreemptMSupported = preemptMSupported
|
const PreemptMSupported = preemptMSupported
|
||||||
|
|
||||||
type LFNode struct {
|
type LFNode struct {
|
||||||
|
@ -495,3 +495,37 @@ func gostringw(strw *uint16) string {
|
|||||||
b[n2] = 0 // for luck
|
b[n2] = 0 // for luck
|
||||||
return s[:n2]
|
return s[:n2]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseRelease parses a dot-separated version number. It follows the
|
||||||
|
// semver syntax, but allows the minor and patch versions to be
|
||||||
|
// elided.
|
||||||
|
func parseRelease(rel string) (major, minor, patch int, ok bool) {
|
||||||
|
// Strip anything after a dash or plus.
|
||||||
|
for i := 0; i < len(rel); i++ {
|
||||||
|
if rel[i] == '-' || rel[i] == '+' {
|
||||||
|
rel = rel[:i]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
next := func() (int, bool) {
|
||||||
|
for i := 0; i < len(rel); i++ {
|
||||||
|
if rel[i] == '.' {
|
||||||
|
ver, ok := atoi(rel[:i])
|
||||||
|
rel = rel[i+1:]
|
||||||
|
return ver, ok
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ver, ok := atoi(rel)
|
||||||
|
rel = ""
|
||||||
|
return ver, ok
|
||||||
|
}
|
||||||
|
if major, ok = next(); !ok || rel == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if minor, ok = next(); !ok || rel == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
patch, ok = next()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@ -454,3 +454,34 @@ func TestAtoi32(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type parseReleaseTest struct {
|
||||||
|
in string
|
||||||
|
major, minor, patch int
|
||||||
|
}
|
||||||
|
|
||||||
|
var parseReleaseTests = []parseReleaseTest{
|
||||||
|
{"", -1, -1, -1},
|
||||||
|
{"x", -1, -1, -1},
|
||||||
|
{"5", 5, 0, 0},
|
||||||
|
{"5.12", 5, 12, 0},
|
||||||
|
{"5.12-x", 5, 12, 0},
|
||||||
|
{"5.12.1", 5, 12, 1},
|
||||||
|
{"5.12.1-x", 5, 12, 1},
|
||||||
|
{"5.12.1.0", 5, 12, 1},
|
||||||
|
{"5.20496382327982653440", -1, -1, -1},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseRelease(t *testing.T) {
|
||||||
|
for _, test := range parseReleaseTests {
|
||||||
|
major, minor, patch, ok := runtime.ParseRelease(test.in)
|
||||||
|
if !ok {
|
||||||
|
major, minor, patch = -1, -1, -1
|
||||||
|
}
|
||||||
|
if test.major != major || test.minor != minor || test.patch != patch {
|
||||||
|
t.Errorf("parseRelease(%q) = (%v, %v, %v) want (%v, %v, %v)",
|
||||||
|
test.in, major, minor, patch,
|
||||||
|
test.major, test.minor, test.patch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user