diff --git a/doc/manual/release-notes.xml b/doc/manual/release-notes.xml
index 4830b323e..e5d0adf74 100644
--- a/doc/manual/release-notes.xml
+++ b/doc/manual/release-notes.xml
@@ -74,6 +74,15 @@
.
+ nix-env -q now has a flag
+ () that causes
+ nix-env to show only those derivations whose
+ 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.
+
+
TODO: new built-ins
builtins.attrNames,
builtins.filterSource,
diff --git a/src/nix-env/help.txt b/src/nix-env/help.txt
index 534d16ad3..16e47a73e 100644
--- a/src/nix-env/help.txt
+++ b/src/nix-env/help.txt
@@ -45,7 +45,12 @@ Upgrade flags:
--eq: "upgrade" if the current version is equal
--always: upgrade regardless of current version
-Query types:
+Query sources:
+
+ --installed: use installed derivations (default)
+ --available / -a: use derivations available in Nix expression
+
+Query flags:
--status / -s: print installed/present status
--no-name: hide derivation names
@@ -55,11 +60,8 @@ Query types:
--compare-versions / -c: compare version to available or installed
--drv-path: print path of derivation
--out-path: print path of derivation output
-
-Query sources:
-
- --installed: use installed derivations (default)
- --available / -a: use derivations available in Nix expression
+ --prebuilt-only: only show derivations whose prebuilt binaries are
+ available on this machine or are downloadable
Options:
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 5dab2e60b..77b788171 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -831,6 +831,7 @@ static void opQuery(Globals & globals,
bool printDrvPath = false;
bool printOutPath = false;
bool printDescription = false;
+ bool prebuiltOnly = false;
bool compareVersions = false;
bool xmlOutput = false;
@@ -849,6 +850,7 @@ static void opQuery(Globals & globals,
else if (*i == "--out-path") printOutPath = true;
else if (*i == "--installed") source = sInstalled;
else if (*i == "--available" || *i == "-a") source = sAvailable;
+ else if (*i == "--prebuilt-only" || *i == "-b") prebuiltOnly = true;
else if (*i == "--xml") xmlOutput = true;
else throw UsageError(format("unknown flag `%1%'") % *i);
@@ -914,6 +916,12 @@ 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));