aboutsummaryrefslogtreecommitdiff
path: root/src/nix-env/nix-env.cc
diff options
context:
space:
mode:
authorVladimír Čunát <vcunat@gmail.com>2015-09-17 10:34:54 +0200
committerVladimír Čunát <vcunat@gmail.com>2015-09-17 12:06:26 +0200
commit64f9b511be8a77ba98c0dd40df022b7d299293d4 (patch)
treee1ff9d259be2d7c859f4bd6f078d9c94aa379da3 /src/nix-env/nix-env.cc
parent55b11461505f60aa9f73b569d59df3699c293f71 (diff)
nix-env --upgrade: avoid unexpected downgrades
Until now, if one explicitly installed a low-priority version, nix-env --upgrade would downgrade it by default and even with --leq. Let's never accept an upgrade with version not matching the upgradeType. Additionally, let's never decrease the priority of an installed package; you can use --install to force that. Also refactor to use variable bestVersion instead of bestName, as only version was used from it.
Diffstat (limited to 'src/nix-env/nix-env.cc')
-rw-r--r--src/nix-env/nix-env.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 97a2bbdb7..ddbba2484 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -570,14 +570,16 @@ static void upgradeDerivations(Globals & globals,
constraints specified by upgradeType. If there are
multiple matches, take the one with the highest
priority. If there are still multiple matches,
- take the one with the highest version. */
+ take the one with the highest version.
+ Do not upgrade if it would decrease the priority. */
DrvInfos::iterator bestElem = availElems.end();
- DrvName bestName;
+ string bestVersion;
for (auto j = availElems.begin(); j != availElems.end(); ++j) {
+ if (comparePriorities(*globals.state, i, *j) > 0)
+ continue;
DrvName newName(j->name);
if (newName.name == drvName.name) {
- int d = comparePriorities(*globals.state, i, *j);
- if (d == 0) d = compareVersions(drvName.version, newName.version);
+ int d = compareVersions(drvName.version, newName.version);
if ((upgradeType == utLt && d < 0) ||
(upgradeType == utLeq && d <= 0) ||
(upgradeType == utEq && d == 0) ||
@@ -586,11 +588,11 @@ static void upgradeDerivations(Globals & globals,
int d2 = -1;
if (bestElem != availElems.end()) {
d2 = comparePriorities(*globals.state, *bestElem, *j);
- if (d2 == 0) d2 = compareVersions(bestName.version, newName.version);
+ if (d2 == 0) d2 = compareVersions(bestVersion, newName.version);
}
if (d2 < 0 && (!globals.prebuiltOnly || isPrebuilt(*globals.state, *j))) {
bestElem = j;
- bestName = newName;
+ bestVersion = newName.version;
}
}
}