Use cached result if there is a network error
This commit is contained in:
parent
1fc905ad4c
commit
4ed2187377
3 changed files with 15 additions and 8 deletions
|
@ -100,7 +100,7 @@ struct Curl
|
||||||
CURLcode res = curl_easy_perform(curl);
|
CURLcode res = curl_easy_perform(curl);
|
||||||
if (res == CURLE_WRITE_ERROR && etag == expectedETag) return false;
|
if (res == CURLE_WRITE_ERROR && etag == expectedETag) return false;
|
||||||
if (res != CURLE_OK)
|
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);
|
% url % curl_easy_strerror(res) % res);
|
||||||
|
|
||||||
long httpStatus = 0;
|
long httpStatus = 0;
|
||||||
|
|
|
@ -13,4 +13,6 @@ struct DownloadResult
|
||||||
|
|
||||||
DownloadResult downloadFile(string url, string expectedETag = "");
|
DownloadResult downloadFile(string url, string expectedETag = "");
|
||||||
|
|
||||||
|
MakeError(DownloadError, Error)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1551,20 +1551,25 @@ void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
|
||||||
|
|
||||||
if (!skip) {
|
if (!skip) {
|
||||||
|
|
||||||
if (expectedETag.empty())
|
if (storePath.empty())
|
||||||
printMsg(lvlInfo, format("downloading ‘%1%’...") % url);
|
printMsg(lvlInfo, format("downloading ‘%1%’...") % url);
|
||||||
else
|
else
|
||||||
printMsg(lvlInfo, format("checking ‘%1%’...") % url);
|
printMsg(lvlInfo, format("checking ‘%1%’...") % url);
|
||||||
|
|
||||||
auto res = downloadFile(url, expectedETag);
|
try {
|
||||||
|
auto res = downloadFile(url, expectedETag);
|
||||||
|
|
||||||
if (!res.cached)
|
if (!res.cached)
|
||||||
storePath = store->addTextToStore(name, res.data, PathSet(), state.repair);
|
storePath = store->addTextToStore(name, res.data, PathSet(), state.repair);
|
||||||
|
|
||||||
assert(!storePath.empty());
|
assert(!storePath.empty());
|
||||||
replaceSymlink(storePath, fileLink);
|
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) {
|
if (unpack) {
|
||||||
|
|
Loading…
Reference in a new issue