about summary refs log tree commit diff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-04-09T10·49+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2015-04-09T10·49+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 050e8d69c710..b23e3196706f 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 aa4fd5083d4e..65396e5de329 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 33ec26d260d4..8823efe82e62 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) {