diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 98b863314..e0de6a968 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -306,7 +306,10 @@ void collectGarbage(GCAction action, PathSet & result) { result.clear(); - bool gcKeepOutputs = queryBoolSetting("gc-keep-outputs", false); + bool gcKeepOutputs = + queryBoolSetting("gc-keep-outputs", false); + bool gcKeepDerivations = + queryBoolSetting("gc-keep-derivations", true); /* Acquire the global GC root. This prevents a) New roots from being added. @@ -330,6 +333,16 @@ void collectGarbage(GCAction action, PathSet & result) for (PathSet::const_iterator i = roots.begin(); i != roots.end(); ++i) computeFSClosure(canonPath(*i), livePaths); + if (gcKeepDerivations) { + for (PathSet::iterator i = livePaths.begin(); + i != livePaths.end(); ++i) + { + Path deriver = queryDeriver(noTxn, *i); + if (deriver != "") + computeFSClosure(deriver, livePaths); + } + } + if (gcKeepOutputs) { /* Hmz, identical to storePathRequisites in nix-store. */ for (PathSet::iterator i = livePaths.begin();