aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-09-03 12:56:59 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2015-09-03 12:56:59 +0200
commit71a5161365f40699092e491bbff88473237fc432 (patch)
tree02d1303475e895283707e5548d4d93385730d222
parent6e06a18d1b45ab50f54f527570aeff40201090ff (diff)
Implement buildDerivation() via the daemon
-rw-r--r--src/libstore/remote-store.cc10
-rw-r--r--src/libstore/worker-protocol.hh3
-rw-r--r--src/libutil/serialise.cc7
-rw-r--r--src/libutil/serialise.hh1
-rw-r--r--src/nix-daemon/nix-daemon.cc15
5 files changed, 34 insertions, 2 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index fdb0975ac..ed9895ac8 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -5,6 +5,7 @@
#include "archive.hh"
#include "affinity.hh"
#include "globals.hh"
+#include "derivations.hh"
#include <sys/types.h>
#include <sys/stat.h>
@@ -458,7 +459,14 @@ void RemoteStore::buildPaths(const PathSet & drvPaths, BuildMode buildMode)
BuildResult RemoteStore::buildDerivation(const Path & drvPath, const BasicDerivation & drv,
BuildMode buildMode)
{
- throw Error("not implemented");
+ openConnection();
+ to << wopBuildDerivation << drvPath << drv << buildMode;
+ processStderr();
+ BuildResult res;
+ unsigned int status;
+ from >> status >> res.errorMsg;
+ res.status = (BuildResult::Status) status;
+ return res;
}
diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh
index d037d7402..5a0ef5117 100644
--- a/src/libstore/worker-protocol.hh
+++ b/src/libstore/worker-protocol.hh
@@ -43,7 +43,8 @@ typedef enum {
wopQuerySubstitutablePaths = 32,
wopQueryValidDerivers = 33,
wopOptimiseStore = 34,
- wopVerifyStore = 35
+ wopVerifyStore = 35,
+ wopBuildDerivation = 36,
} WorkerOp;
diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc
index f8e9d00c1..f136a1324 100644
--- a/src/libutil/serialise.cc
+++ b/src/libutil/serialise.cc
@@ -248,6 +248,13 @@ Source & operator >> (Source & in, string & s)
}
+Source & operator >> (Source & in, unsigned int & n)
+{
+ n = readInt(in);
+ return in;
+}
+
+
template<class T> T readStrings(Source & source)
{
unsigned int count = readInt(source);
diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh
index 97ac3e912..979ff849f 100644
--- a/src/libutil/serialise.hh
+++ b/src/libutil/serialise.hh
@@ -143,6 +143,7 @@ string readString(Source & source);
template<class T> T readStrings(Source & source);
Source & operator >> (Source & in, string & s);
+Source & operator >> (Source & in, unsigned int & n);
MakeError(SerialisationError, Error)
diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc
index 199d3288f..aaae691e9 100644
--- a/src/nix-daemon/nix-daemon.cc
+++ b/src/nix-daemon/nix-daemon.cc
@@ -7,6 +7,7 @@
#include "affinity.hh"
#include "globals.hh"
#include "monitor-fd.hh"
+#include "derivations.hh"
#include <algorithm>
@@ -325,6 +326,20 @@ static void performOp(bool trusted, unsigned int clientVersion,
break;
}
+ case wopBuildDerivation: {
+ Path drvPath = readStorePath(from);
+ BasicDerivation drv;
+ from >> drv;
+ BuildMode buildMode = (BuildMode) readInt(from);
+ startWork();
+ if (!trusted)
+ throw Error("you are not privileged to build derivations");
+ auto res = store->buildDerivation(drvPath, drv, buildMode);
+ stopWork();
+ to << res.status << res.errorMsg;
+ break;
+ }
+
case wopEnsurePath: {
Path path = readStorePath(from);
startWork();