diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2004-02-11T10·25+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2004-02-11T10·25+0000 |
commit | 00fe1a506f045e612b0564ab0b5aff3917e26bd3 (patch) | |
tree | 25c2b9fdf93bf9ab9e67e86ff040a2feede23b41 | |
parent | 92e832348db13637875c4f529ed0aa83d3d34493 (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.cc | 2 | ||||
-rw-r--r-- | src/nix-env/profiles.cc | 11 | ||||
-rw-r--r-- | src/nix-env/profiles.hh | 3 |
3 files changed, 10 insertions, 6 deletions
diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc index 673d1b2be5f6..07a49a122c97 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 a1e0c94a9198..d47c528b2d2c 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 2ce468dfa837..423134412748 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); |