aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2016-10-07 19:15:25 +0200
committerEelco Dolstra <edolstra@gmail.com>2016-10-07 19:15:25 +0200
commit35db4f65a0f2ccbcaaef719e52b895fa78cad361 (patch)
tree49cd1bd79c53bc14502ea3fb11297549a0aa620c /src
parent629ab8002218e9b526d947a9b7a2eccddc3f331c (diff)
Add copyClosure utility function for Hydra
Diffstat (limited to 'src')
-rw-r--r--src/libstore/store-api.cc24
-rw-r--r--src/libstore/store-api.hh5
2 files changed, 29 insertions, 0 deletions
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index 90e174715..74014b47e 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -414,6 +414,30 @@ void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
}
+void copyClosure(ref<Store> srcStore, ref<Store> dstStore,
+ const PathSet & storePaths, bool repair)
+{
+ PathSet closure;
+ for (auto & path : storePaths)
+ srcStore->computeFSClosure(path, closure);
+
+ PathSet valid = dstStore->queryValidPaths(closure);
+
+ if (valid.size() == closure.size()) return;
+
+ Paths sorted = srcStore->topoSortPaths(closure);
+
+ Paths missing;
+ for (auto i = sorted.rbegin(); i != sorted.rend(); ++i)
+ if (!valid.count(*i)) missing.push_back(*i);
+
+ printMsg(lvlDebug, format("copying %1% missing paths") % missing.size());
+
+ for (auto & i : missing)
+ copyStorePath(srcStore, dstStore, i, repair);
+}
+
+
ValidPathInfo decodeValidPathInfo(std::istream & str, bool hashGiven)
{
ValidPathInfo info;
diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh
index 8efacfd18..b876ffbba 100644
--- a/src/libstore/store-api.hh
+++ b/src/libstore/store-api.hh
@@ -585,6 +585,11 @@ void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
const Path & storePath, bool repair = false);
+/* Copy the closure of the specified paths from one store to another. */
+void copyClosure(ref<Store> srcStore, ref<Store> dstStore,
+ const PathSet & storePaths, bool repair = false);
+
+
/* Remove the temporary roots file for this process. Any temporary
root becomes garbage after this point unless it has been registered
as a (permanent) root. */