From da61008e32d0b000566e91739c48c46742fce528 Mon Sep 17 00:00:00 2001 From: Vilsol Date: Fri, 29 Dec 2023 07:15:18 -0800 Subject: [PATCH] fix: always close file after hashing (#53) --- cli/cache/download.go | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/cli/cache/download.go b/cli/cache/download.go index c9fd46a..6631dfc 100644 --- a/cli/cache/download.go +++ b/cli/cache/download.go @@ -143,22 +143,12 @@ func DownloadOrCache(cacheKey string, hash string, url string, updates chan<- ut func downloadInternal(cacheKey string, location string, hash string, url string, updates chan<- utils.GenericProgress, downloadSemaphore chan int) (int64, error) { stat, err := os.Stat(location) if err == nil { - existingHash := "" - - if hash != "" { - f, err := os.Open(location) - if err != nil { - return 0, fmt.Errorf("failed to open file: %s: %w", location, err) - } - defer f.Close() - - existingHash, err = utils.SHA256Data(f) - if err != nil { - return 0, fmt.Errorf("could not compute hash for file: %s: %w", location, err) - } + matches, err := compareHash(hash, location) + if err != nil { + return 0, err } - if hash == existingHash { + if matches { return stat.Size(), nil } @@ -222,3 +212,22 @@ func downloadInternal(cacheKey string, location string, hash string, url string, return resp.ContentLength, nil } + +func compareHash(hash string, location string) (bool, error) { + existingHash := "" + + if hash != "" { + f, err := os.Open(location) + if err != nil { + return false, fmt.Errorf("failed to open file: %s: %w", location, err) + } + defer f.Close() + + existingHash, err = utils.SHA256Data(f) + if err != nil { + return false, fmt.Errorf("could not compute hash for file: %s: %w", location, err) + } + } + + return hash == existingHash, nil +}