diff --git a/pkg/remote/remote.go b/pkg/remote/remote.go index e3e91795..94721586 100644 --- a/pkg/remote/remote.go +++ b/pkg/remote/remote.go @@ -149,7 +149,7 @@ func Parse(goGetterSrc string) (*Source, error) { }, nil } -func (r *Remote) Fetch(goGetterSrc string) (string, error) { +func (r *Remote) Fetch(goGetterSrc string, cacheDirOpt ...string) (string, error) { u, err := Parse(goGetterSrc) if err != nil { return "", err @@ -167,6 +167,11 @@ func (r *Remote) Fetch(goGetterSrc string) (string, error) { // This should be shared across variant commands, so that they can share cache for the shared imports cacheBaseDir := DefaultCacheDir + if len(cacheDirOpt) == 1 { + cacheBaseDir = cacheDirOpt[0] + } else if len(cacheDirOpt) > 0 { + return "", fmt.Errorf("[bug] cacheDirOpt's length: want 0 or 1, got %d", len(cacheDirOpt)) + } query := u.RawQuery diff --git a/pkg/state/helmx.go b/pkg/state/helmx.go index e638081d..2d709e36 100644 --- a/pkg/state/helmx.go +++ b/pkg/state/helmx.go @@ -39,7 +39,27 @@ type Chartify struct { Clean func() } -func (st *HelmState) goGetterChart(chart, dir string, force bool) (string, error) { +func (st *HelmState) downloadChartWithGoGetter(r *ReleaseSpec) (string, error) { + pathElems := []string{ + remote.DefaultCacheDir, + } + + if r.Namespace != "" { + pathElems = append(pathElems, r.Namespace) + } + + if r.KubeContext != "" { + pathElems = append(pathElems, r.KubeContext) + } + + pathElems = append(pathElems, r.Name, r.Chart) + + cacheDir := filepath.Join(pathElems...) + + return st.goGetterChart(r.Chart, r.Directory, cacheDir, r.ForceGoGetter) +} + +func (st *HelmState) goGetterChart(chart, dir, cacheDir string, force bool) (string, error) { if dir != "" && chart == "" { chart = dir } @@ -52,7 +72,7 @@ func (st *HelmState) goGetterChart(chart, dir string, force bool) (string, error } else { r := remote.NewRemote(st.logger, st.basePath, st.readFile, directoryExistsAt, fileExistsAt) - fetchedDir, err := r.Fetch(chart) + fetchedDir, err := r.Fetch(chart, cacheDir) if err != nil { return "", fmt.Errorf("fetching %q: %v", chart, err) } diff --git a/pkg/state/state.go b/pkg/state/state.go index 72c8d063..d4b45bcb 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -979,15 +979,13 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre chartName := release.Chart - chartPath, err := st.goGetterChart(chartName, release.Directory, release.ForceGoGetter) + chartPath, err := st.downloadChartWithGoGetter(release) if err != nil { results <- &chartPrepareResult{err: fmt.Errorf("release %q: %w", release.Name, err)} return } chartFetchedByGoGetter := chartPath != chartName - var isOCI bool - if !chartFetchedByGoGetter { ociChartPath, err := st.getOCIChart(release, dir, helm) if err != nil { @@ -998,7 +996,6 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre if ociChartPath != nil { chartPath = *ociChartPath - isOCI = true } } @@ -1016,7 +1013,7 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre skipDepsGlobal := opts.SkipDeps skipDepsRelease := release.SkipDeps != nil && *release.SkipDeps skipDepsDefault := release.SkipDeps == nil && st.HelmDefaults.SkipDeps - skipDeps := !isLocal || skipDepsGlobal || skipDepsRelease || skipDepsDefault || isOCI + skipDeps := !isLocal || skipDepsGlobal || skipDepsRelease || skipDepsDefault if chartification != nil { c := chartify.New( diff --git a/pkg/state/state_gogetter_test.go b/pkg/state/state_gogetter_test.go index 006aa2ef..973d3515 100644 --- a/pkg/state/state_gogetter_test.go +++ b/pkg/state/state_gogetter_test.go @@ -41,7 +41,7 @@ func TestGoGetter(t *testing.T) { basePath: d, } - out, err := st.goGetterChart(tc.chart, tc.dir, false) + out, err := st.goGetterChart(tc.chart, tc.dir, "", false) if diff := cmp.Diff(tc.out, out); diff != "" { t.Fatalf("Unexpected out:\n%s", diff)