builtins.exec: Make the argument just a list
This commit is contained in:
		
							parent
							
								
									d299bd710a
								
							
						
					
					
						commit
						3ecb09a40a
					
				
					 1 changed files with 10 additions and 23 deletions
				
			
		|  | @ -181,30 +181,17 @@ static void prim_importNative(EvalState & state, const Pos & pos, Value * * args | |||
| /* Execute a program and parse its output */ | ||||
| static void prim_exec(EvalState & state, const Pos & pos, Value * * args, Value & v) | ||||
| { | ||||
|     state.forceAttrs(*args[0], pos); | ||||
|     auto sProgram = state.symbols.create("program"); | ||||
|     auto sArguments = state.symbols.create("arguments"); | ||||
|     PathSet context; | ||||
|     string program; | ||||
|     bool programSet = false; | ||||
|     Strings commandArgs; | ||||
|     for (auto & attr : *args[0]->attrs) { | ||||
|         if (attr.name == sProgram) { | ||||
|             program = state.coerceToString(*attr.pos, *attr.value, context, false, false); | ||||
|             programSet = true; | ||||
|         } else if (attr.name == sArguments) { | ||||
|             state.forceList(*attr.value, *attr.pos); | ||||
|             auto elems = attr.value->listElems(); | ||||
|             for (unsigned int i = 0; i < attr.value->listSize(); ++i) { | ||||
|                 commandArgs.emplace_back(state.coerceToString(*attr.pos, *elems[i], context, false, false)); | ||||
|             } | ||||
|         } else { | ||||
|             throw EvalError(format("unexpected attribute ‘%1%’ in argument to builtins.exec, at %2%") | ||||
|                 % attr.name % pos); | ||||
|         } | ||||
|     state.forceList(*args[0], pos); | ||||
|     auto elems = args[0]->listElems(); | ||||
|     auto count = args[0]->listSize(); | ||||
|     if (count == 0) { | ||||
|         throw EvalError(format("at least one argument to 'exec' required, at %1%") % pos); | ||||
|     } | ||||
|     if (!programSet) { | ||||
|         throw EvalError(format("attribute ‘programSet’ required, at %1%") % pos); | ||||
|     PathSet context; | ||||
|     auto program = state.coerceToString(pos, *elems[0], context, false, false); | ||||
|     Strings commandArgs; | ||||
|     for (unsigned int i = 1; i < args[0]->listSize(); ++i) { | ||||
|         commandArgs.emplace_back(state.coerceToString(pos, *elems[i], context, false, false)); | ||||
|     } | ||||
|     try { | ||||
|         state.realiseContext(context); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue