From 7986f60ddfa6c36f6c25f7e160433b54e949c644 Mon Sep 17 00:00:00 2001 From: ithrael Date: Mon, 11 Dec 2023 22:30:43 +0800 Subject: [PATCH] feat: If the required chart is already cached, there is no need to download it again Signed-off-by: ithrael --- pkg/downloader/chart_downloader.go | 23 ++++++++++++++++------- pkg/downloader/chart_downloader_test.go | 7 +++++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index a95894e00..5de54fb6d 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -97,11 +97,6 @@ func (c *ChartDownloader) DownloadTo(ref, version, dest string) (string, *proven return "", nil, err } - data, err := g.Get(u.String(), c.Options...) - if err != nil { - return "", nil, err - } - name := filepath.Base(u.Path) if u.Scheme == registry.OCIScheme { idx := strings.LastIndexByte(name, ':') @@ -109,8 +104,22 @@ func (c *ChartDownloader) DownloadTo(ref, version, dest string) (string, *proven } destfile := filepath.Join(dest, name) - if err := fileutil.AtomicWriteFile(destfile, data, 0644); err != nil { - return destfile, nil, err + _, err = os.Stat(destfile) + + // If the required chart is already cached, there is no need to download it again + if err != nil { + if os.IsNotExist(err) { + data, err := g.Get(u.String(), c.Options...) + if err != nil { + return "", nil, err + } + + if err := fileutil.AtomicWriteFile(destfile, data, 0644); err != nil { + return destfile, nil, err + } + } else { + return destfile, nil, err + } } // If provenance is requested, verify it. diff --git a/pkg/downloader/chart_downloader_test.go b/pkg/downloader/chart_downloader_test.go index 131e21306..ecea38917 100644 --- a/pkg/downloader/chart_downloader_test.go +++ b/pkg/downloader/chart_downloader_test.go @@ -197,7 +197,9 @@ func TestDownloadTo(t *testing.T) { }, } cname := "/signtest-0.1.0.tgz" - dest := srv.Root() + dest := srv.Root() + "/dest" + os.Mkdir(dest, 0755) + where, v, err := c.DownloadTo(srv.URL()+cname, "", dest) if err != nil { t.Fatal(err) @@ -248,7 +250,8 @@ func TestDownloadTo_TLS(t *testing.T) { Options: []getter.Option{}, } cname := "test/signtest" - dest := srv.Root() + dest := srv.Root() + "/dest" + os.Mkdir(dest, 0755) where, v, err := c.DownloadTo(cname, "", dest) if err != nil { t.Fatal(err)