aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/fs-accessor.hh
diff options
context:
space:
mode:
authorregnat <rg@regnat.ovh>2020-12-15 10:54:24 +0100
committerregnat <rg@regnat.ovh>2020-12-15 20:10:46 +0100
commit7080321618e29033a8b5dc2f9fc938dcf2df270d (patch)
treed950e9e64bfa798c23fce3a881f805e7470cae81 /src/libstore/fs-accessor.hh
parentf2f60bf5d6c95453f89e47e01fe0bd6a7fdc85bb (diff)
Use the fs accessor for readInvalidDerivation
Extend `FSAccessor::readFile` to allow not checking that the path is a valid one, and rewrite `readInvalidDerivation` using this extended `readFile`. Several places in the code use `readInvalidDerivation`, either because they need to read a derivation that has been written in the store but not registered yet, or more generally to prevent a deadlock because `readDerivation` tries to lock the state, so can't be called from a place where the lock is already held. However, `readInvalidDerivation` implicitely assumes that the store is a `LocalFSStore`, which isn't always the case. The concrete motivation for this is that it's required for `nix copy --from someBinaryCache` to work, which is tremendously useful for the tests.
Diffstat (limited to 'src/libstore/fs-accessor.hh')
-rw-r--r--src/libstore/fs-accessor.hh9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/libstore/fs-accessor.hh b/src/libstore/fs-accessor.hh
index 64780a6da..c825e84f2 100644
--- a/src/libstore/fs-accessor.hh
+++ b/src/libstore/fs-accessor.hh
@@ -25,7 +25,14 @@ public:
virtual StringSet readDirectory(const Path & path) = 0;
- virtual std::string readFile(const Path & path) = 0;
+ /**
+ * Read a file inside the store.
+ *
+ * If `requireValidPath` is set to `true` (the default), the path must be
+ * inside a valid store path, otherwise it just needs to be physically
+ * present (but not necessarily properly registered)
+ */
+ virtual std::string readFile(const Path & path, bool requireValidPath = true) = 0;
virtual std::string readLink(const Path & path) = 0;
};