diff options
Diffstat (limited to 'src/nix-env/nix-env.cc')
-rw-r--r-- | src/nix-env/nix-env.cc | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index bfcc25872715..9cfc69547a5b 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -45,9 +45,7 @@ struct InstallSourceInfo Path nixExprPath; /* for srcNixExprDrvs, srcNixExprs */ Path profile; /* for srcProfile */ string systemFilter; /* for srcNixExprDrvs */ - bool prebuiltOnly; Bindings autoArgs; - InstallSourceInfo() : prebuiltOnly(false) { }; }; @@ -60,6 +58,7 @@ struct Globals bool preserveInstalled; bool keepDerivations; string forceName; + bool prebuiltOnly; }; @@ -93,8 +92,6 @@ 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; } @@ -222,7 +219,7 @@ static bool isPrebuilt(EvalState & state, const DrvInfo & elem) static DrvInfos filterBySelector(EvalState & state, const DrvInfos & allElems, - const Strings & args, bool newestOnly, bool prebuiltOnly) + const Strings & args, bool newestOnly) { DrvNames selectors = drvNamesFromArgs(args); @@ -241,8 +238,7 @@ static DrvInfos filterBySelector(EvalState & state, const DrvInfos & allElems, DrvName drvName(j->name); if (i->matches(drvName)) { i->hits++; - if (!prebuiltOnly || isPrebuilt(state, *j)) - matches.push_back(std::pair<DrvInfo, unsigned int>(*j, n)); + matches.push_back(std::pair<DrvInfo, unsigned int>(*j, n)); } } @@ -342,8 +338,7 @@ static void queryInstSources(EvalState & state, loadDerivations(state, instSource.nixExprPath, instSource.systemFilter, instSource.autoArgs, "", allElems); - elems = filterBySelector(state, allElems, args, - newestOnly, instSource.prebuiltOnly); + elems = filterBySelector(state, allElems, args, newestOnly); break; } @@ -408,7 +403,7 @@ static void queryInstSources(EvalState & state, case srcProfile: { elems = filterBySelector(state, queryInstalled(state, instSource.profile), - args, newestOnly, instSource.prebuiltOnly); + args, newestOnly); break; } @@ -453,8 +448,13 @@ static void installDerivations(Globals & globals, debug(format("installing derivations")); /* Get the set of user environment elements to be installed. */ - DrvInfos newElems; - queryInstSources(globals.state, globals.instSource, args, newElems, true); + DrvInfos newElems, newElemsTmp; + queryInstSources(globals.state, globals.instSource, args, newElemsTmp, true); + + /* If --prebuilt-only is given, filter out source-only packages. */ + foreach (DrvInfos::iterator, i, newElemsTmp) + if (!globals.prebuiltOnly || isPrebuilt(globals.state, *i)) + newElems.push_back(*i); StringSet newNames; for (DrvInfos::iterator i = newElems.begin(); i != newElems.end(); ++i) { @@ -574,7 +574,7 @@ static void upgradeDerivations(Globals & globals, d2 = comparePriorities(globals.state, *bestElem, *j); if (d2 == 0) d2 = compareVersions(bestName.version, newName.version); } - if (d2 < 0) { + if (d2 < 0 && (!globals.prebuiltOnly || isPrebuilt(globals.state, *j))) { bestElem = j; bestName = newName; } @@ -862,7 +862,6 @@ static void opQuery(Globals & globals, bool printOutPath = false; bool printDescription = false; bool printMeta = false; - bool prebuiltOnly = false; bool compareVersions = false; bool xmlOutput = false; @@ -882,7 +881,6 @@ static void opQuery(Globals & globals, else if (arg == "--meta") printMeta = true; else if (arg == "--installed") source = sInstalled; else if (arg == "--available" || arg == "-a") source = sAvailable; - else if (arg == "--prebuilt-only" || arg == "-b") prebuiltOnly = true; else if (arg == "--xml") xmlOutput = true; else if (arg == "--attr-path" || arg == "-P") printAttrPath = true; else if (arg == "--attr" || arg == "-A") @@ -909,8 +907,8 @@ static void opQuery(Globals & globals, DrvInfos elems = filterBySelector(globals.state, source == sInstalled ? installedElems : availElems, - remaining, false, prebuiltOnly); - + remaining, false); + DrvInfos & otherElems(source == sInstalled ? availElems : installedElems); @@ -943,6 +941,8 @@ static void opQuery(Globals & globals, try { startNest(nest, lvlDebug, format("outputting query result `%1%'") % i->attrPath); + if (globals.prebuiltOnly && !isPrebuilt(globals.state, *i)) continue; + /* For table output. */ Strings columns; @@ -1239,6 +1239,7 @@ void run(Strings args) globals.dryRun = false; globals.preserveInstalled = false; + globals.prebuiltOnly = false; globals.keepDerivations = queryBoolSetting("env-keep-derivations", false); @@ -1285,6 +1286,8 @@ void run(Strings args) } else if (arg == "--system-filter") globals.instSource.systemFilter = needArg(i, args, arg); + else if (arg == "--prebuilt-only" || arg == "-b") + globals.prebuiltOnly = true; else { remaining.push_back(arg); if (arg[0] == '-') { |