aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/gc.cc20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index 800a3fd19..03d44ebf8 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -654,12 +654,22 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
handle it again. */
if (dead.count(*path)) continue;
+ auto markAlive = [&]()
+ {
+ alive.insert(*path);
+ alive.insert(start);
+ try {
+ StorePathSet closure;
+ computeFSClosure(*path, closure);
+ for (auto & p : closure)
+ alive.insert(p);
+ } catch (InvalidPath &) { }
+ };
+
/* If this is a root, bail out. */
if (roots.count(*path)) {
debug("cannot delete '%s' because it's a root", printStorePath(*path));
- alive.insert(*path);
- alive.insert(start);
- return;
+ return markAlive();
}
if (options.action == GCOptions::gcDeleteSpecific
@@ -671,9 +681,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
auto shared(_shared.lock());
if (shared->tempRoots.count(hashPart)) {
debug("cannot delete '%s' because it's a temporary root", printStorePath(*path));
- alive.insert(*path);
- alive.insert(start);
- return;
+ return markAlive();
}
shared->pending = hashPart;
}