From 680f8de6e70ba4e18d3c4cef44198b324c30fca2 Mon Sep 17 00:00:00 2001 From: Vaibhav Sharma <17532va@gmail.com> Date: Wed, 1 Feb 2023 21:19:15 +0530 Subject: [PATCH] Putting behind a flag Signed-off-by: Vaibhav Sharma <17532va@gmail.com> --- cmd/helm/dependency_build.go | 2 ++ cmd/helm/dependency_update.go | 2 ++ pkg/action/dependency.go | 9 +++--- pkg/downloader/manager.go | 55 ++++++++++++++++++++++++++-------- pkg/downloader/manager_test.go | 1 + 5 files changed, 53 insertions(+), 16 deletions(-) diff --git a/cmd/helm/dependency_build.go b/cmd/helm/dependency_build.go index 1ee46d3d2..2ad80df79 100644 --- a/cmd/helm/dependency_build.go +++ b/cmd/helm/dependency_build.go @@ -64,6 +64,7 @@ func newDependencyBuildCmd(cfg *action.Configuration, out io.Writer) *cobra.Comm RepositoryConfig: settings.RepositoryConfig, RepositoryCache: settings.RepositoryCache, Debug: settings.Debug, + OptimizedUpdate: client.OptimizedUpdate, } if client.Verify { man.Verify = downloader.VerifyIfPossible @@ -80,6 +81,7 @@ func newDependencyBuildCmd(cfg *action.Configuration, out io.Writer) *cobra.Comm f.BoolVar(&client.Verify, "verify", false, "verify the packages against signatures") f.StringVar(&client.Keyring, "keyring", defaultKeyring(), "keyring containing public keys") f.BoolVar(&client.SkipRefresh, "skip-refresh", false, "do not refresh the local repository cache") + f.BoolVar(&client.OptimizedUpdate, "optimized-update", false, "Refresh only the repos in chart.yaml") return cmd } diff --git a/cmd/helm/dependency_update.go b/cmd/helm/dependency_update.go index ad0188f17..e4109cad2 100644 --- a/cmd/helm/dependency_update.go +++ b/cmd/helm/dependency_update.go @@ -67,6 +67,7 @@ func newDependencyUpdateCmd(cfg *action.Configuration, out io.Writer) *cobra.Com RepositoryConfig: settings.RepositoryConfig, RepositoryCache: settings.RepositoryCache, Debug: settings.Debug, + OptimizedUpdate: client.OptimizedUpdate, } if client.Verify { man.Verify = downloader.VerifyAlways @@ -79,6 +80,7 @@ func newDependencyUpdateCmd(cfg *action.Configuration, out io.Writer) *cobra.Com f.BoolVar(&client.Verify, "verify", false, "verify the packages against signatures") f.StringVar(&client.Keyring, "keyring", defaultKeyring(), "keyring containing public keys") f.BoolVar(&client.SkipRefresh, "skip-refresh", false, "do not refresh the local repository cache") + f.BoolVar(&client.OptimizedUpdate, "optimized-update", false, "Refresh only the repos in chart.yaml") return cmd } diff --git a/pkg/action/dependency.go b/pkg/action/dependency.go index 3265f1f17..1ce340d25 100644 --- a/pkg/action/dependency.go +++ b/pkg/action/dependency.go @@ -34,10 +34,11 @@ import ( // // It provides the implementation of 'helm dependency' and its respective subcommands. type Dependency struct { - Verify bool - Keyring string - SkipRefresh bool - ColumnWidth uint + Verify bool + Keyring string + SkipRefresh bool + ColumnWidth uint + OptimizedUpdate bool } // NewDependency creates a new Dependency object with the given configuration. diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index f41a39c0e..3cc729af7 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -71,6 +71,8 @@ type Manager struct { Keyring string // SkipUpdate indicates that the repository should not be updated first. SkipUpdate bool + // Update repos only in the chart.yaml + OptimizedUpdate bool // Getter collection for the operation Getters []getter.Provider RegistryClient *registry.Client @@ -136,9 +138,16 @@ func (m *Manager) Build() error { if !m.SkipUpdate { // For each repo in the file, update the cached copy of that repo - if err := m.UpdateRepositories(c); err != nil { - return err + if !m.OptimizedUpdate { + if err := m.UpdateRepositories(); err != nil { + return err + } + } else { + if err := m.UpdateRepositoriesInChart(c); err != nil { + return err + } } + } // Now we need to fetch every package here into charts/ @@ -185,9 +194,17 @@ func (m *Manager) Update() error { // For each of the repositories Helm is configured to know about, update // the index information locally. if !m.SkipUpdate { - if err := m.UpdateRepositories(c); err != nil { - return err + // For each repo in the file, update the cached copy of that repo + if !m.OptimizedUpdate { + if err := m.UpdateRepositories(); err != nil { + return err + } + } else { + if err := m.UpdateRepositoriesInChart(c); err != nil { + return err + } } + } // Now we need to find out which version of a chart best satisfies the @@ -643,7 +660,20 @@ repository, use "https://charts.example.com/" or "@example" instead of } // UpdateRepositories updates all of the local repos to the latest. -func (m *Manager) UpdateRepositories(c *chart.Chart) error { +func (m *Manager) UpdateRepositories() error { + rf, err := loadRepoConfig(m.RepositoryConfig) + if err != nil { + return err + } + repos := rf.Repositories + if err := m.parallelRepoUpdate(repos); err != nil { + return err + } + return nil +} + +// UpdateRepositories updates only the local repos in the chart.yaml to the latest. +func (m *Manager) UpdateRepositoriesInChart(c *chart.Chart) error { rf, err := loadRepoConfig(m.RepositoryConfig) if err != nil { return err @@ -660,18 +690,18 @@ func (m *Manager) UpdateRepositories(c *chart.Chart) error { repos = append(repos, e) } } - if len(repos) > 0 { - fmt.Fprintln(m.Out, "Hang tight while we grab the latest from your chart repositories...") - // This prints warnings straight to out. - if err := m.parallelRepoUpdate(repos); err != nil { - return err - } - fmt.Fprintln(m.Out, "Update Complete. ⎈Happy Helming!⎈") + if err := m.parallelRepoUpdate(repos); err != nil { + return err } return nil } func (m *Manager) parallelRepoUpdate(repos []*repo.Entry) error { + if len(repos) <= 0 { + return nil + } + fmt.Fprintln(m.Out, "Hang tight while we grab the latest from your chart repositories...") + // This prints warnings straight to out. var wg sync.WaitGroup for _, c := range repos { @@ -703,6 +733,7 @@ func (m *Manager) parallelRepoUpdate(repos []*repo.Entry) error { } wg.Wait() + fmt.Fprintln(m.Out, "Update Complete. ⎈Happy Helming!⎈") return nil } diff --git a/pkg/downloader/manager_test.go b/pkg/downloader/manager_test.go index ad0faf671..d35474496 100644 --- a/pkg/downloader/manager_test.go +++ b/pkg/downloader/manager_test.go @@ -618,6 +618,7 @@ func TestUpdateOnlyRequiredRepos(t *testing.T) { Getters: g, RepositoryConfig: dir("repositories.yaml"), RepositoryCache: dir(), + OptimizedUpdate: true, } err = m.Update()