import: If the path is a valid .drv file, parse it and generate a derivation attrset.
The generated attrset has drvPath and outPath with the right string context, type 'derivation', outputName with the right name, all with a list of outputs, and an attribute for each output. I see three uses for this (though certainly there may be more): * Using derivations generated by something besides nix-instantiate (e.g. guix) * Allowing packages provided by channels to be used in nix expressions. If a channel installed a valid deriver for each package it provides into the store, then those could be imported and used as dependencies or installed in environment.systemPackages, for example. * Enable hydra to be consistent in how it treats inputs that are outputs of another build. Right now, if an input is passed as an argument to the job, it is passed as a derivation, but if it is accessed via NIX_PATH (i.e. through the <> syntax), then it is a path that can be imported. This is problematic because the build being depended upon may have been built with non-obvious arguments passed to its jobset file. With this feature, hydra can just set the name of that input to the path to its drv file in NIX_PATH
This commit is contained in:
		
							parent
							
								
									566a30c007
								
							
						
					
					
						commit
						b1112bbef1
					
				
					 3 changed files with 48 additions and 2 deletions
				
			
		|  | @ -59,7 +59,31 @@ static void prim_import(EvalState & state, Value * * args, Value & v) | |||
|             } | ||||
|     } | ||||
| 
 | ||||
|     state.evalFile(path, v); | ||||
|     if (isStorePath(path) && store->isValidPath(path) && isDerivation(path)) { | ||||
|         Derivation drv = parseDerivation(readFile(path)); | ||||
|         Value w; | ||||
|         state.mkAttrs(w, 1 + drv.outputs.size()); | ||||
|         mkString(*state.allocAttr(w, state.sDrvPath), path, singleton<PathSet>("=" + path)); | ||||
|         state.mkList(*state.allocAttr(w, state.symbols.create("outputs")), drv.outputs.size()); | ||||
|         unsigned int outputs_index = 0; | ||||
| 
 | ||||
|         Value * outputsVal = w.attrs->find(state.symbols.create("outputs"))->value; | ||||
|         foreach (DerivationOutputs::iterator, i, drv.outputs) { | ||||
|             mkString(*state.allocAttr(w, state.symbols.create(i->first)), | ||||
|                 i->second.path, singleton<PathSet>("!" + i->first + "!" + path)); | ||||
|             mkString(*(outputsVal->list.elems[outputs_index++] = state.allocValue()), | ||||
|                 i->first); | ||||
|         } | ||||
|         w.attrs->sort(); | ||||
|         Value fun; | ||||
|         state.mkThunk_(fun, | ||||
|             state.parseExprFromFile(state.findFile("nix/imported-drv-to-derivation.nix"))); | ||||
|         state.forceFunction(fun); | ||||
|         mkApp(v, fun, w); | ||||
|         state.forceAttrs(v); | ||||
|     } else { | ||||
|         state.evalFile(path, v); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue