diff --git a/commands/helpers/cache_extractor.go b/commands/helpers/cache_extractor.go index 4221f9154b1e444bda9c9dc62566d2aed4bbdf04..7cee47990d15f50bd4f63eaa2c6e0f9a3e8de334 100644 --- a/commands/helpers/cache_extractor.go +++ b/commands/helpers/cache_extractor.go @@ -35,16 +35,15 @@ func (c *CacheExtractorCommand) getClient() *CacheClient { return c.client } +func checkIfUpToDate(path string, resp *http.Response) (bool, time.Time) { + fi, _ := os.Lstat(path) + date, _ := time.Parse(http.TimeFormat, resp.Header.Get("Last-Modified")) + return fi != nil && !date.After(fi.ModTime()), date +} + func (c *CacheExtractorCommand) download() (bool, error) { os.MkdirAll(filepath.Dir(c.File), 0700) - file, err := ioutil.TempFile(filepath.Dir(c.File), "cache") - if err != nil { - return false, err - } - defer file.Close() - defer os.Remove(file.Name()) - resp, err := c.getClient().Get(c.URL) if err != nil { return true, err @@ -59,13 +58,19 @@ func (c *CacheExtractorCommand) download() (bool, error) { return retry, fmt.Errorf("Received: %s", resp.Status) } - fi, _ := os.Lstat(c.File) - date, _ := time.Parse(http.TimeFormat, resp.Header.Get("Last-Modified")) - if fi != nil && !date.After(fi.ModTime()) { + upToDate, date := checkIfUpToDate(c.File, resp) + if upToDate { logrus.Infoln(filepath.Base(c.File), "is up to date") return false, nil } + file, err := ioutil.TempFile(filepath.Dir(c.File), "cache") + if err != nil { + return false, err + } + defer os.Remove(file.Name()) + defer file.Close() + logrus.Infoln("Downloading", filepath.Base(c.File), "from", url_helpers.CleanURL(c.URL)) _, err = io.Copy(file, resp.Body) if err != nil { @@ -73,6 +78,11 @@ func (c *CacheExtractorCommand) download() (bool, error) { } os.Chtimes(file.Name(), time.Now(), date) + err = file.Close() + if err != nil { + return false, err + } + err = os.Rename(file.Name(), c.File) if err != nil { return false, err