From bfea7b1f3514e4b3b4fd094969de92efa46c415d Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 29 Oct 2007 14:31:45 +0000 Subject: [PATCH] * Make the `--prebuilt-only' / `-b' option work not just for queries but installations/upgrades as well. So `nix-env -ub \*' will upgrade only those packages for which a substitute is available (or to be precise, it will upgrade each package to the highest version for which a substitute is available). --- doc/manual/release-notes.xml | 3 ++- src/nix-env/help.txt | 4 ++-- src/nix-env/nix-env.cc | 34 ++++++++++++++++++++-------------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/doc/manual/release-notes.xml b/doc/manual/release-notes.xml index c702fb45a..46c540b87 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 f2201c575..e0697be88 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 77f8a2a61..3396b191f 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();