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));