Implement alternative to lazy generations:
* only the last generation can be lazy * depend on the '--lazy-generation' flag to be set
This commit is contained in:
parent
3d83188702
commit
ea39c98d41
|
@ -58,6 +58,7 @@ struct Globals
|
||||||
bool removeAll;
|
bool removeAll;
|
||||||
string forceName;
|
string forceName;
|
||||||
bool prebuiltOnly;
|
bool prebuiltOnly;
|
||||||
|
bool lazyGeneration;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -510,7 +511,7 @@ static void installDerivations(Globals & globals,
|
||||||
if (globals.dryRun) return;
|
if (globals.dryRun) return;
|
||||||
|
|
||||||
if (createUserEnv(*globals.state, allElems,
|
if (createUserEnv(*globals.state, allElems,
|
||||||
profile, settings.envKeepDerivations, lockToken)) break;
|
profile, settings.envKeepDerivations, lockToken, globals.lazyGeneration)) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -524,6 +525,8 @@ static void opInstall(Globals & globals, Strings opFlags, Strings opArgs)
|
||||||
globals.preserveInstalled = true;
|
globals.preserveInstalled = true;
|
||||||
else if (arg == "--remove-all" || arg == "-r")
|
else if (arg == "--remove-all" || arg == "-r")
|
||||||
globals.removeAll = true;
|
globals.removeAll = true;
|
||||||
|
else if (arg == "--lazy-generation")
|
||||||
|
globals.lazyGeneration = true;
|
||||||
else throw UsageError(format("unknown flag ‘%1%’") % arg);
|
else throw UsageError(format("unknown flag ‘%1%’") % arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,7 +620,7 @@ static void upgradeDerivations(Globals & globals,
|
||||||
if (globals.dryRun) return;
|
if (globals.dryRun) return;
|
||||||
|
|
||||||
if (createUserEnv(*globals.state, newElems,
|
if (createUserEnv(*globals.state, newElems,
|
||||||
globals.profile, settings.envKeepDerivations, lockToken)) break;
|
globals.profile, settings.envKeepDerivations, lockToken, globals.lazyGeneration)) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -681,7 +684,7 @@ static void opSetFlag(Globals & globals, Strings opFlags, Strings opArgs)
|
||||||
|
|
||||||
/* Write the new user environment. */
|
/* Write the new user environment. */
|
||||||
if (createUserEnv(*globals.state, installedElems,
|
if (createUserEnv(*globals.state, installedElems,
|
||||||
globals.profile, settings.envKeepDerivations, lockToken)) break;
|
globals.profile, settings.envKeepDerivations, lockToken, globals.lazyGeneration)) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -718,7 +721,8 @@ static void opSet(Globals & globals, Strings opFlags, Strings opArgs)
|
||||||
}
|
}
|
||||||
|
|
||||||
debug(format("switching to new user environment"));
|
debug(format("switching to new user environment"));
|
||||||
Path generation = createGeneration(globals.profile, drv.queryOutPath());
|
Path generation = createGeneration(globals.profile, drv.queryOutPath(),
|
||||||
|
globals.lazyGeneration);
|
||||||
switchLink(globals.profile, generation);
|
switchLink(globals.profile, generation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -751,7 +755,7 @@ static void uninstallDerivations(Globals & globals, Strings & selectors,
|
||||||
if (globals.dryRun) return;
|
if (globals.dryRun) return;
|
||||||
|
|
||||||
if (createUserEnv(*globals.state, newElems,
|
if (createUserEnv(*globals.state, newElems,
|
||||||
profile, settings.envKeepDerivations, lockToken)) break;
|
profile, settings.envKeepDerivations, lockToken, globals.lazyGeneration)) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1355,6 +1359,7 @@ int main(int argc, char * * argv)
|
||||||
globals.preserveInstalled = false;
|
globals.preserveInstalled = false;
|
||||||
globals.removeAll = false;
|
globals.removeAll = false;
|
||||||
globals.prebuiltOnly = false;
|
globals.prebuiltOnly = false;
|
||||||
|
globals.lazyGeneration = false;
|
||||||
|
|
||||||
parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
|
parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
|
||||||
Operation oldOp = op;
|
Operation oldOp = op;
|
||||||
|
|
|
@ -74,7 +74,7 @@ static void makeName(const Path & profile, unsigned int num,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Path createGeneration(Path profile, Path outPath)
|
Path createGeneration(Path profile, Path outPath, bool lazy)
|
||||||
{
|
{
|
||||||
/* The new generation number should be higher than old the
|
/* The new generation number should be higher than old the
|
||||||
previous ones. */
|
previous ones. */
|
||||||
|
@ -83,13 +83,16 @@ Path createGeneration(Path profile, Path outPath)
|
||||||
|
|
||||||
unsigned int num;
|
unsigned int num;
|
||||||
if (gens.size() > 0) {
|
if (gens.size() > 0) {
|
||||||
/* Check existing generations whether they represent an
|
Generation last = gens.back();
|
||||||
environment we already materialized before. In that case:
|
|
||||||
avoid cluttering the system with additional symlinks. */
|
if (lazy && readLink(last.path) == outPath) {
|
||||||
for (auto & gen : gens) {
|
/* If lazy generations are enabled then we only create a
|
||||||
if (readLink(gen.path) == outPath) {
|
new generation symlink if it differs from the last one.
|
||||||
return gen.path;
|
|
||||||
}
|
This helps keeping gratuitous installs/rebuilds from piling
|
||||||
|
up uncontrolled numbers of generations, cluttering up the
|
||||||
|
UI like grub. */
|
||||||
|
return last.path;
|
||||||
}
|
}
|
||||||
|
|
||||||
num = gens.back().number;
|
num = gens.back().number;
|
||||||
|
|
|
@ -31,7 +31,7 @@ typedef list<Generation> Generations;
|
||||||
profile, sorted by generation number. */
|
profile, sorted by generation number. */
|
||||||
Generations findGenerations(Path profile, int & curGen);
|
Generations findGenerations(Path profile, int & curGen);
|
||||||
|
|
||||||
Path createGeneration(Path profile, Path outPath);
|
Path createGeneration(Path profile, Path outPath, bool lazy);
|
||||||
|
|
||||||
void deleteGeneration(const Path & profile, unsigned int gen);
|
void deleteGeneration(const Path & profile, unsigned int gen);
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ DrvInfos queryInstalled(EvalState & state, const Path & userEnv)
|
||||||
|
|
||||||
bool createUserEnv(EvalState & state, DrvInfos & elems,
|
bool createUserEnv(EvalState & state, DrvInfos & elems,
|
||||||
const Path & profile, bool keepDerivations,
|
const Path & profile, bool keepDerivations,
|
||||||
const string & lockToken)
|
const string & lockToken, bool lazyGeneration)
|
||||||
{
|
{
|
||||||
/* Build the components in the user environment, if they don't
|
/* Build the components in the user environment, if they don't
|
||||||
exist already. */
|
exist already. */
|
||||||
|
@ -141,7 +141,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
|
||||||
}
|
}
|
||||||
|
|
||||||
debug(format("switching to new user environment"));
|
debug(format("switching to new user environment"));
|
||||||
Path generation = createGeneration(profile, topLevelOut);
|
Path generation = createGeneration(profile, topLevelOut, lazyGeneration);
|
||||||
switchLink(profile, generation);
|
switchLink(profile, generation);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -8,6 +8,6 @@ DrvInfos queryInstalled(EvalState & state, const Path & userEnv);
|
||||||
|
|
||||||
bool createUserEnv(EvalState & state, DrvInfos & elems,
|
bool createUserEnv(EvalState & state, DrvInfos & elems,
|
||||||
const Path & profile, bool keepDerivations,
|
const Path & profile, bool keepDerivations,
|
||||||
const string & lockToken);
|
const string & lockToken, bool lazyGeneration);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,14 +99,24 @@ 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
|
# Doing the same operation twice results in the same generation, but creates an
|
||||||
# additional one. At this point we just brought back foo. Installing it again
|
# additional one. At this point we just brought back foo.
|
||||||
# should not create a new generation.
|
|
||||||
nix-env -i foo
|
nix-env -i foo
|
||||||
|
|
||||||
# Count generations.
|
# Count generations.
|
||||||
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 8
|
||||||
|
|
||||||
|
# Now, doing that again but passing the --lazy-generations flag will not
|
||||||
|
# create a new generation.
|
||||||
|
|
||||||
|
nix-env -i foo --lazy-generation
|
||||||
|
|
||||||
|
# Count generations.
|
||||||
|
nix-env --list-generations
|
||||||
|
test "$(nix-env --list-generations | wc -l)" -eq 8
|
||||||
|
|
||||||
|
|
||||||
# Switch to a specified generation.
|
# Switch to a specified generation.
|
||||||
nix-env --switch-generation 7
|
nix-env --switch-generation 7
|
||||||
|
|
Loading…
Reference in a new issue