diff options
Diffstat (limited to 'src/nix-store/main.cc')
-rw-r--r-- | src/nix-store/main.cc | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc index 8bb1b1254365..6f1fab13de36 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, result, freed.bytesFreed); + collectGarbage(action, PathSet(), result, freed.bytesFreed); if (action != gcDeleteDead) { for (PathSet::iterator i = result.begin(); i != result.end(); ++i) @@ -527,6 +527,25 @@ static void opGC(Strings opFlags, Strings opArgs) } +/* Remove paths from the Nix store if possible (i.e., if they do not + have any remaining referrers and are not reachable from any GC + roots). */ +static void opDelete(Strings opFlags, Strings opArgs) +{ + if (!opFlags.empty()) throw UsageError("unknown flag"); + + PathSet pathsToDelete; + for (Strings::iterator i = opArgs.begin(); + i != opArgs.end(); ++i) + pathsToDelete.insert(fixPath(*i)); + + PathSet dummy; + PrintFreed freed(true); + collectGarbage(gcDeleteSpecific, pathsToDelete, + dummy, freed.bytesFreed); +} + + /* A sink that writes dump output to stdout. */ struct StdoutSink : DumpSink { @@ -621,6 +640,8 @@ void run(Strings args) op = opAddFixed; else if (arg == "--print-fixed-path") op = opPrintFixedPath; + else if (arg == "--delete") + op = opDelete; else if (arg == "--query" || arg == "-q") op = opQuery; else if (arg == "--register-substitutes") |