aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libstore/gc.cc5
-rw-r--r--src/libstore/gc.hh2
-rw-r--r--src/nix-store/main.cc11
3 files changed, 12 insertions, 6 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index c02f59f2c..5f4f5b27f 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -304,7 +304,7 @@ static Paths topoSort(const PathSet & paths)
void collectGarbage(GCAction action, const PathSet & pathsToDelete,
- PathSet & result, unsigned long long & bytesFreed)
+ bool ignoreLiveness, PathSet & result, unsigned long long & bytesFreed)
{
result.clear();
bytesFreed = 0;
@@ -323,7 +323,8 @@ void collectGarbage(GCAction action, const PathSet & pathsToDelete,
permanent roots cannot increase now. */
Path rootsDir = canonPath((format("%1%/%2%") % nixStateDir % gcRootsDir).str());
PathSet roots;
- findRoots(rootsDir, true, roots);
+ if (!ignoreLiveness)
+ findRoots(rootsDir, true, roots);
if (action == gcReturnRoots) {
result = roots;
diff --git a/src/libstore/gc.hh b/src/libstore/gc.hh
index b05d88f93..c6b13bc47 100644
--- a/src/libstore/gc.hh
+++ b/src/libstore/gc.hh
@@ -21,7 +21,7 @@ typedef enum {
set of paths not reachable from the roots. If `action' is
`gcDeleteDead', actually delete the latter set. */
void collectGarbage(GCAction action, const PathSet & pathsToDelete,
- PathSet & result, unsigned long long & bytesFreed);
+ bool ignoreLiveness, PathSet & result, unsigned long long & bytesFreed);
/* Register a temporary GC root. This root will automatically
disappear when this process exits. WARNING: this function should
diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc
index 6f1fab13d..88e6720c0 100644
--- a/src/nix-store/main.cc
+++ b/src/nix-store/main.cc
@@ -518,7 +518,7 @@ static void opGC(Strings opFlags, Strings opArgs)
PathSet result;
PrintFreed freed(action == gcDeleteDead);
- collectGarbage(action, PathSet(), result, freed.bytesFreed);
+ collectGarbage(action, PathSet(), false, result, freed.bytesFreed);
if (action != gcDeleteDead) {
for (PathSet::iterator i = result.begin(); i != result.end(); ++i)
@@ -532,7 +532,12 @@ static void opGC(Strings opFlags, Strings opArgs)
roots). */
static void opDelete(Strings opFlags, Strings opArgs)
{
- if (!opFlags.empty()) throw UsageError("unknown flag");
+ bool ignoreLiveness;
+
+ for (Strings::iterator i = opFlags.begin();
+ i != opFlags.end(); ++i)
+ if (*i == "--ignore-liveness") ignoreLiveness = true;
+ else throw UsageError(format("unknown flag `%1%'") % *i);
PathSet pathsToDelete;
for (Strings::iterator i = opArgs.begin();
@@ -541,7 +546,7 @@ static void opDelete(Strings opFlags, Strings opArgs)
PathSet dummy;
PrintFreed freed(true);
- collectGarbage(gcDeleteSpecific, pathsToDelete,
+ collectGarbage(gcDeleteSpecific, pathsToDelete, ignoreLiveness,
dummy, freed.bytesFreed);
}