* Refactoring: move derivation evaluation to libexpr.
This commit is contained in:
		
							parent
							
								
									4db4b61380
								
							
						
					
					
						commit
						39f50db731
					
				
					 4 changed files with 209 additions and 187 deletions
				
			
		
							
								
								
									
										67
									
								
								src/libexpr/get-drvs.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/libexpr/get-drvs.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,67 @@ | |||
| #include "get-drvs.hh" | ||||
| #include "nixexpr-ast.hh" | ||||
| 
 | ||||
| 
 | ||||
| bool getDerivation(EvalState & state, Expr e, DrvInfo & drv) | ||||
| { | ||||
|     ATermList es; | ||||
|     e = evalExpr(state, e); | ||||
|     if (!matchAttrs(e, es)) return false; | ||||
| 
 | ||||
|     ATermMap attrs; | ||||
|     queryAllAttrs(e, attrs, false); | ||||
|      | ||||
|     Expr a = attrs.get("type"); | ||||
|     if (!a || evalString(state, a) != "derivation") return false; | ||||
| 
 | ||||
|     a = attrs.get("name"); | ||||
|     if (!a) throw badTerm("derivation name missing", e); | ||||
|     drv.name = evalString(state, a); | ||||
| 
 | ||||
|     a = attrs.get("system"); | ||||
|     if (!a) | ||||
|         drv.system = "unknown"; | ||||
|     else | ||||
|         drv.system = evalString(state, a); | ||||
| 
 | ||||
|     drv.attrs = attrs; | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void getDerivations(EvalState & state, Expr e, DrvInfos & drvs) | ||||
| { | ||||
|     ATermList es; | ||||
|     DrvInfo drv; | ||||
| 
 | ||||
|     e = evalExpr(state, e); | ||||
| 
 | ||||
|     if (getDerivation(state, e, drv))  | ||||
|         drvs.push_back(drv); | ||||
| 
 | ||||
|     else if (matchAttrs(e, es)) { | ||||
|         ATermMap drvMap; | ||||
|         queryAllAttrs(e, drvMap); | ||||
|         for (ATermIterator i(drvMap.keys()); i; ++i) { | ||||
|             debug(format("evaluating attribute `%1%'") % aterm2String(*i)); | ||||
|             if (getDerivation(state, drvMap.get(*i), drv)) | ||||
|                 drvs.push_back(drv); | ||||
|             else | ||||
|                 ; | ||||
|                 //                parseDerivations(state, drvMap.get(*i), drvs);
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     else if (matchList(e, es)) { | ||||
|         for (ATermIterator i(es); i; ++i) { | ||||
|             debug(format("evaluating list element")); | ||||
|             if (getDerivation(state, *i, drv)) | ||||
|                 drvs.push_back(drv); | ||||
|             else | ||||
|                 getDerivations(state, *i, drvs); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue