diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 348c78edb..094d9aff6 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -271,11 +271,11 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error { var saveError error churls := make(map[string]struct{}) for _, dep := range deps { + chartPath := filepath.Join(destPath, dep.Name) // No repository means the chart is in charts directory if dep.Repository == "" { fmt.Fprintf(m.Out, "Dependency %s did not declare a repository. Assuming it exists in the charts directory\n", dep.Name) // NOTE: we are only validating the local dependency conforms to the constraints. No copying to tmpPath is necessary. - chartPath := filepath.Join(destPath, dep.Name) ch, err := loader.LoadDir(chartPath) if err != nil { return fmt.Errorf("unable to load chart '%s': %v", chartPath, err) @@ -297,6 +297,13 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error { } continue } + + // Check if subchart already exist before downloading tarball. + // https://github.com/helm/helm/issues/30710 + if _, err := os.Stat(chartPath); !os.IsNotExist(err) { + return fmt.Errorf("dependency conflict detected: A subchart named '%s' already exists in charts/ directory", dep.Name) + } + if strings.HasPrefix(dep.Repository, "file://") { if m.Debug { fmt.Fprintf(m.Out, "Archiving %s from repo %s\n", dep.Name, dep.Repository) diff --git a/pkg/downloader/manager_test.go b/pkg/downloader/manager_test.go index 53955c45b..c565cb3ac 100644 --- a/pkg/downloader/manager_test.go +++ b/pkg/downloader/manager_test.go @@ -298,6 +298,24 @@ version: 0.1.0` if err == nil { t.Fatal("Expected error for bad dependency name") } + + remoteDep := &chart.Dependency{ + Name: "sub", + Repository: "oci://remote", + Version: "0.0.1", + } + + // create a 'tmpcharts' directory to test #30710 + if err := os.MkdirAll(filepath.Join(chartPath, "charts", "sub"), 0755); err != nil { + t.Fatal(err) + } + err = m.downloadAll([]*chart.Dependency{remoteDep}) + if err == nil { + t.Fatal("Expected error as subchart already exist") + } + if err.Error() != "dependency conflict detected: A subchart named 'sub' already exists in charts/ directory" { + t.Fatal("Download should failed with conflict issue") + } } func TestUpdateBeforeBuild(t *testing.T) {