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:
		
							parent
							
								
									ad328bea15
								
							
						
					
					
						commit
						70f75be199
					
				
					 5 changed files with 27 additions and 21 deletions
				
			
		|  | @ -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); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|   |   | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
| 
 | 
 | ||||||
|   |   | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -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. */ | ||||||
|  |  | ||||||
|  | @ -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 == "") | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue