about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-02-11T10·25+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-02-11T10·25+0000
commit00fe1a506f045e612b0564ab0b5aff3917e26bd3 (patch)
tree25c2b9fdf93bf9ab9e67e86ff040a2feede23b41
parent92e832348db13637875c4f529ed0aa83d3d34493 (diff)
* When creating a new generation, also make the normal form of the
  derivation (i.e., the closure store expression) a root of the
  garbage collector.  This ensures that running `nix-collect-garbage
  --no-successors' is safe.

-rw-r--r--src/nix-env/main.cc2
-rw-r--r--src/nix-env/profiles.cc11
-rw-r--r--src/nix-env/profiles.hh3
3 files changed, 10 insertions, 6 deletions
diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc
index 673d1b2be5..07a49a122c 100644
--- a/src/nix-env/main.cc
+++ b/src/nix-env/main.cc
@@ -196,7 +196,7 @@ void createUserEnv(EvalState & state, const DrvInfos & drvs,
     /* Switch the current user environment to the output path. */
     debug(format("switching to new user environment"));
     Path generation = createGeneration(profile,
-        topLevelDrv.outPath, topLevelDrv.drvPath);
+        topLevelDrv.outPath, topLevelDrv.drvPath, nfPath);
     switchLink(profile, generation);
 }
 
diff --git a/src/nix-env/profiles.cc b/src/nix-env/profiles.cc
index a1e0c94a91..d47c528b2d 100644
--- a/src/nix-env/profiles.cc
+++ b/src/nix-env/profiles.cc
@@ -58,7 +58,8 @@ Generations findGenerations(Path profile, int & curGen)
 }
 
 
-Path createGeneration(Path profile, Path outPath, Path drvPath)
+Path createGeneration(Path profile, Path outPath,
+    Path drvPath, Path clrPath)
 {
     /* The new generation number should be higher than old the
        previous ones. */
@@ -67,12 +68,13 @@ Path createGeneration(Path profile, Path outPath, Path drvPath)
     unsigned int num = gens.size() > 0 ? gens.front().number : 0;
         
     /* Create the new generation. */
-    Path generation, gcrootSrc;
+    Path generation, gcrootDrv, gcrootClr;
 
     while (1) {
         Path prefix = (format("%1%-%2%") % profile % num).str();
         generation = prefix + "-link";
-        gcrootSrc = prefix + "-src.gcroot";
+        gcrootDrv = prefix + "-drv.gcroot";
+        gcrootClr = prefix + "-clr.gcroot";
         if (symlink(outPath.c_str(), generation.c_str()) == 0) break;
         if (errno != EEXIST)
             throw SysError(format("creating symlink `%1%'") % generation);
@@ -80,7 +82,8 @@ Path createGeneration(Path profile, Path outPath, Path drvPath)
         num++;
     }
 
-    writeStringToFile(gcrootSrc, drvPath);
+    writeStringToFile(gcrootDrv, drvPath);
+    writeStringToFile(gcrootClr, clrPath);
 
     return generation;
 }
diff --git a/src/nix-env/profiles.hh b/src/nix-env/profiles.hh
index 2ce468dfa8..4231344127 100644
--- a/src/nix-env/profiles.hh
+++ b/src/nix-env/profiles.hh
@@ -28,7 +28,8 @@ typedef list<Generation> Generations;
    profile, sorted by generation number. */
 Generations findGenerations(Path profile, int & curGen);
     
-Path createGeneration(Path profile, Path outPath, Path drvPath);
+Path createGeneration(Path profile, Path outPath,
+    Path drvPath, Path clrPath);
 
 void switchLink(Path link, Path target);