diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index cace5cb60b..dcb430a0fc 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 83cb87d451..cae9d5c536 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 e6b34c9b8b..2fb4dd9802 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 42d4e94e2a..69fae2cd16 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 361e7aaa1a..6a1de616ca 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 f0b3f5b615..821124324f 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")