diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-03-21T16·55+0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-03-21T16·55+0100 |
commit | 1c5f73f529d83543dc776b4de4180309bfd3b4a3 (patch) | |
tree | 3f19160e2f65893c560d04a8a99b024427b86b78 | |
parent | 87295b9844090d76173a9f68341a4b17a7e1e7b9 (diff) |
Add Store::dumpPath() method
This allows applying nix-store --verify-path to binary cache stores: NIX_REMOTE=https://cache.nixos.org nix-store --verify-path /nix/store/s5c7...
-rw-r--r-- | src/libstore/binary-cache-store.cc | 15 | ||||
-rw-r--r-- | src/libstore/binary-cache-store.hh | 2 | ||||
-rw-r--r-- | src/libstore/local-fs-store.cc | 6 | ||||
-rw-r--r-- | src/libstore/local-store.cc | 2 | ||||
-rw-r--r-- | src/libstore/remote-store.cc | 2 | ||||
-rw-r--r-- | src/libstore/store-api.hh | 5 | ||||
-rw-r--r-- | src/nix-store/nix-store.cc | 4 |
7 files changed, 29 insertions, 7 deletions
diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc index 94f5cbabb706..de456752bd89 100644 --- a/src/libstore/binary-cache-store.cc +++ b/src/libstore/binary-cache-store.cc @@ -156,10 +156,8 @@ bool BinaryCacheStore::isValidPath(const Path & storePath) return fileExists(narInfoFileFor(storePath)); } -void BinaryCacheStore::exportPath(const Path & storePath, bool sign, Sink & sink) +void BinaryCacheStore::dumpPath(const Path & storePath, Sink & sink) { - assert(!sign); - auto res = readNarInfo(storePath); auto nar = getFile(res.url); @@ -183,6 +181,15 @@ void BinaryCacheStore::exportPath(const Path & storePath, bool sign, Sink & sink assert(nar.size() % 8 == 0); sink((unsigned char *) nar.c_str(), nar.size()); +} + +void BinaryCacheStore::exportPath(const Path & storePath, bool sign, Sink & sink) +{ + assert(!sign); + + auto res = readNarInfo(storePath); + + dumpPath(storePath, sink); // FIXME: check integrity of NAR. @@ -264,7 +271,7 @@ Path BinaryCacheStore::addToStore(const string & name, const Path & srcPath, StringSink sink; Hash h; if (recursive) { - dumpPath(srcPath, sink, filter); + nix::dumpPath(srcPath, sink, filter); h = hashString(hashAlgo, *sink.s); } else { auto s = readFile(srcPath); diff --git a/src/libstore/binary-cache-store.hh b/src/libstore/binary-cache-store.hh index c99556f33692..f14b4859b04e 100644 --- a/src/libstore/binary-cache-store.hh +++ b/src/libstore/binary-cache-store.hh @@ -124,6 +124,8 @@ public: Path addTextToStore(const string & name, const string & s, const PathSet & references, bool repair = false) override; + void dumpPath(const Path & path, Sink & sink) override; + void exportPath(const Path & path, bool sign, Sink & sink) override; Paths importPaths(bool requireSignature, Source & source, diff --git a/src/libstore/local-fs-store.cc b/src/libstore/local-fs-store.cc index 7094a50a38e1..87c216ec9f95 100644 --- a/src/libstore/local-fs-store.cc +++ b/src/libstore/local-fs-store.cc @@ -1,3 +1,4 @@ +#include "archive.hh" #include "fs-accessor.hh" #include "store-api.hh" @@ -68,4 +69,9 @@ ref<FSAccessor> LocalFSStore::getFSAccessor() return make_ref<LocalStoreAccessor>(ref<Store>(shared_from_this())); } +void LocalFSStore::dumpPath(const Path & path, Sink & sink) +{ + nix::dumpPath(path, sink); +} + } diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 3d10b3387ed5..532d511ef8bf 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -1418,7 +1418,7 @@ Path LocalStore::addToStore(const string & name, const Path & _srcPath, small files. */ StringSink sink; if (recursive) - dumpPath(srcPath, sink, filter); + nix::dumpPath(srcPath, sink, filter); else sink.s = make_ref<std::string>(readFile(srcPath)); diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 82b7cfd7c17d..3c417b4a6d06 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -366,7 +366,7 @@ Path RemoteStore::addToStore(const string & name, const Path & _srcPath, try { conn->to.written = 0; conn->to.warn = true; - dumpPath(srcPath, conn->to, filter); + nix::dumpPath(srcPath, conn->to, filter); conn->to.warn = false; conn->processStderr(); } catch (SysError & e) { diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh index 72b0b0f032db..9a2c9daca08c 100644 --- a/src/libstore/store-api.hh +++ b/src/libstore/store-api.hh @@ -215,6 +215,9 @@ public: virtual Path addTextToStore(const string & name, const string & s, const PathSet & references, bool repair = false) = 0; + /* Write a NAR dump of a store path. */ + virtual void dumpPath(const Path & path, Sink & sink) = 0; + /* Export a store path, that is, create a NAR dump of the store path and append its references and its deriver. Optionally, a cryptographic signature (created by OpenSSL) of the preceding @@ -354,6 +357,8 @@ public: class LocalFSStore : public Store { +public: + void dumpPath(const Path & path, Sink & sink) override; ref<FSAccessor> getFSAccessor() override; }; diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index a258c77c326f..563f0805e08b 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -783,7 +783,9 @@ static void opVerifyPath(Strings opFlags, Strings opArgs) Path path = followLinksToStorePath(i); printMsg(lvlTalkative, format("checking path ‘%1%’...") % path); ValidPathInfo info = store->queryPathInfo(path); - HashResult current = hashPath(info.narHash.type, path); + HashSink sink(info.narHash.type); + store->dumpPath(path, sink); + auto current = sink.finish(); if (current.first != info.narHash) { printMsg(lvlError, format("path ‘%1%’ was modified! expected hash ‘%2%’, got ‘%3%’") |