nix-collect-garbage: Revive --max-freed

Fixes #609.
This commit is contained in:
Eelco Dolstra 2015-08-21 13:57:53 +02:00
parent 1d29db2a9f
commit eadb86f447
3 changed files with 11 additions and 18 deletions

View file

@ -2,20 +2,10 @@
#include "globals.hh" #include "globals.hh"
#include "util.hh" #include "util.hh"
#include <climits>
namespace nix { namespace nix {
GCOptions::GCOptions()
{
action = gcDeleteDead;
ignoreLiveness = false;
maxFreed = ULLONG_MAX;
}
bool isInStore(const Path & path) bool isInStore(const Path & path)
{ {
return isInDir(path, settings.nixStore); return isInDir(path, settings.nixStore);

View file

@ -4,6 +4,7 @@
#include "serialise.hh" #include "serialise.hh"
#include <string> #include <string>
#include <limits>
#include <map> #include <map>
#include <memory> #include <memory>
@ -36,21 +37,19 @@ struct GCOptions
gcDeleteSpecific, gcDeleteSpecific,
} GCAction; } GCAction;
GCAction action; GCAction action{gcDeleteDead};
/* If `ignoreLiveness' is set, then reachability from the roots is /* If `ignoreLiveness' is set, then reachability from the roots is
ignored (dangerous!). However, the paths must still be ignored (dangerous!). However, the paths must still be
unreferenced *within* the store (i.e., there can be no other unreferenced *within* the store (i.e., there can be no other
store paths that depend on them). */ store paths that depend on them). */
bool ignoreLiveness; bool ignoreLiveness{false};
/* For `gcDeleteSpecific', the paths to delete. */ /* For `gcDeleteSpecific', the paths to delete. */
PathSet pathsToDelete; PathSet pathsToDelete;
/* Stop after at least `maxFreed' bytes have been freed. */ /* Stop after at least `maxFreed' bytes have been freed. */
unsigned long long maxFreed; unsigned long long maxFreed{std::numeric_limits<unsigned long long>::max()};
GCOptions();
}; };

View file

@ -50,11 +50,12 @@ void removeOldGenerations(std::string dir)
int main(int argc, char * * argv) int main(int argc, char * * argv)
{ {
bool removeOld = false; bool removeOld = false;
Strings extraArgs;
return handleExceptions(argv[0], [&]() { return handleExceptions(argv[0], [&]() {
initNix(); initNix();
GCOptions options;
parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) { parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
if (*arg == "--help") if (*arg == "--help")
showManPage("nix-collect-garbage"); showManPage("nix-collect-garbage");
@ -66,8 +67,12 @@ int main(int argc, char * * argv)
deleteOlderThan = getArg(*arg, arg, end); deleteOlderThan = getArg(*arg, arg, end);
} }
else if (*arg == "--dry-run") dryRun = true; else if (*arg == "--dry-run") dryRun = true;
else if (*arg == "--max-freed") {
long long maxFreed = getIntArg<long long>(*arg, arg, end, true);
options.maxFreed = maxFreed >= 0 ? maxFreed : 0;
}
else else
extraArgs.push_back(*arg); return false;
return true; return true;
}); });
@ -77,7 +82,6 @@ int main(int argc, char * * argv)
// Run the actual garbage collector. // Run the actual garbage collector.
if (!dryRun) { if (!dryRun) {
store = openStore(false); store = openStore(false);
GCOptions options;
options.action = GCOptions::gcDeleteDead; options.action = GCOptions::gcDeleteDead;
GCResults results; GCResults results;
PrintFreed freed(true, results); PrintFreed freed(true, results);