Implement nar-based addToStore for remote-store

This commit is contained in:
Shea Levy 2016-09-02 14:33:58 -04:00
parent ecba88de93
commit 584f8a62de
3 changed files with 31 additions and 2 deletions

View file

@ -345,7 +345,12 @@ Path RemoteStore::queryPathFromHashPart(const string & hashPart)
void RemoteStore::addToStore(const ValidPathInfo & info, const std::string & nar, void RemoteStore::addToStore(const ValidPathInfo & info, const std::string & nar,
bool repair, bool dontCheckSigs) bool repair, bool dontCheckSigs)
{ {
throw Error("RemoteStore::addToStore() not implemented"); auto conn(connections->get());
conn->to << wopAddToStoreNar
<< info.path << info.deriver << printHash(info.narHash)
<< info.references << info.registrationTime << info.narSize
<< info.ultimate << info.sigs << nar << repair << dontCheckSigs;
conn->processStderr();
} }

View file

@ -46,7 +46,8 @@ typedef enum {
wopVerifyStore = 35, wopVerifyStore = 35,
wopBuildDerivation = 36, wopBuildDerivation = 36,
wopAddSignatures = 37, wopAddSignatures = 37,
wopNarFromPath = 38 wopNarFromPath = 38,
wopAddToStoreNar = 39
} WorkerOp; } WorkerOp;

View file

@ -579,7 +579,30 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
case wopNarFromPath: { case wopNarFromPath: {
auto path = readStorePath(*store, from); auto path = readStorePath(*store, from);
startWork(); startWork();
stopWork();
dumpPath(path, to); dumpPath(path, to);
break;
}
case wopAddToStoreNar: {
ValidPathInfo info;
info.path = readStorePath(*store, from);
info.deriver = readString(from);
if (!info.deriver.empty())
store->assertStorePath(info.deriver);
info.narHash = parseHash(htSHA256, readString(from));
info.references = readStorePaths<PathSet>(*store, from);
info.registrationTime = readInt(from);
info.narSize = readLongLong(from);
info.ultimate = readLongLong(from);
info.sigs = readStrings<StringSet>(from);
auto nar = readString(from);
auto repair = readInt(from) ? true : false;
auto dontCheckSigs = readInt(from) ? true : false;
if (!trusted && dontCheckSigs)
dontCheckSigs = false;
startWork();
store->addToStore(info, nar, repair, dontCheckSigs);
stopWork(); stopWork();
break; break;
} }