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…
	
	Add table
		Add a link
		
	
		Reference in a new issue