72 lines
2.5 KiB
Diff
72 lines
2.5 KiB
Diff
# 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
|
||
}
|