nix-env: Determine which paths have substitutes in parallel

This commit is contained in:
Eelco Dolstra 2012-07-11 10:14:06 -04:00
parent 5ee8944155
commit 6586414bc7
2 changed files with 24 additions and 2 deletions

View File

@ -32,6 +32,8 @@ private:
bool metaInfoRead;
MetaInfo meta;
bool failed; // set if we get an AssertionError
public:
string name;
@ -41,7 +43,7 @@ public:
/* !!! make this private */
Bindings * attrs;
DrvInfo() : metaInfoRead(false), attrs(0) { };
DrvInfo() : metaInfoRead(false), failed(false), attrs(0) { };
string queryDrvPath(EvalState & state) const;
string queryOutPath(EvalState & state) const;
@ -59,6 +61,9 @@ public:
}
void setMetaInfo(const MetaInfo & meta);
void setFailed() { failed = true; };
bool hasFailed() { return failed; };
};

View File

@ -929,6 +929,21 @@ static void opQuery(Globals & globals,
installed.insert(i->queryOutPath(globals.state));
}
/* Query which paths have substitutes. */
SubstitutablePathInfos subs;
if (printStatus) {
PathSet paths;
foreach (vector<DrvInfo>::iterator, i, elems2)
try {
paths.insert(i->queryOutPath(globals.state));
} catch (AssertionError & e) {
printMsg(lvlTalkative, format("skipping derivation named `%1%' which gives an assertion failure") % i->name);
i->setFailed();
}
store->querySubstitutablePathInfos(paths, subs);
}
/* Print the desired columns, or XML output. */
Table table;
@ -938,6 +953,8 @@ static void opQuery(Globals & globals,
foreach (vector<DrvInfo>::iterator, i, elems2) {
try {
if (i->hasFailed()) continue;
startNest(nest, lvlDebug, format("outputting query result `%1%'") % i->attrPath);
if (globals.prebuiltOnly && !isPrebuilt(globals.state, *i)) continue;
@ -949,7 +966,7 @@ static void opQuery(Globals & globals,
XMLAttrs attrs;
if (printStatus) {
bool hasSubs = store->hasSubstitutes(i->queryOutPath(globals.state));
bool hasSubs = subs.find(i->queryOutPath(globals.state)) != subs.end();
bool isInstalled = installed.find(i->queryOutPath(globals.state)) != installed.end();
bool isValid = store->isValidPath(i->queryOutPath(globals.state));
if (xmlOutput) {