aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-04-09 12:49:13 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2015-04-09 12:49:13 +0200
commit4ed2187377bb915c0eac7f93f20afa3d16f79a5d (patch)
tree5742d0b717f424c7ccd4402def7a5cce8a721509 /src/libexpr
parent1fc905ad4c6320d7625d7f9bec06e70531bb0d5f (diff)
Use cached result if there is a network error
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/download.cc2
-rw-r--r--src/libexpr/download.hh2
-rw-r--r--src/libexpr/primops.cc19
3 files changed, 15 insertions, 8 deletions
diff --git a/src/libexpr/download.cc b/src/libexpr/download.cc
index 050e8d69c..b23e31967 100644
--- a/src/libexpr/download.cc
+++ b/src/libexpr/download.cc
@@ -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;
diff --git a/src/libexpr/download.hh b/src/libexpr/download.hh
index aa4fd5083..65396e5de 100644
--- a/src/libexpr/download.hh
+++ b/src/libexpr/download.hh
@@ -13,4 +13,6 @@ struct DownloadResult
DownloadResult downloadFile(string url, string expectedETag = "");
+MakeError(DownloadError, Error)
+
}
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 33ec26d26..8823efe82 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -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) {