1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-25 06:31:14 +02:00

nix-collect-garbage: Don't call nix-env

Also, make sure --delete-older-than doesn't delete the current
generation.
This commit is contained in:
Eelco Dolstra 2015-05-21 16:26:03 +02:00
parent 22b1a8d43f
commit 4ca5a9dcfd
4 changed files with 110 additions and 69 deletions

View file

@ -1262,73 +1262,24 @@ static void opListGenerations(Globals & globals, Strings opFlags, Strings opArgs
}
static void deleteGeneration2(Globals & globals, unsigned int gen)
{
if (globals.dryRun)
printMsg(lvlInfo, format("would remove generation %1%") % gen);
else {
printMsg(lvlInfo, format("removing generation %1%") % gen);
deleteGeneration(globals.profile, gen);
}
}
static void opDeleteGenerations(Globals & globals, Strings opFlags, Strings opArgs)
{
if (opFlags.size() > 0)
throw UsageError(format("unknown flag %1%") % opFlags.front());
PathLocks lock;
lockProfile(lock, globals.profile);
int curGen;
Generations gens = findGenerations(globals.profile, curGen);
for (Strings::iterator i = opArgs.begin(); i != opArgs.end(); ++i) {
if (*i == "old") {
for (Generations::iterator j = gens.begin(); j != gens.end(); ++j)
if (j->number != curGen)
deleteGeneration2(globals, j->number);
} else if (i->size() >= 2 && tolower(*i->rbegin()) == 'd') {
time_t curTime = time(NULL);
time_t oldTime;
string strDays = string(*i, 0, i->size() - 1);
int days;
if (!string2Int(strDays, days) || days < 1)
throw UsageError(format("invalid number of days specifier %1%") % *i);
oldTime = curTime - days * 24 * 3600;
bool canDelete = false;
for (Generations::reverse_iterator j = gens.rbegin(); j != gens.rend(); ++j) {
if (canDelete) {
assert(j->creationTime < oldTime);
deleteGeneration2(globals, j->number);
} else if (j->creationTime < oldTime) {
/* We may now start deleting generations, but we don't delete
this generation yet, because this generation was still the
one that was active at the requested point in time. */
canDelete = true;
}
}
} else {
int n;
if (!string2Int(*i, n) || n < 0)
throw UsageError(format("invalid generation specifier %1%") % *i);
bool found = false;
for (Generations::iterator j = gens.begin(); j != gens.end(); ++j) {
if (j->number == n) {
deleteGeneration2(globals, j->number);
found = true;
break;
}
}
if (!found)
printMsg(lvlError, format("generation %1% does not exist") % n);
if (opArgs.size() == 1 && opArgs.front() == "old") {
deleteOldGenerations(globals.profile, globals.dryRun);
} else if (opArgs.size() == 1 && opArgs.front().find('d') != string::npos) {
deleteGenerationsOlderThan(globals.profile, opArgs.front(), globals.dryRun);
} else {
std::set<unsigned int> gens;
for (auto & i : opArgs) {
unsigned int n;
if (!string2Int(i, n) || n < 0)
throw UsageError(format("invalid generation number %1%") % i);
gens.insert(n);
}
deleteGenerations(globals.profile, gens, globals.dryRun);
}
}