lix/src/libstore/builtins.cc
Eelco Dolstra 538a64e8c3 Add a Store::addToStore() variant that accepts a NAR
As a side effect, this ensures that signatures are propagated when
copying paths between stores.

Also refactored import/export to make use of this.
2016-05-04 16:15:54 +02:00

48 lines
1.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "builtins.hh"
#include "download.hh"
#include "store-api.hh"
#include "archive.hh"
#include "compression.hh"
namespace nix {
void builtinFetchurl(const BasicDerivation & drv)
{
auto url = drv.env.find("url");
if (url == drv.env.end()) throw Error("attribute url missing");
/* No need to do TLS verification, because we check the hash of
the result anyway. */
DownloadOptions options;
options.verifyTLS = false;
/* Show a progress indicator, even though stderr is not a tty. */
options.showProgress = DownloadOptions::yes;
auto data = makeDownloader()->download(url->second, options);
assert(data.data);
auto out = drv.env.find("out");
if (out == drv.env.end()) throw Error("attribute url missing");
Path storePath = out->second;
assertStorePath(storePath);
auto unpack = drv.env.find("unpack");
if (unpack != drv.env.end() && unpack->second == "1") {
if (string(*data.data, 0, 6) == string("\xfd" "7zXZ\0", 6))
data.data = decompress("xz", *data.data);
StringSource source(*data.data);
restorePath(storePath, source);
} else
writeFile(storePath, *data.data);
auto executable = drv.env.find("executable");
if (executable != drv.env.end() && executable->second == "1") {
if (chmod(storePath.c_str(), 0755) == -1)
throw SysError(format("making %1% executable") % storePath);
}
}
}