summaryrefslogtreecommitdiffstats
path: root/src/nix-prefetch-url/nix-prefetch-url.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-07-10 13:21:37 +0200
committerEelco Dolstra <edolstra@gmail.com>2020-07-10 13:21:37 +0200
commit5dff49f661cd221fc457d1a4660cd36f28266dc5 (patch)
tree3011f404ec85f85e387a2acd26f2c80538631cc8 /src/nix-prefetch-url/nix-prefetch-url.cc
parent7f1a86d57c548b4db44f589ffae2f6491d3b2d4c (diff)
Factor out commonality between nix-prefetch-url and nix-store --add-fixed
Diffstat (limited to 'src/nix-prefetch-url/nix-prefetch-url.cc')
-rw-r--r--src/nix-prefetch-url/nix-prefetch-url.cc34
1 files changed, 9 insertions, 25 deletions
diff --git a/src/nix-prefetch-url/nix-prefetch-url.cc b/src/nix-prefetch-url/nix-prefetch-url.cc
index 8ca85e894..961e7fb6d 100644
--- a/src/nix-prefetch-url/nix-prefetch-url.cc
+++ b/src/nix-prefetch-url/nix-prefetch-url.cc
@@ -10,7 +10,6 @@
#include "../nix/legacy.hh"
#include "progress-bar.hh"
#include "tarfile.hh"
-#include "archive.hh"
#include <iostream>
@@ -154,14 +153,15 @@ static int _main(int argc, char * * argv)
/* If an expected hash is given, the file may already exist in
the store. */
- Hash hash, expectedHash(ht);
+ std::optional<Hash> expectedHash;
+ Hash hash;
std::optional<StorePath> storePath;
if (args.size() == 2) {
expectedHash = Hash(args[1], ht);
const auto recursive = unpack ? FileIngestionMethod::Recursive : FileIngestionMethod::Flat;
- storePath = store->makeFixedOutputPath(recursive, expectedHash, name);
+ storePath = store->makeFixedOutputPath(recursive, *expectedHash, name);
if (store->isValidPath(*storePath))
- hash = expectedHash;
+ hash = *expectedHash;
else
storePath.reset();
}
@@ -201,28 +201,12 @@ static int _main(int argc, char * * argv)
tmpFile = unpacked;
}
- /* FIXME: inefficient: we're reading/hashing 'tmpFile'
- three times. */
- auto [narHash, narSize] = hashPath(htSHA256, tmpFile);
+ const auto method = unpack ? FileIngestionMethod::Recursive : FileIngestionMethod::Flat;
- hash = unpack ? hashPath(ht, tmpFile).first : hashFile(ht, tmpFile);
-
- if (expectedHash != Hash(ht) && expectedHash != hash)
- throw Error("hash mismatch for '%1%'", uri);
-
- const auto recursive = unpack ? FileIngestionMethod::Recursive : FileIngestionMethod::Flat;
-
- storePath = store->makeFixedOutputPath(recursive, hash, name);
-
- /* Copy the file to the Nix store. */
- ValidPathInfo info(*storePath);
- info.narHash = narHash;
- info.narSize = narSize;
- info.ca = FixedOutputHash { .method = recursive, .hash = hash };
- auto source = sinkToSource([&](Sink & sink) {
- dumpPath(tmpFile, sink);
- });
- store->addToStore(info, *source);
+ auto info = store->addToStoreSlow(name, tmpFile, method, ht, expectedHash);
+ storePath = info.path;
+ assert(info.ca);
+ hash = getContentAddressHash(*info.ca);
}
stopProgressBar();