aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/local-fs-store.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-06-02 18:43:36 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-06-02 18:43:36 +0200
commitd64e0c1b64dc20b02fae335397213d1ca17d9d56 (patch)
treef667d3e2249ed3b8240c7a48e895fb540c3be550 /src/libstore/local-fs-store.cc
parenteda2aaae92c54892e70fff2958698e68a8204d35 (diff)
Make derivationFromPath work on diverted stores
Diffstat (limited to 'src/libstore/local-fs-store.cc')
-rw-r--r--src/libstore/local-fs-store.cc19
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)