* `nix-store --gc --print-dead': print the total size of the store

objects that would be freed.
This commit is contained in:
Eelco Dolstra 2006-08-11 20:26:49 +00:00
parent 92f7dfa5b7
commit 4250b641d8
2 changed files with 19 additions and 5 deletions

View file

@ -515,6 +515,15 @@ void collectGarbage(GCAction action, const PathSet & pathsToDelete,
debug(format("dead path `%1%'") % *i); debug(format("dead path `%1%'") % *i);
result.insert(*i); result.insert(*i);
/* If just returning the set of dead paths, we also return the
space that would be freed if we deleted them. */
if (action == gcReturnDead) {
struct stat st;
if (lstat(i->c_str(), &st) == -1)
st.st_size = 0;
bytesFreed += st.st_size;
}
if (action == gcDeleteDead || action == gcDeleteSpecific) { if (action == gcDeleteDead || action == gcDeleteSpecific) {
#ifndef __CYGWIN__ #ifndef __CYGWIN__

View file

@ -492,13 +492,17 @@ static void opCheckValidity(Strings opFlags, Strings opArgs)
struct PrintFreed struct PrintFreed
{ {
bool show; bool show, dryRun;
unsigned long long bytesFreed; unsigned long long bytesFreed;
PrintFreed(bool _show) : bytesFreed(0), show(_show) { } PrintFreed(bool show, bool dryRun)
: bytesFreed(0), show(show), dryRun(dryRun) { }
~PrintFreed() ~PrintFreed()
{ {
if (show) if (show)
cout << format("%d bytes freed (%.2f MiB)\n") cout << format(
(dryRun
? "%d bytes would be freed (%.2f MiB)\n"
: "%d bytes freed (%.2f MiB)\n"))
% bytesFreed % (bytesFreed / (1024.0 * 1024.0)); % bytesFreed % (bytesFreed / (1024.0 * 1024.0));
} }
}; };
@ -518,7 +522,8 @@ static void opGC(Strings opFlags, Strings opArgs)
else throw UsageError(format("bad sub-operation `%1%' in GC") % *i); else throw UsageError(format("bad sub-operation `%1%' in GC") % *i);
PathSet result; PathSet result;
PrintFreed freed(action == gcDeleteDead); PrintFreed freed(action == gcDeleteDead || action == gcReturnDead,
action == gcReturnDead);
collectGarbage(action, PathSet(), false, result, freed.bytesFreed); collectGarbage(action, PathSet(), false, result, freed.bytesFreed);
if (action != gcDeleteDead) { if (action != gcDeleteDead) {
@ -546,7 +551,7 @@ static void opDelete(Strings opFlags, Strings opArgs)
pathsToDelete.insert(fixPath(*i)); pathsToDelete.insert(fixPath(*i));
PathSet dummy; PathSet dummy;
PrintFreed freed(true); PrintFreed freed(true, false);
collectGarbage(gcDeleteSpecific, pathsToDelete, ignoreLiveness, collectGarbage(gcDeleteSpecific, pathsToDelete, ignoreLiveness,
dummy, freed.bytesFreed); dummy, freed.bytesFreed);
} }