Make derivationFromPath work on diverted stores

This commit is contained in:
Eelco Dolstra 2016-06-02 18:43:36 +02:00
parent eda2aaae92
commit d64e0c1b64
5 changed files with 27 additions and 18 deletions

View file

@ -3,6 +3,7 @@
#include "globals.hh" #include "globals.hh"
#include "util.hh" #include "util.hh"
#include "worker-protocol.hh" #include "worker-protocol.hh"
#include "fs-accessor.hh"
namespace nix { namespace nix {
@ -164,6 +165,19 @@ Derivation readDerivation(const Path & drvPath)
} }
Derivation Store::derivationFromPath(const Path & drvPath)
{
assertStorePath(drvPath);
ensurePath(drvPath);
auto accessor = getFSAccessor();
try {
return parseDerivation(accessor->readFile(drvPath));
} catch (FormatError & e) {
throw Error(format("error parsing derivation %1%: %2%") % drvPath % e.msg());
}
}
static void printString(string & res, const string & s) static void printString(string & res, const string & s)
{ {
res += '"'; res += '"';

View file

@ -13,20 +13,21 @@ LocalFSStore::LocalFSStore(const Params & params)
struct LocalStoreAccessor : public FSAccessor struct LocalStoreAccessor : public FSAccessor
{ {
ref<Store> store; ref<LocalFSStore> store;
LocalStoreAccessor(ref<Store> store) : store(store) { } LocalStoreAccessor(ref<LocalFSStore> store) : store(store) { }
void assertStore(const Path & path) Path toRealPath(const Path & path)
{ {
Path storePath = store->toStorePath(path); Path storePath = store->toStorePath(path);
if (!store->isValidPath(storePath)) if (!store->isValidPath(storePath))
throw Error(format("path %1% is not a valid store path") % storePath); throw Error(format("path %1% is not a valid store path") % storePath);
return store->getRealStoreDir() + std::string(path, store->storeDir.size());
} }
FSAccessor::Stat stat(const Path & path) override FSAccessor::Stat stat(const Path & path) override
{ {
assertStore(path); auto realPath = toRealPath(path);
struct stat st; struct stat st;
if (lstat(path.c_str(), &st)) { if (lstat(path.c_str(), &st)) {
@ -47,7 +48,7 @@ struct LocalStoreAccessor : public FSAccessor
StringSet readDirectory(const Path & path) override StringSet readDirectory(const Path & path) override
{ {
assertStore(path); auto realPath = toRealPath(path);
auto entries = nix::readDirectory(path); auto entries = nix::readDirectory(path);
@ -60,20 +61,18 @@ struct LocalStoreAccessor : public FSAccessor
std::string readFile(const Path & path) override std::string readFile(const Path & path) override
{ {
assertStore(path); return nix::readFile(toRealPath(path));
return nix::readFile(path);
} }
std::string readLink(const Path & path) override std::string readLink(const Path & path) override
{ {
assertStore(path); return nix::readLink(toRealPath(path));
return nix::readLink(path);
} }
}; };
ref<FSAccessor> LocalFSStore::getFSAccessor() ref<FSAccessor> LocalFSStore::getFSAccessor()
{ {
return make_ref<LocalStoreAccessor>(ref<Store>(shared_from_this())); return make_ref<LocalStoreAccessor>(ref<LocalFSStore>(std::dynamic_pointer_cast<LocalFSStore>(shared_from_this())));
} }
void LocalFSStore::narFromPath(const Path & path, Sink & sink) void LocalFSStore::narFromPath(const Path & path, Sink & sink)

View file

@ -261,6 +261,8 @@ private:
specified by the secret-key-files option. */ specified by the secret-key-files option. */
void signPathInfo(ValidPathInfo & info); void signPathInfo(ValidPathInfo & info);
Path getRealStoreDir() override { return realStoreDir; }
friend class DerivationGoal; friend class DerivationGoal;
friend class SubstitutionGoal; friend class SubstitutionGoal;
}; };

View file

@ -7,14 +7,6 @@
namespace nix { namespace nix {
Derivation Store::derivationFromPath(const Path & drvPath)
{
assertStorePath(drvPath);
ensurePath(drvPath);
return readDerivation(drvPath);
}
void Store::computeFSClosure(const Path & path, void Store::computeFSClosure(const Path & path,
PathSet & paths, bool flipDirection, bool includeOutputs, bool includeDerivers) PathSet & paths, bool flipDirection, bool includeOutputs, bool includeDerivers)
{ {

View file

@ -501,6 +501,8 @@ public:
/* Register a permanent GC root. */ /* Register a permanent GC root. */
Path addPermRoot(const Path & storePath, Path addPermRoot(const Path & storePath,
const Path & gcRoot, bool indirect, bool allowOutsideRootsDir = false); const Path & gcRoot, bool indirect, bool allowOutsideRootsDir = false);
virtual Path getRealStoreDir() { return storeDir; }
}; };