diff options
Diffstat (limited to 'src/nix-env/main.cc')
-rw-r--r-- | src/nix-env/main.cc | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc index 1f16e72ae0f1..09604a2d0d20 100644 --- a/src/nix-env/main.cc +++ b/src/nix-env/main.cc @@ -17,6 +17,7 @@ struct Globals Path nixExprPath; EvalState state; bool dryRun; + bool preserveInstalled; }; @@ -225,7 +226,7 @@ void createUserEnv(EvalState & state, const DrvInfos & drvs, static void installDerivations(EvalState & state, Path nePath, DrvNames & selectors, const Path & profile, - bool dryRun) + bool dryRun, bool preserveInstalled) { debug(format("installing derivations from `%1%'") % nePath); @@ -235,6 +236,7 @@ static void installDerivations(EvalState & state, /* Filter out the ones we're not interested in. */ DrvInfos selectedDrvs; + StringSet selectedNames; for (DrvInfos::iterator i = availDrvs.begin(); i != availDrvs.end(); ++i) { @@ -247,6 +249,7 @@ static void installDerivations(EvalState & state, format("installing `%1%'") % i->second.name); j->hits++; selectedDrvs.insert(*i); + selectedNames.insert(drvName.name); } } } @@ -261,7 +264,18 @@ static void installDerivations(EvalState & state, /* Add in the already installed derivations. */ DrvInfos installedDrvs; queryInstalled(state, installedDrvs, profile); - selectedDrvs.insert(installedDrvs.begin(), installedDrvs.end()); + + for (DrvInfos::iterator i = installedDrvs.begin(); + i != installedDrvs.end(); ++i) + { + DrvName drvName(i->second.name); + if (!preserveInstalled && + selectedNames.find(drvName.name) != selectedNames.end()) + printMsg(lvlInfo, + format("uninstalling `%1%'") % i->second.name); + else + selectedDrvs.insert(*i); + } if (dryRun) return; @@ -278,7 +292,8 @@ static void opInstall(Globals & globals, DrvNames drvNames = drvNamesFromArgs(opArgs); installDerivations(globals.state, globals.nixExprPath, - drvNames, globals.profile, globals.dryRun); + drvNames, globals.profile, globals.dryRun, + globals.preserveInstalled); } @@ -641,6 +656,7 @@ void run(Strings args) Globals globals; globals.nixExprPath = getDefNixExprPath(); globals.dryRun = false; + globals.preserveInstalled = false; for (Strings::iterator i = args.begin(); i != args.end(); ++i) { string arg = *i; @@ -681,6 +697,8 @@ void run(Strings args) printMsg(lvlInfo, "(dry run; not doing anything)"); globals.dryRun = true; } + else if (arg == "--preserve-installed" || arg == "-P") + globals.preserveInstalled = true; else if (arg[0] == '-') opFlags.push_back(arg); else |