diff --git a/pkg/helmexec/exec.go b/pkg/helmexec/exec.go index a2044470..66f46723 100644 --- a/pkg/helmexec/exec.go +++ b/pkg/helmexec/exec.go @@ -72,6 +72,23 @@ func parseHelmVersion(versionStr string) (*semver.Version, error) { v, err := chartify.FindSemVerInfo(versionStr) if err != nil { + // If chartify.FindSemVerInfo fails, try parsing the version string directly + // This handles cases where the version string doesn't have a "v" prefix + // or is in a simple format that semver can parse directly + ver, directErr := semver.NewVersion(versionStr) + if directErr == nil { + return ver, nil + } + + // If direct parsing failed and the version doesn't start with "v", try adding "v" prefix + if len(versionStr) > 0 && versionStr[0] != 'v' { + vWithPrefix := "v" + versionStr + ver, prefixErr := semver.NewVersion(vWithPrefix) + if prefixErr == nil { + return ver, nil + } + } + return nil, fmt.Errorf("error find helm srmver version '%s': %w", versionStr, err) } diff --git a/pkg/helmexec/exec_test.go b/pkg/helmexec/exec_test.go index f0af5aa5..0800956c 100644 --- a/pkg/helmexec/exec_test.go +++ b/pkg/helmexec/exec_test.go @@ -1128,6 +1128,24 @@ func TestParseHelmVersion(t *testing.T) { want: semver.MustParse("v3.7.1+7.el8"), wantErr: false, }, + { + name: "version without v prefix - simple", + version: "3.8.0", + want: semver.MustParse("v3.8.0"), + wantErr: false, + }, + { + name: "version without v prefix with build info", + version: "3.8.0+abcd", + want: semver.MustParse("v3.8.0+abcd"), + wantErr: false, + }, + { + name: "version without v prefix with prerelease", + version: "3.8.0-rc1", + want: semver.MustParse("v3.8.0-rc1"), + wantErr: false, + }, { name: "empty version", version: "", @@ -1149,7 +1167,14 @@ func TestParseHelmVersion(t *testing.T) { return } if !reflect.DeepEqual(got, tt.want) { - t.Errorf("parseHelmVersion() = %v, want %v", got, tt.want) + // For semantic versions, we need to check if they're semantically equal + // rather than structurally equal, as versions with and without "v" prefix + // may have different internal representations but be semantically equivalent + if got != nil && tt.want != nil && got.Equal(tt.want) { + // They are semantically equal, this is fine + } else { + t.Errorf("parseHelmVersion() = %v, want %v", got, tt.want) + } } }) }