about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-06-28T13·37+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-06-28T13·37+0000
commit24286e15c9822833c39d268e521522b9933db28e (patch)
tree5802bd6c7b81210ed0597ee4b99b4b8a3aabe55e
parent2746a879e23a97639b23fe6e5335e0cfcc7d5085 (diff)
* `nix-env -u' now allows a specific version to be specified when
  upgrading.

  This fixes a bug reported by Martin:

    $ nix-env -i foo-1.0
    $ nix-env -u foo-1.0
    upgrading foo-1.0 to foo-1.1
  

-rw-r--r--doc/manual/nix-env.xml3
-rw-r--r--src/nix-env/main.cc11
2 files changed, 10 insertions, 4 deletions
diff --git a/doc/manual/nix-env.xml b/doc/manual/nix-env.xml
index 70069fa1af84..8a496da25988 100644
--- a/doc/manual/nix-env.xml
+++ b/doc/manual/nix-env.xml
@@ -312,6 +312,9 @@ $ nix-env -f ~/foo.nix -i '*' <lineannotation>(install everything in <filename>f
 $ nix-env --upgrade gcc
 upgrading `gcc-3.3.1' to `gcc-3.4'
 
+$ nix-env -u gcc-3.3.2 --always <lineannotation>(switch to a specific version)</lineannotation>
+upgrading `gcc-3.4' to `gcc-3.3.2'
+
 $ nix-env --upgrade pan
 <lineannotation>(no upgrades available, so nothing happens)</lineannotation>
 
diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc
index c57f03cce007..1f16e72ae0f1 100644
--- a/src/nix-env/main.cc
+++ b/src/nix-env/main.cc
@@ -310,14 +310,16 @@ static void upgradeDerivations(EvalState & state,
          i != installedDrvs.end(); ++i)
     {
         DrvName drvName(i->second.name);
+        DrvName selector;
 
         /* Do we want to upgrade this derivation? */
         bool upgrade = false;
         for (DrvNames::iterator j = selectors.begin();
              j != selectors.end(); ++j)
         {
-            if (j->matches(drvName)) {
+            if (j->name == "*" || j->name == drvName.name) {
                 j->hits++;
+                selector = *j;
                 upgrade = true;
                 break;
             }
@@ -344,9 +346,10 @@ static void upgradeDerivations(EvalState & state,
                     upgradeType == utLeq && d <= 0 ||
                     upgradeType == utAlways)
                 {
-                    if (bestDrv == availDrvs.end() ||
-                        compareVersions(
-                            bestName.version, newName.version) < 0)
+                    if (selector.matches(newName) &&
+                        (bestDrv == availDrvs.end() ||
+                         compareVersions(
+                             bestName.version, newName.version) < 0))
                     {
                         bestDrv = j;
                         bestName = newName;