about summary refs log tree commit diff
path: root/src/nix-env/nix-env.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2011-04-11T16·27+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2011-04-11T16·27+0000
commit4ba6afaf48db8d4cece83a6e22de26829907834f (patch)
tree437cb11a392d644c010f59f7e815e5fe62c8fd63 /src/nix-env/nix-env.cc
parent412914d004462977e869e610172305d33fb4d335 (diff)
* `nix-env -ub' (`--prebuilt-only') didn't really work because it
  checked too soon whether substitutes are available.  That is, it did
  so for every available package, rather than those matching installed
  packages.  This was very slow and subject to assertion failures.  So
  do the check much later.  Idem for `nix-env -qab' and `nix-env -ib'.

Diffstat (limited to 'src/nix-env/nix-env.cc')
-rw-r--r--src/nix-env/nix-env.cc37
1 files changed, 20 insertions, 17 deletions
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index bfcc258727..9cfc69547a 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -45,9 +45,7 @@ struct InstallSourceInfo
     Path nixExprPath; /* for srcNixExprDrvs, srcNixExprs */
     Path profile; /* for srcProfile */
     string systemFilter; /* for srcNixExprDrvs */
-    bool prebuiltOnly;
     Bindings autoArgs;
-    InstallSourceInfo() : prebuiltOnly(false) { };
 };
 
 
@@ -60,6 +58,7 @@ struct Globals
     bool preserveInstalled;
     bool keepDerivations;
     string forceName;
+    bool prebuiltOnly;
 };
 
 
@@ -93,8 +92,6 @@ static bool parseInstallSourceOptions(Globals & globals,
     }
     else if (arg == "--attr" || arg == "-A")
         globals.instSource.type = srcAttrPath;
-    else if (arg == "--prebuilt-only" || arg == "-b")
-        globals.instSource.prebuiltOnly = true;
     else return false;
     return true;
 }
@@ -222,7 +219,7 @@ static bool isPrebuilt(EvalState & state, const DrvInfo & elem)
 
 
 static DrvInfos filterBySelector(EvalState & state, const DrvInfos & allElems,
-    const Strings & args, bool newestOnly, bool prebuiltOnly)
+    const Strings & args, bool newestOnly)
 {
     DrvNames selectors = drvNamesFromArgs(args);
 
@@ -241,8 +238,7 @@ static DrvInfos filterBySelector(EvalState & state, const DrvInfos & allElems,
             DrvName drvName(j->name);
             if (i->matches(drvName)) {
                 i->hits++;
-                if (!prebuiltOnly || isPrebuilt(state, *j))
-                    matches.push_back(std::pair<DrvInfo, unsigned int>(*j, n));
+                matches.push_back(std::pair<DrvInfo, unsigned int>(*j, n));
             }
         }
 
@@ -342,8 +338,7 @@ static void queryInstSources(EvalState & state,
             loadDerivations(state, instSource.nixExprPath,
                 instSource.systemFilter, instSource.autoArgs, "", allElems);
 
-            elems = filterBySelector(state, allElems, args,
-                newestOnly, instSource.prebuiltOnly);
+            elems = filterBySelector(state, allElems, args, newestOnly);
     
             break;
         }
@@ -408,7 +403,7 @@ static void queryInstSources(EvalState & state,
         case srcProfile: {
             elems = filterBySelector(state,
                 queryInstalled(state, instSource.profile),
-                args, newestOnly, instSource.prebuiltOnly);
+                args, newestOnly);
             break;
         }
 
@@ -453,8 +448,13 @@ static void installDerivations(Globals & globals,
     debug(format("installing derivations"));
 
     /* Get the set of user environment elements to be installed. */
-    DrvInfos newElems;
-    queryInstSources(globals.state, globals.instSource, args, newElems, true);
+    DrvInfos newElems, newElemsTmp;
+    queryInstSources(globals.state, globals.instSource, args, newElemsTmp, true);
+
+    /* If --prebuilt-only is given, filter out source-only packages. */
+    foreach (DrvInfos::iterator, i, newElemsTmp)
+        if (!globals.prebuiltOnly || isPrebuilt(globals.state, *i))
+            newElems.push_back(*i);
 
     StringSet newNames;
     for (DrvInfos::iterator i = newElems.begin(); i != newElems.end(); ++i) {
@@ -574,7 +574,7 @@ static void upgradeDerivations(Globals & globals,
                                 d2 = comparePriorities(globals.state, *bestElem, *j);
                                 if (d2 == 0) d2 = compareVersions(bestName.version, newName.version);
                             }
-                            if (d2 < 0) {
+                            if (d2 < 0 && (!globals.prebuiltOnly || isPrebuilt(globals.state, *j))) {
                                 bestElem = j;
                                 bestName = newName;
                             }
@@ -862,7 +862,6 @@ static void opQuery(Globals & globals,
     bool printOutPath = false;
     bool printDescription = false;
     bool printMeta = false;
-    bool prebuiltOnly = false;
     bool compareVersions = false;
     bool xmlOutput = false;
 
@@ -882,7 +881,6 @@ static void opQuery(Globals & globals,
         else if (arg == "--meta") printMeta = true;
         else if (arg == "--installed") source = sInstalled;
         else if (arg == "--available" || arg == "-a") source = sAvailable;
-        else if (arg == "--prebuilt-only" || arg == "-b") prebuiltOnly = true;
         else if (arg == "--xml") xmlOutput = true;
         else if (arg == "--attr-path" || arg == "-P") printAttrPath = true;
         else if (arg == "--attr" || arg == "-A")
@@ -909,8 +907,8 @@ static void opQuery(Globals & globals,
 
     DrvInfos elems = filterBySelector(globals.state,
         source == sInstalled ? installedElems : availElems,
-        remaining, false, prebuiltOnly);
-    
+        remaining, false);
+
     DrvInfos & otherElems(source == sInstalled ? availElems : installedElems);
 
     
@@ -943,6 +941,8 @@ static void opQuery(Globals & globals,
         try {
             startNest(nest, lvlDebug, format("outputting query result `%1%'") % i->attrPath);
 
+            if (globals.prebuiltOnly && !isPrebuilt(globals.state, *i)) continue;
+
             /* For table output. */
             Strings columns;
 
@@ -1239,6 +1239,7 @@ void run(Strings args)
     
     globals.dryRun = false;
     globals.preserveInstalled = false;
+    globals.prebuiltOnly = false;
 
     globals.keepDerivations =
         queryBoolSetting("env-keep-derivations", false);
@@ -1285,6 +1286,8 @@ void run(Strings args)
         }
         else if (arg == "--system-filter")
             globals.instSource.systemFilter = needArg(i, args, arg);
+        else if (arg == "--prebuilt-only" || arg == "-b")
+            globals.prebuiltOnly = true;
         else {
             remaining.push_back(arg);
             if (arg[0] == '-') {