diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-06-02 18:43:36 +0200 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-06-02 18:43:36 +0200 |
commit | d64e0c1b64dc20b02fae335397213d1ca17d9d56 (patch) | |
tree | f667d3e2249ed3b8240c7a48e895fb540c3be550 /src/libstore/local-fs-store.cc | |
parent | eda2aaae92c54892e70fff2958698e68a8204d35 (diff) |
Make derivationFromPath work on diverted stores
Diffstat (limited to 'src/libstore/local-fs-store.cc')
-rw-r--r-- | src/libstore/local-fs-store.cc | 19 |
1 files changed, 9 insertions, 10 deletions
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> 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) |