aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/derivations.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/derivations.cc')
-rw-r--r--src/libstore/derivations.cc32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc
index 5bcc7f012..7466c7d41 100644
--- a/src/libstore/derivations.cc
+++ b/src/libstore/derivations.cc
@@ -745,7 +745,7 @@ static void rewriteDerivation(Store & store, BasicDerivation & drv, const String
}
-std::optional<BasicDerivation> Derivation::tryResolve(Store & store) {
+std::optional<BasicDerivation> Derivation::tryResolveUncached(Store & store) {
BasicDerivation resolved { *this };
// Input paths that we'll want to rewrite in the derivation
@@ -771,4 +771,34 @@ std::optional<BasicDerivation> Derivation::tryResolve(Store & store) {
return resolved;
}
+std::optional<BasicDerivation> Derivation::tryResolve(Store& store)
+{
+ auto drvPath = writeDerivation(store, *this, NoRepair, false);
+ return Derivation::tryResolve(store, drvPath);
+}
+
+std::optional<BasicDerivation> Derivation::tryResolve(Store& store, const StorePath& drvPath)
+{
+ // This is quite dirty and leaky, but will disappear once #4340 is merged
+ static Sync<std::map<StorePath, std::optional<Derivation>>> resolutionsCache;
+
+ {
+ auto resolutions = resolutionsCache.lock();
+ auto resolvedDrvIter = resolutions->find(drvPath);
+ if (resolvedDrvIter != resolutions->end()) {
+ auto & [_, resolvedDrv] = *resolvedDrvIter;
+ return *resolvedDrv;
+ }
+ }
+
+ /* Try resolve drv and use that path instead. */
+ auto drv = store.readDerivation(drvPath);
+ auto attempt = drv.tryResolveUncached(store);
+ if (!attempt)
+ return std::nullopt;
+ /* Store in memo table. */
+ resolutionsCache.lock()->insert_or_assign(drvPath, *attempt);
+ return *attempt;
+}
+
}