Skip to content

Commit bb7ab13

Browse files
authored
Merge pull request #2120 from fluxcd/index-loading-helmv4
fix: align index loading with upstream Helm v4
2 parents 065d6ef + ded4718 commit bb7ab13

4 files changed

Lines changed: 44 additions & 1 deletion

File tree

internal/helm/chart/dependency_manager.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,15 @@ func (dm *DependencyManager) build(ctx context.Context, ref Reference, c *helmch
153153
sem := semaphore.NewWeighted(current)
154154
c := &chartWithLock{Chart: c}
155155
for name, dep := range deps {
156-
name, dep := name, dep
157156
if err := sem.Acquire(groupCtx, 1); err != nil {
158157
return err
159158
}
160159
group.Go(func() (err error) {
160+
defer func() {
161+
if r := recover(); r != nil {
162+
err = fmt.Errorf("failed to add dependency '%s': %v", name, r)
163+
}
164+
}()
161165
defer sem.Release(1)
162166
if isLocalDep(dep) {
163167
localRef, ok := ref.(LocalReference)

internal/helm/chart/dependency_manager_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,20 @@ func TestDependencyManager_build(t *testing.T) {
281281
}
282282
}
283283

284+
func TestDependencyManager_build_PanicRecovery(t *testing.T) {
285+
g := NewWithT(t)
286+
287+
dm := NewDependencyManager(WithDownloaderCallback(func(url string) (repository.Downloader, error) {
288+
panic("downloader callback error")
289+
}))
290+
err := dm.build(context.TODO(), LocalReference{}, &helmchart.Chart{}, map[string]*helmchart.Dependency{
291+
"example": {Repository: "https://example.com"},
292+
})
293+
g.Expect(err).To(HaveOccurred())
294+
g.Expect(err.Error()).To(ContainSubstring("failed to add dependency 'example'"))
295+
g.Expect(err.Error()).To(ContainSubstring("downloader callback error"))
296+
}
297+
284298
func TestDependencyManager_addLocalDependency(t *testing.T) {
285299
tests := []struct {
286300
name string

internal/helm/repository/chart_repository.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ func IndexFromBytes(b []byte) (*repo.IndexFile, error) {
9090
for name, cvs := range i.Entries {
9191
for idx := len(cvs) - 1; idx >= 0; idx-- {
9292
if cvs[idx] == nil {
93+
cvs = append(cvs[:idx], cvs[idx+1:]...)
9394
continue
9495
}
9596
// When metadata section missing, initialize with no data

internal/helm/repository/chart_repository_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,22 @@ entries:
828828
home: https://github.com/something/else
829829
digest: "sha256:1234567890abcdef"
830830
`
831+
var indexWithEmptyEntries = `
832+
apiVersion: v1
833+
entries:
834+
nginx:
835+
- null
836+
- urls:
837+
- https://charts.helm.sh/stable/nginx-0.2.0.tgz
838+
name: nginx
839+
description: string
840+
version: 0.2.0
841+
home: https://github.com/something/else
842+
digest: "sha256:1234567890abcdef"
843+
- null
844+
alpine:
845+
- null
846+
`
831847
var indexWithLastVersionInvalid = `
832848
apiVersion: v1
833849
entries:
@@ -862,6 +878,10 @@ func TestIndexFromBytes_InvalidEntries(t *testing.T) {
862878
source: "indexWithLastVersionInvalid",
863879
data: indexWithLastVersionInvalid,
864880
},
881+
{
882+
source: "indexWithEmptyEntries",
883+
data: indexWithEmptyEntries,
884+
},
865885
}
866886
for _, tc := range tests {
867887
t.Run(tc.source, func(t *testing.T) {
@@ -874,6 +894,10 @@ func TestIndexFromBytes_InvalidEntries(t *testing.T) {
874894
t.Error("expected one chart version not to be filtered out")
875895
}
876896
for _, v := range cvs {
897+
if v == nil {
898+
t.Error("empty entry was not filtered out")
899+
continue
900+
}
877901
if v.Version == "0..1.0" {
878902
t.Error("malformed version was not filtered out")
879903
}

0 commit comments

Comments
 (0)