Enable lazy/sparse allocation of generation symlinks: avoid creating

new generations if a generation already exists.

Alternatively or additionally I propose a mode where only the *last* generation will be sparse.
This commit is contained in:
Christian Theune 2015-05-18 08:38:49 +02:00
parent be1ff23352
commit 3d83188702
2 changed files with 25 additions and 1 deletions

View file

@ -80,7 +80,22 @@ Path createGeneration(Path profile, Path outPath)
previous ones. */ previous ones. */
int dummy; int dummy;
Generations gens = findGenerations(profile, dummy); Generations gens = findGenerations(profile, dummy);
unsigned int num = gens.size() > 0 ? gens.back().number : 0;
unsigned int num;
if (gens.size() > 0) {
/* Check existing generations whether they represent an
environment we already materialized before. In that case:
avoid cluttering the system with additional symlinks. */
for (auto & gen : gens) {
if (readLink(gen.path) == outPath) {
return gen.path;
}
}
num = gens.back().number;
} else {
num = 0;
}
/* Create the new generation. Note that addPermRoot() blocks if /* Create the new generation. Note that addPermRoot() blocks if
the garbage collector is running to prevent the stuff we've the garbage collector is running to prevent the stuff we've

View file

@ -99,6 +99,15 @@ if nix-env -q '*' | grep -q bar; then false; fi
nix-env --list-generations nix-env --list-generations
test "$(nix-env --list-generations | wc -l)" -eq 7 test "$(nix-env --list-generations | wc -l)" -eq 7
# Doing the same operation twice should result in the same generation, not an
# additional one. At this point we just brought back foo. Installing it again
# should not create a new generation.
nix-env -i foo
# Count generations.
nix-env --list-generations
test "$(nix-env --list-generations | wc -l)" -eq 7
# Switch to a specified generation. # Switch to a specified generation.
nix-env --switch-generation 7 nix-env --switch-generation 7
[ "$(nix-store -q --resolve $profiles/test)" = "$oldGen" ] [ "$(nix-store -q --resolve $profiles/test)" = "$oldGen" ]