From dcc433de47d4bf4a27fe63bc8996e946164ae885 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 10 Sep 2004 13:32:08 +0000 Subject: * Operation `--delete-generations' to delete generations of a profile. Arguments are either generation number, or `old' to delete all non-current generations. Typical use: $ nix-env --delete-generations old $ nix-collect-garbage * istringstream -> string2Int. --- src/nix-env/main.cc | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) (limited to 'src/nix-env/main.cc') diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc index 14aa13b866bc..cf4ac8fc4a7b 100644 --- a/src/nix-env/main.cc +++ b/src/nix-env/main.cc @@ -643,10 +643,8 @@ static void opSwitchGeneration(Globals & globals, if (opArgs.size() != 1) throw UsageError(format("exactly one argument expected")); - istringstream str(opArgs.front()); int dstGen; - str >> dstGen; - if (!str || !str.eof()) + if (!string2Int(opArgs.front(), dstGen)) throw UsageError(format("expected a generation number")); switchGeneration(globals, dstGen); @@ -688,6 +686,49 @@ static void opListGenerations(Globals & globals, } +static void deleteGeneration2(const Path & profile, unsigned int gen) +{ + printMsg(lvlInfo, format("removing generation %1%") % gen); + deleteGeneration(profile, gen); +} + + +static void opDeleteGenerations(Globals & globals, + Strings opFlags, Strings opArgs) +{ + if (opFlags.size() > 0) + throw UsageError(format("unknown flag `%1%'") % opFlags.front()); + + 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.profile, j->number); + } + + 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.profile, j->number); + found = true; + break; + } + } + if (!found) + printMsg(lvlError, format("generation %1% does not exist") % n); + } + } +} + + static void opDefaultExpr(Globals & globals, Strings opFlags, Strings opArgs) { @@ -750,6 +791,8 @@ void run(Strings args) op = opRollback; else if (arg == "--list-generations") op = opListGenerations; + else if (arg == "--delete-generations") + op = opDeleteGenerations; else if (arg == "--dry-run") { printMsg(lvlInfo, "(dry run; not doing anything)"); globals.dryRun = true; -- cgit 1.4.1