java-topology/defects/helm/patch/helm-0003-repo-update-linear-scan.patch

72 lines
2.5 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UNDF: UNDF-2026-000000106
--- a/pkg/cmd/repo_update.go
+++ b/pkg/cmd/repo_update.go
@@ -17,7 +17,6 @@ package cmd
import (
"fmt"
"io"
- "slices"
"sync"
"time"
@@ -87,11 +86,17 @@ func (o *repoUpdateOptions) run(out io.Writer, settings *cli.EnvSettings) error
var repos []*repo.ChartRepository
updateAllRepos := len(o.names) == 0
+ // Build O(1) lookup set from requested names — avoids O(repos × names) with slices.Contains.
+ requestedSet := make(map[string]struct{}, len(o.names))
+ for _, name := range o.names {
+ requestedSet[name] = struct{}{}
+ }
+
if !updateAllRepos {
// Fail early if the user specified an invalid repo to update
- if err := checkRequestedRepos(o.names, f.Repositories); err != nil {
+ if err := checkRequestedRepos(requestedSet, f.Repositories); err != nil {
return err
}
}
for _, cfg := range f.Repositories {
- if updateAllRepos || isRepoRequested(cfg.Name, o.names) {
+ if updateAllRepos || isRepoRequested(cfg.Name, requestedSet) {
r, err := repo.NewChartRepository(cfg, getter.All(settings, getter.WithTimeout(o.timeout)))
if err != nil {
return err
@@ -154,20 +159,16 @@ func (o *repoUpdateOptions) update(repos []*repo.ChartRepository, out io.Writer)
return nil
}
-func checkRequestedRepos(requestedRepos []string, validRepos []*repo.Entry) error {
- for _, requestedRepo := range requestedRepos {
- found := false
- for _, repo := range validRepos {
- if requestedRepo == repo.Name {
- found = true
- break
- }
- }
- if !found {
- return fmt.Errorf("no repositories found matching '%s'. Nothing will be updated", requestedRepo)
+// checkRequestedRepos validates every requested repo name exists in validRepos.
+// Uses a pre-built set for O(1) lookup — avoids O(requested × repos) nested scan.
+func checkRequestedRepos(requestedSet map[string]struct{}, validRepos []*repo.Entry) error {
+ validSet := make(map[string]struct{}, len(validRepos))
+ for _, repo := range validRepos {
+ validSet[repo.Name] = struct{}{}
+ }
+ for name := range requestedSet {
+ if _, ok := validSet[name]; !ok {
+ return fmt.Errorf("no repositories found matching '%s'. Nothing will be updated", name)
}
}
return nil
}
-func isRepoRequested(repoName string, requestedRepos []string) bool {
- return slices.Contains(requestedRepos, repoName)
+// isRepoRequested checks membership in O(1) using a pre-built set.
+func isRepoRequested(repoName string, requestedSet map[string]struct{}) bool {
+ _, ok := requestedSet[repoName]
+ return ok
}