73 lines
1.1 KiB
Go
73 lines
1.1 KiB
Go
package v1alpha1
|
|
|
|
import "strings"
|
|
|
|
func IsVersionAllowed(resourceVersion, buildVersion string) bool {
|
|
if buildVersion == "dev" || resourceVersion == buildVersion || strings.HasPrefix(buildVersion, "canary-") {
|
|
return true
|
|
}
|
|
|
|
rv, ok := parseSemver(resourceVersion)
|
|
if !ok {
|
|
return false
|
|
}
|
|
bv, ok := parseSemver(buildVersion)
|
|
if !ok {
|
|
return false
|
|
}
|
|
return rv.major == bv.major && rv.minor == bv.minor
|
|
}
|
|
|
|
type semver struct {
|
|
major string
|
|
minor string
|
|
}
|
|
|
|
func parseSemver(v string) (p semver, ok bool) {
|
|
if v == "" {
|
|
return
|
|
}
|
|
p.major, v, ok = parseInt(v)
|
|
if !ok {
|
|
return p, false
|
|
}
|
|
if v == "" {
|
|
p.minor = "0"
|
|
return p, true
|
|
}
|
|
if v[0] != '.' {
|
|
return p, false
|
|
}
|
|
p.minor, v, ok = parseInt(v[1:])
|
|
if !ok {
|
|
return p, false
|
|
}
|
|
if v == "" {
|
|
return p, true
|
|
}
|
|
if v[0] != '.' {
|
|
return p, false
|
|
}
|
|
if _, _, ok = parseInt(v[1:]); !ok {
|
|
return p, false
|
|
}
|
|
return p, true
|
|
}
|
|
|
|
func parseInt(v string) (t, rest string, ok bool) {
|
|
if v == "" {
|
|
return
|
|
}
|
|
if v[0] < '0' || '9' < v[0] {
|
|
return
|
|
}
|
|
i := 1
|
|
for i < len(v) && '0' <= v[i] && v[i] <= '9' {
|
|
i++
|
|
}
|
|
if v[0] == '0' && i != 1 {
|
|
return
|
|
}
|
|
return v[:i], v[i:], true
|
|
}
|