aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/get-drvs.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-10-04 15:22:25 -0400
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-10-04 15:22:25 -0400
commit70f75be199d8db959d313dc40111893fba56415f (patch)
treef099812cc963ba6e1235a3cea95b32a0a83c0f47 /src/libexpr/get-drvs.cc
parentad328bea15e2708e5aa784c33ba8bfbc86d02e0d (diff)
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.
Diffstat (limited to 'src/libexpr/get-drvs.cc')
-rw-r--r--src/libexpr/get-drvs.cc30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc
index 6670d0636..f9e7dc6db 100644
--- a/src/libexpr/get-drvs.cc
+++ b/src/libexpr/get-drvs.cc
@@ -84,7 +84,8 @@ typedef set<Bindings *> Done;
makes sense for the caller to recursively search for derivations in
`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 {
state.forceValue(v);
@@ -116,16 +117,18 @@ static bool getDerivation(EvalState & state, Value & v,
return false;
} 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;
DrvInfos drvs;
- getDerivation(state, v, "", drvs, done);
+ getDerivation(state, v, "", drvs, done, ignoreAssertionFailures);
if (drvs.size() != 1) return false;
drv = drvs.front();
return true;
@@ -140,7 +143,8 @@ static string addToPath(const string & s1, const string & s2)
static void getDerivations(EvalState & state, Value & vIn,
const string & pathPrefix, Bindings & autoArgs,
- DrvInfos & drvs, Done & done)
+ DrvInfos & drvs, Done & done,
+ bool ignoreAssertionFailures)
{
Value v;
state.autoCallFunction(autoArgs, vIn, v);
@@ -148,7 +152,7 @@ static void getDerivations(EvalState & state, Value & vIn,
/* Process the expression. */
DrvInfo drv;
- if (!getDerivation(state, v, pathPrefix, drvs, done)) ;
+ if (!getDerivation(state, v, pathPrefix, drvs, done, ignoreAssertionFailures)) ;
else if (v.type == tAttrs) {
@@ -171,8 +175,8 @@ static void getDerivations(EvalState & state, Value & vIn,
string pathPrefix2 = addToPath(pathPrefix, i->first);
Value & v2(*v.attrs->find(i->second)->value);
if (combineChannels)
- getDerivations(state, v2, pathPrefix2, autoArgs, drvs, done);
- else if (getDerivation(state, v2, pathPrefix2, drvs, done)) {
+ getDerivations(state, v2, pathPrefix2, autoArgs, drvs, done, ignoreAssertionFailures);
+ else if (getDerivation(state, v2, pathPrefix2, drvs, done, ignoreAssertionFailures)) {
/* If the value of this attribute is itself an
attribute set, should we recurse into it? => Only
if it has a `recurseForDerivations = true'
@@ -180,7 +184,7 @@ static void getDerivations(EvalState & state, Value & vIn,
if (v2.type == tAttrs) {
Bindings::iterator j = v2.attrs->find(state.symbols.create("recurseForDerivations"));
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,
format("evaluating list element"));
string pathPrefix2 = addToPath(pathPrefix, (format("%1%") % n).str());
- if (getDerivation(state, *v.list.elems[n], pathPrefix2, drvs, done))
- getDerivations(state, *v.list.elems[n], pathPrefix2, autoArgs, drvs, done);
+ if (getDerivation(state, *v.list.elems[n], pathPrefix2, drvs, done, ignoreAssertionFailures))
+ 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,
- Bindings & autoArgs, DrvInfos & drvs)
+ Bindings & autoArgs, DrvInfos & drvs, bool ignoreAssertionFailures)
{
Done done;
- getDerivations(state, v, pathPrefix, autoArgs, drvs, done);
+ getDerivations(state, v, pathPrefix, autoArgs, drvs, done, ignoreAssertionFailures);
}