diff --git a/pkg/version/compatible.go b/pkg/version/compatible.go index 735610778..dc4a4e306 100644 --- a/pkg/version/compatible.go +++ b/pkg/version/compatible.go @@ -18,6 +18,7 @@ package version // import "k8s.io/helm/pkg/version" import ( "fmt" + "regexp" "strings" "github.com/Masterminds/semver" @@ -53,6 +54,18 @@ func IsCompatibleRange(constraint, ver string) bool { return false } + verSuffix := sv.Prerelease() + if verSuffix != "" { + if !IsConstraintPrerelease(constraint) { + constraint = constraint + "-r0" + trimmedVer := strings.TrimSuffix(sv.String(), "-"+verSuffix) + sv, err = semver.NewVersion(trimmedVer) + if err != nil { + return false + } + } + } + c, err := semver.NewConstraint(constraint) if err != nil { return false @@ -60,6 +73,27 @@ func IsCompatibleRange(constraint, ver string) bool { return c.Check(sv) } +func IsConstraintPrerelease(constraint string) bool { + base := constraint + for _, c := range constraint { + char := string(c) + r := regexp.MustCompile(`^[0-9]+`).MatchString(char) + if !r { + base = strings.TrimPrefix(base, char) + } else { + break + } + } + baseVer, err := semver.NewVersion(base) + if err != nil { + return false + } + if baseVer.Prerelease() == "" { + return false + } + return true +} + func isUnreleased(v string) bool { return strings.HasSuffix(v, "unreleased") } diff --git a/pkg/version/compatible_test.go b/pkg/version/compatible_test.go index adc1c489e..a3843009c 100644 --- a/pkg/version/compatible_test.go +++ b/pkg/version/compatible_test.go @@ -56,6 +56,10 @@ func TestIsCompatibleRange(t *testing.T) { {"v2", "v2.0.0", true}, {">2.0.0", "v2.1.1", true}, {"v2.1.*", "v2.1.1", true}, + {">=1.8.0", "v1.9.4-gke.1", true}, + {">=1.8.0", "v1.7.4-gke.1", false}, + {"<=1.8.0", "v1.7.4-gke.1", true}, + {"~v2.0.0", "v2.0.1-gke1", true}, } for _, tt := range tests {