From d64e0c1b64dc20b02fae335397213d1ca17d9d56 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 2 Jun 2016 18:43:36 +0200 Subject: [PATCH] Make derivationFromPath work on diverted stores --- src/libstore/derivations.cc | 14 ++++++++++++++ src/libstore/local-fs-store.cc | 19 +++++++++---------- src/libstore/local-store.hh | 2 ++ src/libstore/misc.cc | 8 -------- src/libstore/store-api.hh | 2 ++ 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc index 8067e412a..5590b99b3 100644 --- a/src/libstore/derivations.cc +++ b/src/libstore/derivations.cc @@ -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 += '"'; diff --git a/src/libstore/local-fs-store.cc b/src/libstore/local-fs-store.cc index a19e4ce5d..b1b9dc29e 100644 --- a/src/libstore/local-fs-store.cc +++ b/src/libstore/local-fs-store.cc @@ -13,20 +13,21 @@ LocalFSStore::LocalFSStore(const Params & params) struct LocalStoreAccessor : public FSAccessor { - ref store; + ref store; - LocalStoreAccessor(ref store) : store(store) { } + LocalStoreAccessor(ref 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 LocalFSStore::getFSAccessor() { - return make_ref(ref(shared_from_this())); + return make_ref(ref(std::dynamic_pointer_cast(shared_from_this()))); } void LocalFSStore::narFromPath(const Path & path, Sink & sink) diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh index 0c2766f66..7bfc4ad34 100644 --- a/src/libstore/local-store.hh +++ b/src/libstore/local-store.hh @@ -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; }; diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc index 5c284d1b9..114ab565e 100644 --- a/src/libstore/misc.cc +++ b/src/libstore/misc.cc @@ -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) { diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh index b665babc0..7ef01ea93 100644 --- a/src/libstore/store-api.hh +++ b/src/libstore/store-api.hh @@ -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; } };