From bfea7b1f3514e4b3b4fd094969de92efa46c415d Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 29 Oct 2007 14:31:45 +0000 Subject: * 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). --- src/nix-env/help.txt | 4 ++-- src/nix-env/nix-env.cc | 34 ++++++++++++++++++++-------------- 2 files changed, 22 insertions(+), 16 deletions(-) (limited to 'src') 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(); -- cgit 1.4.1