aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/misc.cc
diff options
context:
space:
mode:
authorMatthew Bauer <mjbauer95@gmail.com>2020-06-12 09:49:09 -0500
committerMatthew Bauer <mjbauer95@gmail.com>2020-06-12 09:49:09 -0500
commit79c169d1c615211af69c1cbc6218f7465a4f81ed (patch)
treea5d96334bf6d52054fd9eefa5e2f9b23b1a3ef59 /src/libstore/misc.cc
parentd558fb98f6f8ce32e5c08a36d798441f1b941ba8 (diff)
Allow substituting from different storeDir
Substituters can substitute from one store dir to another with a little bit of help. The store api just needs to have a CA so it can recompute the store path based on the new store dir. We can only do this for fixed output derivations with no references, though.
Diffstat (limited to 'src/libstore/misc.cc')
-rw-r--r--src/libstore/misc.cc27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc
index 9c47fe524..1b0a055d3 100644
--- a/src/libstore/misc.cc
+++ b/src/libstore/misc.cc
@@ -108,6 +108,27 @@ void Store::computeFSClosure(const StorePath & startPath,
}
+static std::optional<std::string> getDerivationCA(ref<Derivation> drv)
+{
+ auto outputHashMode = drv->env.find("outputHashMode");
+ auto outputHashAlgo = drv->env.find("outputHashAlgo");
+ auto outputHash = drv->env.find("outputHash");
+ if (outputHashMode != drv->env.end() && outputHashAlgo != drv->env.end() && outputHash != drv->env.end()) {
+ auto ht = parseHashType(outputHashAlgo->second);
+ auto h = Hash(outputHash->second, ht);
+ FileIngestionMethod ingestionMethod;
+ if (outputHashMode->second == "recursive")
+ ingestionMethod = FileIngestionMethod::Recursive;
+ else if (outputHashMode->second == "flat")
+ ingestionMethod = FileIngestionMethod::Flat;
+ else
+ throw Error("unknown ingestion method: '%s'", outputHashMode->second);
+ return makeFixedOutputCA(ingestionMethod, h);
+ }
+
+ return std::nullopt;
+}
+
void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
StorePathSet & willBuild_, StorePathSet & willSubstitute_, StorePathSet & unknown_,
unsigned long long & downloadSize_, unsigned long long & narSize_)
@@ -159,7 +180,11 @@ void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
SubstitutablePathInfos infos;
StorePathSet paths; // FIXME
paths.insert(outPath.clone());
- querySubstitutablePathInfos(paths, infos);
+
+ std::map<std::string, std::string> pathsCA = {};
+ if (auto ca = getDerivationCA(drv))
+ pathsCA.insert({outPathS, *ca});
+ querySubstitutablePathInfos(paths, infos, pathsCA);
if (infos.empty()) {
drvState_->lock()->done = true;