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 "util.hh"
#include "worker-protocol.hh"
#include "fs-accessor.hh"
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)
{
res += '"';

View file

@ -13,20 +13,21 @@ LocalFSStore::LocalFSStore(const Params & params)
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);
if (!store->isValidPath(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
{
assertStore(path);
auto realPath = toRealPath(path);
struct stat st;
if (lstat(path.c_str(), &st)) {
@ -47,7 +48,7 @@ struct LocalStoreAccessor : public FSAccessor
StringSet readDirectory(const Path & path) override
{
assertStore(path);
auto realPath = toRealPath(path);
auto entries = nix::readDirectory(path);
@ -60,20 +61,18 @@ struct LocalStoreAccessor : public FSAccessor
std::string readFile(const Path & path) override
{
assertStore(path);
return nix::readFile(path);
return nix::readFile(toRealPath(path));
}
std::string readLink(const Path & path) override
{
assertStore(path);
return nix::readLink(path);
return nix::readLink(toRealPath(path));
}
};
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)

View file

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

View file

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

View file

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