51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package proto
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// versionParts reads "0.2.5" (a leading v and a "-suffix" are allowed) as
|
|
// numbers; ok is false for anything that is not a dotted number.
|
|
func versionParts(v string) (parts []int, ok bool) {
|
|
v = strings.TrimPrefix(strings.TrimSpace(v), "v")
|
|
if i := strings.IndexAny(v, "-+"); i >= 0 {
|
|
v = v[:i]
|
|
}
|
|
if v == "" {
|
|
return nil, false
|
|
}
|
|
for _, p := range strings.Split(v, ".") {
|
|
n, err := strconv.Atoi(p)
|
|
if err != nil || n < 0 {
|
|
return nil, false
|
|
}
|
|
parts = append(parts, n)
|
|
}
|
|
return parts, true
|
|
}
|
|
|
|
// VersionNewer reports whether version a is higher than b. Anything that is
|
|
// not a dotted number (a build named "dev", an empty string) is never newer
|
|
// and never older - so a program is never "updated" down, or from a guess.
|
|
func VersionNewer(a, b string) bool {
|
|
pa, okA := versionParts(a)
|
|
pb, okB := versionParts(b)
|
|
if !okA || !okB {
|
|
return false
|
|
}
|
|
for i := 0; i < len(pa) || i < len(pb); i++ {
|
|
var x, y int
|
|
if i < len(pa) {
|
|
x = pa[i]
|
|
}
|
|
if i < len(pb) {
|
|
y = pb[i]
|
|
}
|
|
if x != y {
|
|
return x > y
|
|
}
|
|
}
|
|
return false
|
|
}
|