about summary refs log tree commit diff
path: root/src/nix-env/main.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-09-10T13·32+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-09-10T13·32+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 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;