about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/manual/release-notes.xml3
-rw-r--r--src/nix-env/help.txt4
-rw-r--r--src/nix-env/nix-env.cc34
3 files changed, 24 insertions, 17 deletions
diff --git a/doc/manual/release-notes.xml b/doc/manual/release-notes.xml
index c702fb45aaf6..46c540b8789d 100644
--- a/doc/manual/release-notes.xml
+++ b/doc/manual/release-notes.xml
@@ -92,7 +92,8 @@
   output is already in the Nix store or that can be substituted (i.e.,
   downloaded from somewhere).  In other words, it shows the packages
   that can be installed “quickly”, i.e., don’t need to be built from
-  source.</para></listitem>
+  source.  TODO: flag is also available in nix-env -i /
+  -u.</para></listitem>
   
 
   <listitem><para>TODO: new built-ins
diff --git a/src/nix-env/help.txt b/src/nix-env/help.txt
index f2201c575ea2..e0697be88ab6 100644
--- a/src/nix-env/help.txt
+++ b/src/nix-env/help.txt
@@ -63,8 +63,6 @@ Query flags:
   --out-path: print path of derivation output
   --description: print description
   --meta: print all meta attributes (only with --xml)
-  --prebuilt-only: only show derivations whose prebuilt binaries are
-      available on this machine or are downloadable
 
 Options:
 
@@ -74,3 +72,5 @@ Options:
   --keep-failed / -K: keep temporary directories of failed builds
   --preserve-installed: do not replace currently installed versions in `-i'
   --system-filter SYSTEM: only use derivations for specified platform
+  --prebuilt-only / -b: only use derivations whose prebuilt binaries are
+      available on this machine or are downloadable
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 77f8a2a6154a..3396b191fd62 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -47,8 +47,9 @@ struct InstallSourceInfo
     Path nixExprPath; /* for srcNixExprDrvs, srcNixExprs */
     Path profile; /* for srcProfile */
     string systemFilter; /* for srcNixExprDrvs */
+    bool prebuiltOnly;
     ATermMap autoArgs;
-    InstallSourceInfo() : autoArgs() { };
+    InstallSourceInfo() : prebuiltOnly(false) { };
 };
 
 
@@ -94,6 +95,8 @@ 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;
 }
@@ -319,9 +322,16 @@ static int comparePriorities(EvalState & state,
 }
 
 
-static DrvInfos filterBySelector(EvalState & state,
-    const DrvInfos & allElems,
-    const Strings & args, bool newestOnly)
+static bool isPrebuilt(EvalState & state, const DrvInfo & elem)
+{
+    return
+        store->isValidPath(elem.queryOutPath(state)) ||
+        store->hasSubstitutes(elem.queryOutPath(state));
+}
+
+
+static DrvInfos filterBySelector(EvalState & state, const DrvInfos & allElems,
+    const Strings & args, bool newestOnly, bool prebuiltOnly)
 {
     DrvNames selectors = drvNamesFromArgs(args);
 
@@ -340,7 +350,8 @@ static DrvInfos filterBySelector(EvalState & state,
             DrvName drvName(j->name);
             if (i->matches(drvName)) {
                 i->hits++;
-                matches.push_back(std::pair<DrvInfo, unsigned int>(*j, n));
+                if (!prebuiltOnly || isPrebuilt(state, *j))
+                    matches.push_back(std::pair<DrvInfo, unsigned int>(*j, n));
             }
         }
 
@@ -429,7 +440,8 @@ static void queryInstSources(EvalState & state,
             loadDerivations(state, instSource.nixExprPath,
                 instSource.systemFilter, instSource.autoArgs, "", allElems);
 
-            elems = filterBySelector(state, allElems, args, newestOnly);
+            elems = filterBySelector(state, allElems, args,
+                newestOnly, instSource.prebuiltOnly);
     
             break;
         }
@@ -495,7 +507,7 @@ static void queryInstSources(EvalState & state,
         case srcProfile: {
             elems = filterBySelector(state,
                 queryInstalled(state, instSource.profile),
-                args, newestOnly);
+                args, newestOnly, instSource.prebuiltOnly);
             break;
         }
 
@@ -999,7 +1011,7 @@ static void opQuery(Globals & globals,
 
     DrvInfos elems = filterBySelector(globals.state,
         source == sInstalled ? installedElems : availElems,
-        remaining, false);
+        remaining, false, prebuiltOnly);
     
     DrvInfos & otherElems(source == sInstalled ? availElems : installedElems);
 
@@ -1040,12 +1052,6 @@ static void opQuery(Globals & globals,
             /* For XML output. */
             XMLAttrs attrs;
 
-            if (prebuiltOnly) {
-                if (!store->isValidPath(i->queryOutPath(globals.state)) &&
-                    !store->hasSubstitutes(i->queryOutPath(globals.state)))
-                    continue;
-            }
-        
             if (printStatus) {
                 bool hasSubs = store->hasSubstitutes(i->queryOutPath(globals.state));
                 bool isInstalled = installed.find(i->queryOutPath(globals.state)) != installed.end();