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
 | |
| }
 |