From f2682e6e18a76ecbfb8a12c17e3a0ca15c084197 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 1 Jun 2016 17:11:51 +0200 Subject: [PATCH] : Use tarballs.nixos.org This ensures that the disappearance of upstream bootstrap tarballs (e.g. https://github.com/NixOS/nixpkgs-channels/pull/1) doesn't break stdenv rebuilds. --- src/libstore/builtins.cc | 49 ++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/src/libstore/builtins.cc b/src/libstore/builtins.cc index 6383ab59e..d3194a905 100644 --- a/src/libstore/builtins.cc +++ b/src/libstore/builtins.cc @@ -8,33 +8,48 @@ namespace nix { void builtinFetchurl(const BasicDerivation & drv) { - auto url = drv.env.find("url"); - if (url == drv.env.end()) throw Error("attribute ‘url’ missing"); + auto getAttr = [&](const string & name) { + auto i = drv.env.find(name); + if (i == drv.env.end()) throw Error(format("attribute ‘%s’ missing") % name); + return i->second; + }; - /* No need to do TLS verification, because we check the hash of - the result anyway. */ - DownloadOptions options; - options.verifyTLS = false; + auto fetch = [&](const string & url) { + /* 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; + /* 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 data = makeDownloader()->download(url, options); + assert(data.data); - auto out = drv.env.find("out"); - if (out == drv.env.end()) throw Error("attribute ‘out’ missing"); + return data.data; + }; - Path storePath = out->second; + std::shared_ptr data; + + try { + if (getAttr("outputHashMode") == "flat") + data = fetch("http://tarballs.nixos.org/" + getAttr("outputHashAlgo") + "/" + getAttr("outputHash")); + } catch (Error & e) { + debug(e.what()); + } + + if (!data) data = fetch(getAttr("url")); + + Path storePath = getAttr("out"); 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); + if (string(*data, 0, 6) == string("\xfd" "7zXZ\0", 6)) + data = decompress("xz", *data); + StringSource source(*data); restorePath(storePath, source); } else - writeFile(storePath, *data.data); + writeFile(storePath, *data); auto executable = drv.env.find("executable"); if (executable != drv.env.end() && executable->second == "1") {