diff --git a/doc/manual/release-notes.xml b/doc/manual/release-notes.xml
index 161643e52..3b4525129 100644
--- a/doc/manual/release-notes.xml
+++ b/doc/manual/release-notes.xml
@@ -72,8 +72,8 @@
TODO: nix-env
. Specific flags:
- active,
- priority.
+ active, priority,
+ keep.
nix-env -q now has a flag
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 77b788171..1a4d8ee58 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -482,8 +482,10 @@ static void installDerivations(Globals & globals,
i != installedElems.end(); ++i)
{
DrvName drvName(i->name);
+ MetaInfo meta = i->queryMetaInfo(globals.state);
if (!globals.preserveInstalled &&
- newNames.find(drvName.name) != newNames.end())
+ newNames.find(drvName.name) != newNames.end() &&
+ meta["keep"] == "true")
printMsg(lvlInfo,
format("replacing old `%1%'") % i->name);
else
@@ -543,6 +545,9 @@ static void upgradeDerivations(Globals & globals,
{
DrvName drvName(i->name);
+ MetaInfo meta = i->queryMetaInfo(globals.state);
+ if (meta["keep"] == "true") continue;
+
/* Find the derivation in the input Nix expression with the
same name and satisfying the version constraints specified
by upgradeType. If there are multiple matches, take the