lix/src/libstore/builtins.cc
Eelco Dolstra d1b0909894 BinaryCacheStore::readFile(): Return a shared_ptr to a string
This allows readFile() to indicate that a file doesn't exist, and
might eliminate some large string copying.
2016-04-15 15:39:48 +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 = decompressXZ(*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);
}
}
}