2015-07-23 17:08:28 +00:00
|
|
|
package proc
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2016-01-10 08:57:52 +00:00
|
|
|
// GoVersion represents the Go version of
|
|
|
|
// the Go compiler version used to compile
|
|
|
|
// the target binary.
|
2015-07-23 17:08:28 +00:00
|
|
|
type GoVersion struct {
|
|
|
|
Major int
|
|
|
|
Minor int
|
|
|
|
Rev int
|
2015-07-28 19:54:40 +00:00
|
|
|
Beta int
|
2015-08-11 13:37:27 +00:00
|
|
|
RC int
|
2015-07-23 17:08:28 +00:00
|
|
|
}
|
|
|
|
|
2017-02-07 21:07:18 +00:00
|
|
|
var (
|
|
|
|
GoVer18Beta = GoVersion{1, 8, -1, 0, 0}
|
|
|
|
)
|
|
|
|
|
2016-02-25 09:48:42 +00:00
|
|
|
func ParseVersionString(ver string) (GoVersion, bool) {
|
2015-07-23 17:08:28 +00:00
|
|
|
var r GoVersion
|
|
|
|
var err1, err2, err3 error
|
|
|
|
|
2015-07-28 19:54:40 +00:00
|
|
|
if strings.HasPrefix(ver, "devel") {
|
2015-08-11 13:37:27 +00:00
|
|
|
return GoVersion{-1, 0, 0, 0, 0}, true
|
2015-07-28 19:54:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if strings.HasPrefix(ver, "go") {
|
2016-06-07 18:07:37 +00:00
|
|
|
ver := strings.Split(ver, " ")[0]
|
2015-07-28 19:54:40 +00:00
|
|
|
v := strings.SplitN(ver[2:], ".", 3)
|
|
|
|
switch len(v) {
|
|
|
|
case 2:
|
|
|
|
r.Major, err1 = strconv.Atoi(v[0])
|
2015-08-11 13:37:27 +00:00
|
|
|
vr := strings.SplitN(v[1], "beta", 2)
|
|
|
|
if len(vr) == 2 {
|
|
|
|
r.Beta, err3 = strconv.Atoi(vr[1])
|
|
|
|
} else {
|
|
|
|
vr = strings.SplitN(v[1], "rc", 2)
|
|
|
|
if len(vr) == 2 {
|
|
|
|
r.RC, err3 = strconv.Atoi(vr[1])
|
2015-08-12 11:37:36 +00:00
|
|
|
} else {
|
|
|
|
r.Minor, err2 = strconv.Atoi(v[1])
|
|
|
|
if err2 != nil {
|
|
|
|
return GoVersion{}, false
|
|
|
|
}
|
|
|
|
return r, true
|
2015-08-11 13:37:27 +00:00
|
|
|
}
|
|
|
|
}
|
2015-07-28 19:54:40 +00:00
|
|
|
|
2015-08-11 13:37:27 +00:00
|
|
|
r.Minor, err2 = strconv.Atoi(vr[0])
|
2015-07-28 19:54:40 +00:00
|
|
|
r.Rev = -1
|
|
|
|
|
|
|
|
if err1 != nil || err2 != nil || err3 != nil {
|
|
|
|
return GoVersion{}, false
|
|
|
|
}
|
|
|
|
|
|
|
|
return r, true
|
|
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
|
|
r.Major, err1 = strconv.Atoi(v[0])
|
|
|
|
r.Minor, err2 = strconv.Atoi(v[1])
|
|
|
|
r.Rev, err3 = strconv.Atoi(v[2])
|
|
|
|
if err1 != nil || err2 != nil || err3 != nil {
|
|
|
|
return GoVersion{}, false
|
|
|
|
}
|
|
|
|
|
|
|
|
return r, true
|
|
|
|
|
|
|
|
default:
|
|
|
|
return GoVersion{}, false
|
|
|
|
}
|
2015-07-23 17:08:28 +00:00
|
|
|
}
|
|
|
|
|
2015-07-28 19:54:40 +00:00
|
|
|
return GoVersion{}, false
|
2015-07-23 17:08:28 +00:00
|
|
|
}
|
|
|
|
|
2016-01-10 08:57:52 +00:00
|
|
|
// AfterOrEqual returns whether one GoVersion is after or
|
|
|
|
// equal to the other.
|
|
|
|
func (v *GoVersion) AfterOrEqual(b GoVersion) bool {
|
|
|
|
if v.Major < b.Major {
|
2015-07-23 17:08:28 +00:00
|
|
|
return false
|
2016-01-10 08:57:52 +00:00
|
|
|
} else if v.Major > b.Major {
|
2015-07-23 17:08:28 +00:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2016-01-10 08:57:52 +00:00
|
|
|
if v.Minor < b.Minor {
|
2015-07-23 17:08:28 +00:00
|
|
|
return false
|
2016-01-10 08:57:52 +00:00
|
|
|
} else if v.Minor > b.Minor {
|
2015-07-23 17:08:28 +00:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2016-01-10 08:57:52 +00:00
|
|
|
if v.Rev < b.Rev {
|
2015-07-23 17:08:28 +00:00
|
|
|
return false
|
2016-01-10 08:57:52 +00:00
|
|
|
} else if v.Rev > b.Rev {
|
2015-07-28 19:54:40 +00:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2016-01-10 08:57:52 +00:00
|
|
|
if v.Beta < b.Beta {
|
2015-07-28 19:54:40 +00:00
|
|
|
return false
|
2015-07-23 17:08:28 +00:00
|
|
|
}
|
|
|
|
|
2016-01-10 08:57:52 +00:00
|
|
|
if v.RC < b.RC {
|
2015-08-11 13:37:27 +00:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2015-07-23 17:08:28 +00:00
|
|
|
return true
|
|
|
|
}
|
2015-07-28 19:54:40 +00:00
|
|
|
|
2016-01-10 08:57:52 +00:00
|
|
|
// IsDevel returns whether the GoVersion
|
|
|
|
// is a development version.
|
2015-07-28 19:54:40 +00:00
|
|
|
func (v *GoVersion) IsDevel() bool {
|
|
|
|
return v.Major < 0
|
|
|
|
}
|