hydra-eval-jobs: Don't go into an infinite recursion

The function getDerivation() can return false if its argument is a
derivation.  This happens if evaluating the name or system attribute
triggers an assertion.  In that case, we shouldn't recurse into the
attributes of the derivation.
This commit is contained in:
Eelco Dolstra 2012-10-04 14:31:47 -04:00
parent f4a24b94ee
commit a4ff9b0d08

View File

@ -16,7 +16,7 @@ using namespace nix;
void printHelp() void printHelp()
{ {
std::cout << "Syntax: eval-jobs <expr>\n"; std::cout << "Syntax: hydra-eval-jobs <expr>\n";
} }
@ -110,6 +110,8 @@ static void findJobsWrapped(EvalState & state, XMLWriter & doc,
{ {
debug(format("at path `%1%'") % attrPath); debug(format("at path `%1%'") % attrPath);
checkInterrupt();
state.forceValue(v); state.forceValue(v);
if (v.type == tAttrs) { if (v.type == tAttrs) {
@ -165,11 +167,13 @@ static void findJobsWrapped(EvalState & state, XMLWriter & doc,
} }
else { else {
if (!state.isDerivation(v)) {
foreach (Bindings::iterator, i, *v.attrs) foreach (Bindings::iterator, i, *v.attrs)
findJobs(state, doc, argsUsed, argsLeft, *i->value, findJobs(state, doc, argsUsed, argsLeft, *i->value,
(attrPath.empty() ? "" : attrPath + ".") + (string) i->name); (attrPath.empty() ? "" : attrPath + ".") + (string) i->name);
} }
} }
}
else if (v.type == tLambda && v.lambda.fun->matchAttrs) { else if (v.type == tLambda && v.lambda.fun->matchAttrs) {
tryJobAlts(state, doc, argsUsed, argsLeft, attrPath, v, tryJobAlts(state, doc, argsUsed, argsLeft, attrPath, v,
@ -261,4 +265,4 @@ void run(Strings args)
} }
string programId = "eval-jobs"; string programId = "hydra-eval-jobs";