Use cached result if there is a network error

This commit is contained in:
Eelco Dolstra 2015-04-09 12:49:13 +02:00
parent 1fc905ad4c
commit 4ed2187377
3 changed files with 15 additions and 8 deletions

View file

@ -100,7 +100,7 @@ struct Curl
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_WRITE_ERROR && etag == expectedETag) return false;
if (res != CURLE_OK)
throw Error(format("unable to download %1%: %2% (%3%)")
throw DownloadError(format("unable to download %1%: %2% (%3%)")
% url % curl_easy_strerror(res) % res);
long httpStatus = 0;

View file

@ -13,4 +13,6 @@ struct DownloadResult
DownloadResult downloadFile(string url, string expectedETag = "");
MakeError(DownloadError, Error)
}

View file

@ -1551,20 +1551,25 @@ void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
if (!skip) {
if (expectedETag.empty())
if (storePath.empty())
printMsg(lvlInfo, format("downloading %1%...") % url);
else
printMsg(lvlInfo, format("checking %1%...") % url);
auto res = downloadFile(url, expectedETag);
try {
auto res = downloadFile(url, expectedETag);
if (!res.cached)
storePath = store->addTextToStore(name, res.data, PathSet(), state.repair);
if (!res.cached)
storePath = store->addTextToStore(name, res.data, PathSet(), state.repair);
assert(!storePath.empty());
replaceSymlink(storePath, fileLink);
assert(!storePath.empty());
replaceSymlink(storePath, fileLink);
writeFile(dataFile, url + "\n" + res.etag + "\n" + int2String(time(0)) + "\n");
writeFile(dataFile, url + "\n" + res.etag + "\n" + int2String(time(0)) + "\n");
} catch (DownloadError & e) {
if (storePath.empty()) throw;
printMsg(lvlError, format("warning: %1%; using cached result") % e.msg());
}
}
if (unpack) {