about summary refs log tree commit diff
path: root/src/nix-env/profiles.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/profiles.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/profiles.cc')
-rw-r--r--src/nix-env/profiles.cc40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/nix-env/profiles.cc b/src/nix-env/profiles.cc
index 1eeddf3326bd..c52ddc0b6988 100644
--- a/src/nix-env/profiles.cc
+++ b/src/nix-env/profiles.cc
@@ -20,9 +20,11 @@ static int parseName(const string & profileName, const string & name)
     string s = string(name, profileName.size() + 1);
     int p = s.find("-link");
     if (p == string::npos) return -1;
-    istringstream str(string(s, 0, p));
-    unsigned int n;
-    if (str >> n && str.eof()) return n; else return -1;
+    int n;
+    if (string2Int(string(s, 0, p), n) && n >= 0)
+        return n;
+    else
+        return -1;
 }
 
 
@@ -59,6 +61,16 @@ Generations findGenerations(Path profile, int & curGen)
 }
 
 
+static void makeNames(const Path & profile, unsigned int num,
+    Path & generation, Path & gcrootDrv, Path & gcrootClr)
+{
+    Path prefix = (format("%1%-%2%") % profile % num).str();
+    generation = prefix + "-link";
+    gcrootDrv = prefix + "-drv.gcroot";
+    gcrootClr = prefix + "-clr.gcroot";
+}
+
+
 Path createGeneration(Path profile, Path outPath,
     Path drvPath, Path clrPath)
 {
@@ -72,10 +84,7 @@ Path createGeneration(Path profile, Path outPath,
     Path generation, gcrootDrv, gcrootClr;
 
     while (1) {
-        Path prefix = (format("%1%-%2%") % profile % num).str();
-        generation = prefix + "-link";
-        gcrootDrv = prefix + "-drv.gcroot";
-        gcrootClr = prefix + "-clr.gcroot";
+        makeNames(profile, num, generation, gcrootDrv, gcrootClr);
         if (symlink(outPath.c_str(), generation.c_str()) == 0) break;
         if (errno != EEXIST)
             throw SysError(format("creating symlink `%1%'") % generation);
@@ -90,6 +99,23 @@ Path createGeneration(Path profile, Path outPath,
 }
 
 
+static void removeFile(const Path & path)
+{
+    if (remove(path.c_str()) == -1)
+        throw SysError(format("cannot unlink `%1%'") % path);
+}
+
+
+void deleteGeneration(const Path & profile, unsigned int gen)
+{
+    Path generation, gcrootDrv, gcrootClr;
+    makeNames(profile, gen, generation, gcrootDrv, gcrootClr);
+    removeFile(generation);
+    if (pathExists(gcrootClr)) removeFile(gcrootClr);
+    if (pathExists(gcrootDrv)) removeFile(gcrootDrv);
+}
+
+
 void switchLink(Path link, Path target)
 {
     /* Hacky. */