aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-09-17 12:45:35 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2015-09-17 12:45:35 +0200
commit3d91bfc8f89aab67eb1e92575edf7aacb7f5db25 (patch)
treef76a2579586b0562308c79e8c934dd0521f23641
parent55b11461505f60aa9f73b569d59df3699c293f71 (diff)
parent42808fa281dfc2661d82c1f6145982f20970a004 (diff)
Merge pull request #646 from vcunat/master
nix-env --upgrade improvements
-rw-r--r--doc/manual/command-ref/nix-env.xml4
-rw-r--r--src/nix-env/nix-env.cc20
2 files changed, 14 insertions, 10 deletions
diff --git a/doc/manual/command-ref/nix-env.xml b/doc/manual/command-ref/nix-env.xml
index 5e40317f1..e9a5f0e09 100644
--- a/doc/manual/command-ref/nix-env.xml
+++ b/doc/manual/command-ref/nix-env.xml
@@ -378,7 +378,7 @@ number of possible ways:
<variablelist>
- <varlistentry><term><option>--prebuild-only</option> / <option>-b</option></term>
+ <varlistentry><term><option>--prebuilt-only</option> / <option>-b</option></term>
<listitem><para>Use only derivations for which a substitute is
registered, i.e., there is a pre-built binary available that can
@@ -1012,7 +1012,7 @@ user environment elements, etc. -->
</varlistentry>
- <varlistentry><term><option>--prebuild-only</option> / <option>-b</option></term>
+ <varlistentry><term><option>--prebuilt-only</option> / <option>-b</option></term>
<listitem><para>Show only derivations for which a substitute is
registered, i.e., there is a pre-built binary available that can
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 97a2bbdb7..400b148e9 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;
}
}
}
@@ -600,9 +602,11 @@ static void upgradeDerivations(Globals & globals,
i.queryOutPath() !=
bestElem->queryOutPath())
{
+ const char * action = compareVersions(drvName.version, bestVersion) <= 0
+ ? "upgrading" : "downgrading";
printMsg(lvlInfo,
- format("upgrading ‘%1%’ to ‘%2%’")
- % i.name % bestElem->name);
+ format("%1% ‘%2%’ to ‘%3%’")
+ % action % i.name % bestElem->name);
newElems.push_back(*bestElem);
} else newElems.push_back(i);