diff --git a/doc/manual/release-notes.xml b/doc/manual/release-notes.xml index c702fb45aa..46c540b878 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. + source. TODO: flag is also available in nix-env -i / + -u. TODO: new built-ins diff --git a/src/nix-env/help.txt b/src/nix-env/help.txt index f2201c575e..e0697be88a 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 77f8a2a615..3396b191fd 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(*j, n)); + if (!prebuiltOnly || isPrebuilt(state, *j)) + matches.push_back(std::pair(*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();