aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/local-store.cc18
-rw-r--r--src/libstore/local-store.hh3
-rw-r--r--src/libstore/remote-store.cc7
-rw-r--r--src/libstore/remote-store.hh3
-rw-r--r--src/libstore/store-api.hh8
-rw-r--r--src/nix-store/nix-store.cc11
6 files changed, 50 insertions, 0 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index cace5cb60..dcb430a0f 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 83cb87d45..cae9d5c53 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 e6b34c9b8..2fb4dd980 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 42d4e94e2..69fae2cd1 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 361e7aaa1..6a1de616c 100644
--- a/src/libstore/store-api.hh
+++ b/src/libstore/store-api.hh
@@ -7,6 +7,7 @@
#include <boost/shared_ptr.hpp>
#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 f0b3f5b61..821124324 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")