diff --git a/pkg/app/app.go b/pkg/app/app.go index 4e627b6a..d04b458b 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -103,7 +103,10 @@ func Init(app *App) *App { func (a *App) Deps(c DepsConfigProvider) error { return a.ForEachState(func(run *Run) (_ bool, errs []error) { - prepErr := run.withPreparedCharts(false, c.SkipRepos(), "deps", func() { + prepErr := run.withPreparedCharts("deps", state.ChartPrepareOptions{ + SkipRepos: c.SkipRepos(), + SkipResolve: true, + }, func() { errs = run.Deps(c) }) @@ -119,7 +122,7 @@ func (a *App) Repos(c ReposConfigProvider) error { return a.ForEachState(func(run *Run) (_ bool, errs []error) { var reposErr error - err := run.withPreparedCharts(false, true, "repos", func() { + err := run.withPreparedCharts("repos", state.ChartPrepareOptions{SkipRepos: true}, func() { reposErr = run.Repos(c) }) @@ -137,7 +140,7 @@ func (a *App) Repos(c ReposConfigProvider) error { func (a *App) DeprecatedSyncCharts(c DeprecatedChartsConfigProvider) error { return a.ForEachState(func(run *Run) (_ bool, errs []error) { - err := run.withPreparedCharts(false, true, "charts", func() { + err := run.withPreparedCharts("charts", state.ChartPrepareOptions{SkipRepos: true}, func() { errs = run.DeprecatedSyncCharts(c) }) @@ -163,7 +166,7 @@ func (a *App) Diff(c DiffConfigProvider) error { var errs []error - prepErr := run.withPreparedCharts(false, c.SkipDeps(), "diff", func() { + prepErr := run.withPreparedCharts("diff", state.ChartPrepareOptions{SkipRepos: c.SkipDeps()}, func() { msg, matched, affected, errs = a.diff(run, c) }) @@ -218,7 +221,10 @@ func (a *App) Template(c TemplateConfigProvider) error { return a.ForEachState(func(run *Run) (ok bool, errs []error) { // `helm template` in helm v2 does not support local chart. // So, we set forceDownload=true for helm v2 only - prepErr := run.withPreparedCharts(!run.helm.IsHelm3(), c.SkipDeps(), "template", func() { + prepErr := run.withPreparedCharts("template", state.ChartPrepareOptions{ + ForceDownload: !run.helm.IsHelm3(), + SkipRepos: c.SkipDeps(), + }, func() { ok, errs = a.template(run, c) }) @@ -233,7 +239,10 @@ func (a *App) Template(c TemplateConfigProvider) error { func (a *App) Lint(c LintConfigProvider) error { return a.ForEachState(func(run *Run) (_ bool, errs []error) { // `helm lint` on helm v2 and v3 does not support remote charts, that we need to set `forceDownload=true` here - prepErr := run.withPreparedCharts(true, c.SkipDeps(), "lint", func() { + prepErr := run.withPreparedCharts("lint", state.ChartPrepareOptions{ + ForceDownload: true, + SkipRepos: c.SkipDeps(), + }, func() { errs = run.Lint(c) }) @@ -247,7 +256,9 @@ func (a *App) Lint(c LintConfigProvider) error { func (a *App) Sync(c SyncConfigProvider) error { return a.ForEachState(func(run *Run) (ok bool, errs []error) { - prepErr := run.withPreparedCharts(false, c.SkipDeps(), "sync", func() { + prepErr := run.withPreparedCharts("sync", state.ChartPrepareOptions{ + SkipRepos: c.SkipDeps(), + }, func() { ok, errs = a.sync(run, c) }) @@ -269,7 +280,9 @@ func (a *App) Apply(c ApplyConfigProvider) error { opts = append(opts, SetRetainValuesFiles(c.RetainValuesFiles())) err := a.ForEachState(func(run *Run) (ok bool, errs []error) { - prepErr := run.withPreparedCharts(false, c.SkipDeps(), "apply", func() { + prepErr := run.withPreparedCharts("apply", state.ChartPrepareOptions{ + SkipRepos: c.SkipDeps(), + }, func() { matched, updated, es := a.apply(run, c) mut.Lock() @@ -301,7 +314,9 @@ func (a *App) Apply(c ApplyConfigProvider) error { func (a *App) Status(c StatusesConfigProvider) error { return a.ForEachState(func(run *Run) (_ bool, errs []error) { - err := run.withPreparedCharts(false, true, "status", func() { + err := run.withPreparedCharts("status", state.ChartPrepareOptions{ + SkipRepos: true, + }, func() { errs = run.Status(c) }) @@ -315,7 +330,9 @@ func (a *App) Status(c StatusesConfigProvider) error { func (a *App) Delete(c DeleteConfigProvider) error { return a.ForEachState(func(run *Run) (ok bool, errs []error) { - err := run.withPreparedCharts(false, true, "delete", func() { + err := run.withPreparedCharts("delete", state.ChartPrepareOptions{ + SkipRepos: true, + }, func() { ok, errs = a.delete(run, c.Purge(), c) }) @@ -329,7 +346,9 @@ func (a *App) Delete(c DeleteConfigProvider) error { func (a *App) Destroy(c DestroyConfigProvider) error { return a.ForEachState(func(run *Run) (ok bool, errs []error) { - err := run.withPreparedCharts(false, true, "destroy", func() { + err := run.withPreparedCharts("destroy", state.ChartPrepareOptions{ + SkipRepos: true, + }, func() { ok, errs = a.delete(run, true, c) }) @@ -349,7 +368,9 @@ func (a *App) Test(c TestConfigProvider) error { "or set helm.sh/hook-delete-policy\n") } - err := run.withPreparedCharts(false, true, "test", func() { + err := run.withPreparedCharts("test", state.ChartPrepareOptions{ + SkipRepos: true, + }, func() { errs = run.Test(c) }) @@ -363,7 +384,9 @@ func (a *App) Test(c TestConfigProvider) error { func (a *App) PrintState(c StateConfigProvider) error { return a.ForEachState(func(run *Run) (_ bool, errs []error) { - err := run.withPreparedCharts(false, true, "build", func() { + err := run.withPreparedCharts("build", state.ChartPrepareOptions{ + SkipRepos: true, + }, func() { state, err := run.state.ToYaml() if err != nil { errs = []error{err} @@ -386,7 +409,9 @@ func (a *App) ListReleases(c ListConfigProvider) error { var releases []*HelmRelease err := a.ForEachState(func(run *Run) (_ bool, errs []error) { - err := run.withPreparedCharts(false, true, "list", func() { + err := run.withPreparedCharts("list", state.ChartPrepareOptions{ + SkipRepos: true, + }, func() { //var releases m for _, r := range run.state.Releases { diff --git a/pkg/app/run.go b/pkg/app/run.go index ae01649c..539d24a9 100644 --- a/pkg/app/run.go +++ b/pkg/app/run.go @@ -36,12 +36,12 @@ func (r *Run) askForConfirmation(msg string) bool { return AskForConfirmation(msg) } -func (r *Run) withPreparedCharts(forceDownload, skipRepos bool, helmfileCommand string, f func()) error { +func (r *Run) withPreparedCharts(helmfileCommand string, opts state.ChartPrepareOptions, f func()) error { if r.ReleaseToChart != nil { panic("Run.PrepareCharts can be called only once") } - if !skipRepos { + if !opts.SkipRepos { ctx := r.ctx if err := ctx.SyncReposOnce(r.state, r.helm); err != nil { return err @@ -59,7 +59,7 @@ func (r *Run) withPreparedCharts(forceDownload, skipRepos bool, helmfileCommand return err } - releaseToChart, errs := r.state.PrepareCharts(r.helm, dir, 2, helmfileCommand, forceDownload, skipRepos) + releaseToChart, errs := r.state.PrepareCharts(r.helm, dir, 2, helmfileCommand, opts) if len(errs) > 0 { return fmt.Errorf("%v", errs) diff --git a/pkg/state/state.go b/pkg/state/state.go index ee3229ed..56359762 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -792,6 +792,12 @@ func releasesNeedCharts(releases []ReleaseSpec) []ReleaseSpec { return result } +type ChartPrepareOptions struct { + ForceDownload bool + SkipRepos bool + SkipResolve bool +} + // PrepareCharts creates temporary directories of charts. // // Each resulting "chart" can be one of the followings: @@ -806,7 +812,7 @@ func releasesNeedCharts(releases []ReleaseSpec) []ReleaseSpec { // Otheriwse, if a chart is not a helm chart, it will call "chartify" to turn it into a chart. // // If exists, it will also patch resources by json patches, strategic-merge patches, and injectors. -func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurrency int, helmfileCommand string, forceDownload, skipDeps bool) (map[string]string, []error) { +func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurrency int, helmfileCommand string, opts ChartPrepareOptions) (map[string]string, []error) { releases := releasesNeedCharts(st.Releases) temp := make(map[string]string, len(releases)) @@ -828,11 +834,13 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre helm3 = helm.IsHelm3() } - updated, err := st.ResolveDeps() - if err != nil { - return nil, []error{err} + if !opts.SkipResolve { + updated, err := st.ResolveDeps() + if err != nil { + return nil, []error{err} + } + *st = *updated } - *st = *updated var diagnostics []string @@ -916,7 +924,7 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre // a broken remote chart won't completely block their job. chartPath = normalizeChart(st.basePath, chartPath) - if !skipDeps { + if !opts.SkipRepos { if err := helm.BuildDeps(release.Name, chartPath); err != nil { if chartFetchedByGoGetter { diagnostic = fmt.Sprintf( @@ -934,7 +942,7 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre } } } - } else if !forceDownload { + } else if !opts.ForceDownload { // At this point, we are sure that either: // 1. It is a local chart and we can use it in later process (helm upgrade/template/lint/etc) // without any modification, or