From b824a1daeefd1611c8d84432dc0b2b38f24bbbfd Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 20 Feb 2007 23:17:20 +0000 Subject: * Start of `nix-store --export' operation for serialising a store path. This is like `nix-store --dump', only it also dumps the meta-information of the store path (references, deriver). Will add a `--sign' flag later to add a cryptographic signature, which we will use for exchanging store paths between build farm machines in a secure manner. --- src/libstore/local-store.cc | 18 ++++++++++++++++++ src/libstore/local-store.hh | 3 +++ src/libstore/remote-store.cc | 7 +++++++ src/libstore/remote-store.hh | 3 +++ src/libstore/store-api.hh | 8 ++++++++ src/nix-store/nix-store.cc | 11 +++++++++++ 6 files changed, 50 insertions(+) diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index cace5cb60b36..dcb430a0fcfd 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -696,6 +696,24 @@ Path LocalStore::addTextToStore(const string & suffix, const string & s, } +void LocalStore::exportPath(const Path & path, bool sign, + Sink & sink) +{ + assertStorePath(path); + + dumpPath(path, sink); + + writeString(path, sink); + + PathSet references; + queryReferences(path, references); + writeStringSet(references, sink); + + Path deriver = queryDeriver(noTxn, path); + writeString(deriver, sink); +} + + void deleteFromStore(const Path & _path, unsigned long long & bytesFreed) { bytesFreed = 0; diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh index 83cb87d451a7..cae9d5c5367f 100644 --- a/src/libstore/local-store.hh +++ b/src/libstore/local-store.hh @@ -56,6 +56,9 @@ public: Path addTextToStore(const string & suffix, const string & s, const PathSet & references); + void exportPath(const Path & path, bool sign, + Sink & sink); + void buildDerivations(const PathSet & drvPaths); void ensurePath(const Path & path); diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index e6b34c9b8b27..2fb4dd9802f7 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -243,6 +243,13 @@ Path RemoteStore::addTextToStore(const string & suffix, const string & s, } +void RemoteStore::exportPath(const Path & path, bool sign, + Sink & sink) +{ + throw Error("not implemented"); +} + + void RemoteStore::buildDerivations(const PathSet & drvPaths) { writeInt(wopBuildDerivations, to); diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh index 42d4e94e2a5b..69fae2cd1601 100644 --- a/src/libstore/remote-store.hh +++ b/src/libstore/remote-store.hh @@ -44,6 +44,9 @@ public: Path addTextToStore(const string & suffix, const string & s, const PathSet & references); + void exportPath(const Path & path, bool sign, + Sink & sink); + void buildDerivations(const PathSet & drvPaths); void ensurePath(const Path & path); diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh index 361e7aaa1aee..6a1de616ca59 100644 --- a/src/libstore/store-api.hh +++ b/src/libstore/store-api.hh @@ -7,6 +7,7 @@ #include #include "hash.hh" +#include "serialise.hh" namespace nix { @@ -91,6 +92,13 @@ public: virtual Path addTextToStore(const string & suffix, const string & s, const PathSet & references) = 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 + data is attached. */ + virtual void exportPath(const Path & path, bool sign, + Sink & sink) = 0; + /* Ensure that the output paths of the derivation are valid. If they are already valid, this is a no-op. Otherwise, validity can be reached in two ways. First, if the output paths have diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index f0b3f5b615f3..821124324f47 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -638,6 +638,15 @@ static void opRestore(Strings opFlags, Strings opArgs) } +static void opExport(Strings opFlags, Strings opArgs) +{ + if (!opFlags.empty()) throw UsageError("unknown flag"); + + FdSink sink(STDOUT_FILENO); + store->exportPath(*opArgs.begin(), false, sink); +} + + /* Initialise the Nix databases. */ static void opInit(Strings opFlags, Strings opArgs) { @@ -707,6 +716,8 @@ void run(Strings args) op = opDump; else if (arg == "--restore") op = opRestore; + else if (arg == "--export") + op = opExport; else if (arg == "--init") op = opInit; else if (arg == "--verify") -- cgit 1.4.1