getDerivation(): Don't always quietly ignore assertion failure

Ignoring assertion failures makes some sense for nix-env -qa, but not
for nix-instantiate/nix-build or hydra-eval-jobs.
This commit is contained in:
Eelco Dolstra 2012-10-04 15:22:25 -04:00
parent ad328bea15
commit 70f75be199
5 changed files with 27 additions and 21 deletions

View file

@ -84,7 +84,8 @@ typedef set<Bindings *> Done;
makes sense for the caller to recursively search for derivations in makes sense for the caller to recursively search for derivations in
`v'. */ `v'. */
static bool getDerivation(EvalState & state, Value & v, static bool getDerivation(EvalState & state, Value & v,
const string & attrPath, DrvInfos & drvs, Done & done) const string & attrPath, DrvInfos & drvs, Done & done,
bool ignoreAssertionFailures)
{ {
try { try {
state.forceValue(v); state.forceValue(v);
@ -116,16 +117,18 @@ static bool getDerivation(EvalState & state, Value & v,
return false; return false;
} catch (AssertionError & e) { } catch (AssertionError & e) {
return false; if (ignoreAssertionFailures) return false;
throw;
} }
} }
bool getDerivation(EvalState & state, Value & v, DrvInfo & drv) bool getDerivation(EvalState & state, Value & v, DrvInfo & drv,
bool ignoreAssertionFailures)
{ {
Done done; Done done;
DrvInfos drvs; DrvInfos drvs;
getDerivation(state, v, "", drvs, done); getDerivation(state, v, "", drvs, done, ignoreAssertionFailures);
if (drvs.size() != 1) return false; if (drvs.size() != 1) return false;
drv = drvs.front(); drv = drvs.front();
return true; return true;
@ -140,7 +143,8 @@ static string addToPath(const string & s1, const string & s2)
static void getDerivations(EvalState & state, Value & vIn, static void getDerivations(EvalState & state, Value & vIn,
const string & pathPrefix, Bindings & autoArgs, const string & pathPrefix, Bindings & autoArgs,
DrvInfos & drvs, Done & done) DrvInfos & drvs, Done & done,
bool ignoreAssertionFailures)
{ {
Value v; Value v;
state.autoCallFunction(autoArgs, vIn, v); state.autoCallFunction(autoArgs, vIn, v);
@ -148,7 +152,7 @@ static void getDerivations(EvalState & state, Value & vIn,
/* Process the expression. */ /* Process the expression. */
DrvInfo drv; DrvInfo drv;
if (!getDerivation(state, v, pathPrefix, drvs, done)) ; if (!getDerivation(state, v, pathPrefix, drvs, done, ignoreAssertionFailures)) ;
else if (v.type == tAttrs) { else if (v.type == tAttrs) {
@ -171,8 +175,8 @@ static void getDerivations(EvalState & state, Value & vIn,
string pathPrefix2 = addToPath(pathPrefix, i->first); string pathPrefix2 = addToPath(pathPrefix, i->first);
Value & v2(*v.attrs->find(i->second)->value); Value & v2(*v.attrs->find(i->second)->value);
if (combineChannels) if (combineChannels)
getDerivations(state, v2, pathPrefix2, autoArgs, drvs, done); getDerivations(state, v2, pathPrefix2, autoArgs, drvs, done, ignoreAssertionFailures);
else if (getDerivation(state, v2, pathPrefix2, drvs, done)) { else if (getDerivation(state, v2, pathPrefix2, drvs, done, ignoreAssertionFailures)) {
/* If the value of this attribute is itself an /* If the value of this attribute is itself an
attribute set, should we recurse into it? => Only attribute set, should we recurse into it? => Only
if it has a `recurseForDerivations = true' if it has a `recurseForDerivations = true'
@ -180,7 +184,7 @@ static void getDerivations(EvalState & state, Value & vIn,
if (v2.type == tAttrs) { if (v2.type == tAttrs) {
Bindings::iterator j = v2.attrs->find(state.symbols.create("recurseForDerivations")); Bindings::iterator j = v2.attrs->find(state.symbols.create("recurseForDerivations"));
if (j != v2.attrs->end() && state.forceBool(*j->value)) if (j != v2.attrs->end() && state.forceBool(*j->value))
getDerivations(state, v2, pathPrefix2, autoArgs, drvs, done); getDerivations(state, v2, pathPrefix2, autoArgs, drvs, done, ignoreAssertionFailures);
} }
} }
} }
@ -191,8 +195,8 @@ static void getDerivations(EvalState & state, Value & vIn,
startNest(nest, lvlDebug, startNest(nest, lvlDebug,
format("evaluating list element")); format("evaluating list element"));
string pathPrefix2 = addToPath(pathPrefix, (format("%1%") % n).str()); string pathPrefix2 = addToPath(pathPrefix, (format("%1%") % n).str());
if (getDerivation(state, *v.list.elems[n], pathPrefix2, drvs, done)) if (getDerivation(state, *v.list.elems[n], pathPrefix2, drvs, done, ignoreAssertionFailures))
getDerivations(state, *v.list.elems[n], pathPrefix2, autoArgs, drvs, done); getDerivations(state, *v.list.elems[n], pathPrefix2, autoArgs, drvs, done, ignoreAssertionFailures);
} }
} }
@ -201,10 +205,10 @@ static void getDerivations(EvalState & state, Value & vIn,
void getDerivations(EvalState & state, Value & v, const string & pathPrefix, void getDerivations(EvalState & state, Value & v, const string & pathPrefix,
Bindings & autoArgs, DrvInfos & drvs) Bindings & autoArgs, DrvInfos & drvs, bool ignoreAssertionFailures)
{ {
Done done; Done done;
getDerivations(state, v, pathPrefix, autoArgs, drvs, done); getDerivations(state, v, pathPrefix, autoArgs, drvs, done, ignoreAssertionFailures);
} }

View file

@ -75,10 +75,12 @@ typedef list<DrvInfo> DrvInfos;
/* If value `v' denotes a derivation, store information about the /* If value `v' denotes a derivation, store information about the
derivation in `drv' and return true. Otherwise, return false. */ derivation in `drv' and return true. Otherwise, return false. */
bool getDerivation(EvalState & state, Value & v, DrvInfo & drv); bool getDerivation(EvalState & state, Value & v, DrvInfo & drv,
bool ignoreAssertionFailures);
void getDerivations(EvalState & state, Value & v, const string & pathPrefix, void getDerivations(EvalState & state, Value & v, const string & pathPrefix,
Bindings & autoArgs, DrvInfos & drvs); Bindings & autoArgs, DrvInfos & drvs,
bool ignoreAssertionFailures);
} }

View file

@ -166,7 +166,7 @@ static void loadDerivations(EvalState & state, Path nixExprPath,
Value v; Value v;
findAlongAttrPath(state, pathPrefix, autoArgs, loadSourceExpr(state, nixExprPath), v); findAlongAttrPath(state, pathPrefix, autoArgs, loadSourceExpr(state, nixExprPath), v);
getDerivations(state, v, pathPrefix, autoArgs, elems); getDerivations(state, v, pathPrefix, autoArgs, elems, true);
/* Filter out all derivations not applicable to the current /* Filter out all derivations not applicable to the current
system. */ system. */
@ -362,7 +362,7 @@ static void queryInstSources(EvalState & state,
Expr * e2 = state.parseExprFromString(*i, absPath(".")); Expr * e2 = state.parseExprFromString(*i, absPath("."));
Expr * call = new ExprApp(e2, e1); Expr * call = new ExprApp(e2, e1);
Value v; state.eval(call, v); Value v; state.eval(call, v);
getDerivations(state, v, "", instSource.autoArgs, elems); getDerivations(state, v, "", instSource.autoArgs, elems, true);
} }
break; break;
@ -417,7 +417,7 @@ static void queryInstSources(EvalState & state,
Value v; Value v;
findAlongAttrPath(state, *i, instSource.autoArgs, findAlongAttrPath(state, *i, instSource.autoArgs,
loadSourceExpr(state, instSource.nixExprPath), v); loadSourceExpr(state, instSource.nixExprPath), v);
getDerivations(state, v, "", instSource.autoArgs, elems); getDerivations(state, v, "", instSource.autoArgs, elems, true);
} }
break; break;
} }

View file

@ -25,7 +25,7 @@ DrvInfos queryInstalled(EvalState & state, const Path & userEnv)
Value v; Value v;
state.evalFile(manifestFile, v); state.evalFile(manifestFile, v);
Bindings bindings; Bindings bindings;
getDerivations(state, v, "", bindings, elems); getDerivations(state, v, "", bindings, elems, false);
} else if (pathExists(oldManifestFile)) } else if (pathExists(oldManifestFile))
readLegacyManifest(oldManifestFile, elems); readLegacyManifest(oldManifestFile, elems);
@ -127,7 +127,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
/* Evaluate it. */ /* Evaluate it. */
debug("evaluating user environment builder"); debug("evaluating user environment builder");
DrvInfo topLevelDrv; DrvInfo topLevelDrv;
if (!getDerivation(state, topLevel, topLevelDrv)) if (!getDerivation(state, topLevel, topLevelDrv, false))
abort(); abort();
/* Realise the resulting store expression. */ /* Realise the resulting store expression. */

View file

@ -56,7 +56,7 @@ void processExpr(EvalState & state, const Strings & attrPaths,
} }
else { else {
DrvInfos drvs; DrvInfos drvs;
getDerivations(state, v, "", autoArgs, drvs); getDerivations(state, v, "", autoArgs, drvs, false);
foreach (DrvInfos::iterator, i, drvs) { foreach (DrvInfos::iterator, i, drvs) {
Path drvPath = i->queryDrvPath(state); Path drvPath = i->queryDrvPath(state);
if (gcRoot == "") if (gcRoot == "")