diff options
-rw-r--r-- | doc/manual/packages/ssh-substituter.xml | 4 | ||||
-rw-r--r-- | release.nix | 10 | ||||
-rw-r--r-- | src/libstore/download.cc | 11 |
3 files changed, 15 insertions, 10 deletions
diff --git a/doc/manual/packages/ssh-substituter.xml b/doc/manual/packages/ssh-substituter.xml index f24f354c4c39..8db3f96625d3 100644 --- a/doc/manual/packages/ssh-substituter.xml +++ b/doc/manual/packages/ssh-substituter.xml @@ -12,7 +12,7 @@ automatically fetching any store paths in Firefox’s closure if they are available on the server <literal>avalon</literal>: <screen> -$ nix-env -i firefox --option ssh-substituter-hosts alice@avalon +$ nix-env -i firefox --substituters ssh://alice@avalon </screen> This works similar to the binary cache substituter that Nix usually @@ -31,7 +31,7 @@ an SSH passphrase interactively. Therefore, you should use installing it into your profile, e.g. <screen> -$ nix-store -r /nix/store/m85bxg…-firefox-34.0.5 --option ssh-substituter-hosts alice@avalon +$ nix-store -r /nix/store/m85bxg…-firefox-34.0.5 --substituters ssh://alice@avalon </screen> This is essentially equivalent to doing diff --git a/release.nix b/release.nix index 5fae5468bf50..91c782c51916 100644 --- a/release.nix +++ b/release.nix @@ -115,16 +115,15 @@ let let toplevel = builtins.getAttr system jobs.build; version = toplevel.src.version; + installerClosureInfo = closureInfo { rootPaths = [ toplevel cacert ]; }; in runCommand "nix-binary-tarball-${version}" - { exportReferencesGraph = [ "closure1" toplevel "closure2" cacert ]; - buildInputs = [ perl ] ++ lib.optional (system != "aarch64-linux") shellcheck; + { nativeBuildInputs = lib.optional (system != "aarch64-linux") shellcheck; meta.description = "Distribution-independent Nix bootstrap binaries for ${system}"; } '' - storePaths=$(perl ${pathsFromGraph} ./closure1 ./closure2) - printRegistration=1 perl ${pathsFromGraph} ./closure1 ./closure2 > $TMPDIR/reginfo + cp ${installerClosureInfo}/registration $TMPDIR/reginfo substitute ${./scripts/install-nix-from-closure.sh} $TMPDIR/install \ --subst-var-by nix ${toplevel} \ --subst-var-by cacert ${cacert} @@ -150,7 +149,8 @@ let --transform "s,$TMPDIR/install,$dir/install," \ --transform "s,$TMPDIR/reginfo,$dir/.reginfo," \ --transform "s,$NIX_STORE,$dir/store,S" \ - $TMPDIR/install $TMPDIR/install-darwin-multi-user $TMPDIR/reginfo $storePaths + $TMPDIR/install $TMPDIR/install-darwin-multi-user $TMPDIR/reginfo \ + $(cat ${installerClosureInfo}/store-paths) ''); diff --git a/src/libstore/download.cc b/src/libstore/download.cc index 6eb87096692f..4d7f5690192d 100644 --- a/src/libstore/download.cc +++ b/src/libstore/download.cc @@ -632,7 +632,7 @@ Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpa if (expectedHash) { expectedStorePath = store->makeFixedOutputPath(unpack, expectedHash, name); if (store->isValidPath(expectedStorePath)) - return expectedStorePath; + return store->toRealPath(expectedStorePath); } Path cacheDir = getCacheDir() + "/nix/tarballs"; @@ -726,8 +726,13 @@ Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpa storePath = unpackedStorePath; } - if (expectedStorePath != "" && storePath != expectedStorePath) - throw nix::Error("store path mismatch in file downloaded from '%s'", url); + if (expectedStorePath != "" && storePath != expectedStorePath) { + Hash gotHash = unpack + ? hashPath(expectedHash.type, store->toRealPath(storePath)).first + : hashFile(expectedHash.type, store->toRealPath(storePath)); + throw nix::Error("hash mismatch in file downloaded from '%s': expected hash '%s', got '%s'", + url, expectedHash.to_string(), gotHash.to_string()); + } return store->toRealPath(storePath); } |