aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/primops.cc11
-rw-r--r--src/libstore/download.cc9
-rw-r--r--src/libstore/download.hh2
3 files changed, 13 insertions, 9 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 081392f3c..6a4a7a035 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -1692,6 +1692,7 @@ void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
{
string url;
Hash expectedHash;
+ string name;
state.forceValue(*args[0]);
@@ -1700,11 +1701,13 @@ void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
state.forceAttrs(*args[0], pos);
for (auto & attr : *args[0]->attrs) {
- string name(attr.name);
- if (name == "url")
+ string n(attr.name);
+ if (n == "url")
url = state.forceStringNoCtx(*attr.value, *attr.pos);
- else if (name == "sha256")
+ else if (n == "sha256")
expectedHash = parseHash16or32(htSHA256, state.forceStringNoCtx(*attr.value, *attr.pos));
+ else if (n == "name")
+ name = state.forceStringNoCtx(*attr.value, *attr.pos);
else
throw EvalError(format("unsupported argument ‘%1%’ to ‘%2%’, at %3%") % attr.name % who % attr.pos);
}
@@ -1718,7 +1721,7 @@ void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
if (state.restricted && !expectedHash)
throw Error(format("‘%1%’ is not allowed in restricted mode") % who);
- Path res = makeDownloader()->downloadCached(state.store, url, unpack, expectedHash);
+ Path res = makeDownloader()->downloadCached(state.store, url, unpack, name, expectedHash);
mkString(v, res, PathSet({res}));
}
diff --git a/src/libstore/download.cc b/src/libstore/download.cc
index 95c7d2255..13c665a40 100644
--- a/src/libstore/download.cc
+++ b/src/libstore/download.cc
@@ -243,13 +243,14 @@ ref<Downloader> makeDownloader()
return make_ref<CurlDownloader>();
}
-Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpack, const Hash & expectedHash)
+Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpack, string name, const Hash & expectedHash)
{
auto url = resolveUri(url_);
- string name;
- auto p = url.rfind('/');
- if (p != string::npos) name = string(url, p + 1);
+ if (name == "") {
+ auto p = url.rfind('/');
+ if (p != string::npos) name = string(url, p + 1);
+ }
Path expectedStorePath;
if (expectedHash) {
diff --git a/src/libstore/download.hh b/src/libstore/download.hh
index 1f6098759..08618ba1c 100644
--- a/src/libstore/download.hh
+++ b/src/libstore/download.hh
@@ -29,7 +29,7 @@ struct Downloader
{
virtual DownloadResult download(string url, const DownloadOptions & options) = 0;
- Path downloadCached(ref<Store> store, const string & url, bool unpack,
+ Path downloadCached(ref<Store> store, const string & url, bool unpack, string name = "",
const Hash & expectedHash = Hash());
enum Error { NotFound, Forbidden, Misc, Transient };