Benoit Tigeot 2 weeks ago committed by GitHub
commit 29376aea60
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -175,6 +175,19 @@ func (i IndexFile) SortEntries() {
}
}
// isVersionRange checks if the version string is a range constraint (e.g., "^1", "~1.10")
// rather than an exact version (e.g., "1.10.0").
func isVersionRange(version string) bool {
if strings.ContainsAny(version, "^~<>=!*") || strings.Contains(version, "||") || strings.Contains(version, " - ") {
return true
}
core := version
if idx := strings.IndexAny(version, "-+"); idx != -1 {
core = version[:idx]
}
return strings.ContainsAny(core, "xX")
}
// Get returns the ChartVersion for the given name.
//
// If version is empty, this will return the chart with the latest stable version,
@ -215,8 +228,10 @@ func (i IndexFile) Get(name, version string) (*ChartVersion, error) {
}
if constraint.Check(test) {
if len(version) != 0 {
if len(version) != 0 && !isVersionRange(version) {
slog.Warn("unable to find exact version requested; falling back to closest available version", "chart", name, "requested", version, "selected", ver.Version)
} else if len(version) != 0 && isVersionRange(version) {
slog.Debug("selected version matching constraint", "chart", name, "constraint", version, "selected", ver.Version)
}
return ver, nil
}

@ -718,3 +718,45 @@ func TestLoadIndex_DuplicateChartDeps(t *testing.T) {
})
}
}
func TestIsVersionRange(t *testing.T) {
tests := []struct {
version string
expected bool
}{
{"1.0.0", false},
{"1.0.0+metadata", false},
{"v1.19.2", false},
{"v1", false},
{"^1", true},
{"^1.2.3", true},
{"~1.10", true},
{"~1.10.0", true},
{">= 1.0.0", true},
{"> 1.0.0", true},
{"< 2.0.0", true},
{"<= 2.0.0", true},
{"!= 1.0.0", true},
{"1.*", true},
{"1.x", true},
{"1.X", true},
{"v1.x", true},
{"v1.X", true},
{"1.0.0 - 2.0.0", true},
{"^1.0.0 || ^2.0.0", true},
{">=1.0.0 <2.0.0", true},
// Exact versions with 'x'/'X' in prerelease or build metadata
{"1.0.0-fix", false},
{"2.0.0-next", false},
{"1.0.0+exp", false},
}
for _, tt := range tests {
t.Run(tt.version, func(t *testing.T) {
got := isVersionRange(tt.version)
if got != tt.expected {
t.Errorf("isVersionRange(%q) = %v, want %v", tt.version, got, tt.expected)
}
})
}
}

Loading…
Cancel
Save