From 2d5cb11d787f596323e73c115de8cab7bdbc06d9 Mon Sep 17 00:00:00 2001 From: Helm Contributor Date: Wed, 17 Dec 2025 13:22:16 +0200 Subject: [PATCH] fix(chart): normalize CRD filenames to use forward slashes on all platforms Fixes https://github.com/helm/helm/issues/31585 by normalizing CRD Filename values with filepath.ToSlash so Windows no longer emits backslashes. This ensures TestCRDObjects passes cross-platform and CRD paths remain consistent. Added test TestCRDObjectsWithSubchart to verify forward slash normalization for both parent and subchart CRDs. Signed-off-by: Insaf Hashem Signed-off-by: Helm Contributor --- internal/chart/v3/chart.go | 2 +- internal/chart/v3/chart_test.go | 50 +++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/internal/chart/v3/chart.go b/internal/chart/v3/chart.go index 48f006e79..a466b1f70 100644 --- a/internal/chart/v3/chart.go +++ b/internal/chart/v3/chart.go @@ -162,7 +162,7 @@ func (ch *Chart) CRDObjects() []CRD { // Find all resources in the crds/ directory for _, f := range ch.Files { if strings.HasPrefix(f.Name, "crds/") && hasManifestExtension(f.Name) { - mycrd := CRD{Name: f.Name, Filename: filepath.Join(ch.ChartFullPath(), f.Name), File: f} + mycrd := CRD{Name: f.Name, Filename: filepath.ToSlash(filepath.Join(ch.ChartFullPath(), f.Name)), File: f} crds = append(crds, mycrd) } } diff --git a/internal/chart/v3/chart_test.go b/internal/chart/v3/chart_test.go index 07cbf4b39..5b1773842 100644 --- a/internal/chart/v3/chart_test.go +++ b/internal/chart/v3/chart_test.go @@ -227,3 +227,53 @@ func TestCRDObjects(t *testing.T) { crds := chrt.CRDObjects() is.Equal(expected, crds) } + +func TestCRDObjectsWithSubchart(t *testing.T) { + modTime := time.Now() + + // Create a subchart + subchart := &Chart{ + Metadata: &Metadata{ + Name: "subchart", + }, + Files: []*common.File{ + { + Name: "crds/subchartcrd.yaml", + ModTime: modTime, + Data: []byte("subchart crd"), + }, + }, + } + + // Create a parent chart with a dependency + parentChart := &Chart{ + Metadata: &Metadata{ + Name: "parent", + }, + Files: []*common.File{ + { + Name: "crds/parentcrd.yaml", + ModTime: modTime, + Data: []byte("parent crd"), + }, + }, + } + + parentChart.AddDependency(subchart) + + is := assert.New(t) + crds := parentChart.CRDObjects() + + // Verify we have CRDs from both parent and subchart + is.Equal(2, len(crds)) + + // Verify parent CRD has forward slashes (not backslashes) + is.Equal("crds/parentcrd.yaml", crds[0].Name) + is.Equal("parent/crds/parentcrd.yaml", crds[0].Filename) + is.NotContains(crds[0].Filename, "\\", "CRD filename should use forward slashes, not backslashes") + + // Verify subchart CRD has forward slashes (not backslashes) + is.Equal("crds/subchartcrd.yaml", crds[1].Name) + is.Equal("parent/charts/subchart/crds/subchartcrd.yaml", crds[1].Filename) + is.NotContains(crds[1].Filename, "\\", "CRD filename should use forward slashes, not backslashes") +}