in httputil/httputil.go [243:278]
func MaybeDownload(bazeliskHome, url, filename, description, auth string, merger ContentMerger) ([]byte, error) {
cachePath := filepath.Join(bazeliskHome, filename)
if cacheStat, err := os.Stat(cachePath); err == nil {
if time.Since(cacheStat.ModTime()).Hours() < 1 {
res, err := ioutil.ReadFile(cachePath)
if err != nil {
return nil, fmt.Errorf("could not read %s: %v", cachePath, err)
}
return res, nil
}
}
contents := make([][]byte, 0)
nextURL := url
for nextURL != "" {
// We could also use go-github here, but I can't get it to build with Bazel's rules_go and it pulls in a lot of dependencies.
body, headers, err := ReadRemoteFile(nextURL, auth)
if err != nil {
return nil, fmt.Errorf("could not download %s: %v", description, err)
}
contents = append(contents, body)
nextURL = getNextURL(headers)
}
merged, err := merger(contents)
if err != nil {
return nil, fmt.Errorf("failed to merge %d chunks from %s: %v", len(contents), url, err)
}
err = ioutil.WriteFile(cachePath, merged, 0666)
if err != nil {
return nil, fmt.Errorf("could not create %s: %v", cachePath, err)
}
return merged, nil
}