aboutsummaryrefslogtreecommitdiff
path: root/src/nix-env/main.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-09-10 13:32:08 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-09-10 13:32:08 +0000
commitdcc433de47d4bf4a27fe63bc8996e946164ae885 (patch)
tree0d27a8f0433094144b7cdab591726f2ec288d937 /src/nix-env/main.cc
parentc16be6ac92b86981e8e4bb6703e694b675a28b0d (diff)
* 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.
Diffstat (limited to 'src/nix-env/main.cc')
-rw-r--r--src/nix-env/main.cc49
1 files changed, 46 insertions, 3 deletions
diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc
index 14aa13b86..cf4ac8fc4 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;