nix-instantiate: Fix read-only evaluation
This commit is contained in:
		
							parent
							
								
									8d8d47abd2
								
							
						
					
					
						commit
						408a7bfac1
					
				
					 5 changed files with 17 additions and 10 deletions
				
			
		|  | @ -138,6 +138,7 @@ EvalState::EvalState() | ||||||
|     , sName(symbols.create("name")) |     , sName(symbols.create("name")) | ||||||
|     , sSystem(symbols.create("system")) |     , sSystem(symbols.create("system")) | ||||||
|     , sOverrides(symbols.create("__overrides")) |     , sOverrides(symbols.create("__overrides")) | ||||||
|  |     , sOutputName(symbols.create("outputName")) | ||||||
|     , baseEnv(allocEnv(128)) |     , baseEnv(allocEnv(128)) | ||||||
|     , baseEnvDispl(0) |     , baseEnvDispl(0) | ||||||
|     , staticBaseEnv(false, 0) |     , staticBaseEnv(false, 0) | ||||||
|  |  | ||||||
|  | @ -93,7 +93,7 @@ public: | ||||||
|     SymbolTable symbols; |     SymbolTable symbols; | ||||||
| 
 | 
 | ||||||
|     const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, |     const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, | ||||||
|         sSystem, sOverrides; |         sSystem, sOverrides, sOutputName; | ||||||
| 
 | 
 | ||||||
|     /* If set, force copying files to the Nix store even if they
 |     /* If set, force copying files to the Nix store even if they
 | ||||||
|        already exist there. */ |        already exist there. */ | ||||||
|  |  | ||||||
|  | @ -28,6 +28,17 @@ string DrvInfo::queryOutPath(EvalState & state) const | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | string DrvInfo::queryOutputName(EvalState & state) const | ||||||
|  | { | ||||||
|  |     if (outputName == "" && attrs) { | ||||||
|  |         Bindings::iterator i = attrs->find(state.sOutputName); | ||||||
|  |         PathSet context; | ||||||
|  |         (string &) outputName = i != attrs->end() ? state.coerceToString(*i->value, context) : ""; | ||||||
|  |     } | ||||||
|  |     return outputName; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| MetaInfo DrvInfo::queryMetaInfo(EvalState & state) const | MetaInfo DrvInfo::queryMetaInfo(EvalState & state) const | ||||||
| { | { | ||||||
|     if (metaInfoRead) return meta; |     if (metaInfoRead) return meta; | ||||||
|  |  | ||||||
|  | @ -28,6 +28,7 @@ struct DrvInfo | ||||||
| private: | private: | ||||||
|     string drvPath; |     string drvPath; | ||||||
|     string outPath; |     string outPath; | ||||||
|  |     string outputName; | ||||||
| 
 | 
 | ||||||
|     bool metaInfoRead; |     bool metaInfoRead; | ||||||
|     MetaInfo meta; |     MetaInfo meta; | ||||||
|  | @ -46,6 +47,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     string queryDrvPath(EvalState & state) const; |     string queryDrvPath(EvalState & state) const; | ||||||
|     string queryOutPath(EvalState & state) const; |     string queryOutPath(EvalState & state) const; | ||||||
|  |     string queryOutputName(EvalState & state) const; | ||||||
|     MetaInfo queryMetaInfo(EvalState & state) const; |     MetaInfo queryMetaInfo(EvalState & state) const; | ||||||
|     MetaValue queryMetaInfo(EvalState & state, const string & name) const; |     MetaValue queryMetaInfo(EvalState & state, const string & name) const; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -62,16 +62,9 @@ void processExpr(EvalState & state, const Strings & attrPaths, | ||||||
|                     Path drvPath = i->queryDrvPath(state); |                     Path drvPath = i->queryDrvPath(state); | ||||||
| 
 | 
 | ||||||
|                     /* What output do we want? */ |                     /* What output do we want? */ | ||||||
|                     Path outPath = i->queryOutPath(state); |                     string outputName = i->queryOutputName(state); | ||||||
|                     Derivation drv = derivationFromPath(*store, drvPath); |  | ||||||
|                     string outputName; |  | ||||||
|                     foreach (DerivationOutputs::iterator, i, drv.outputs) |  | ||||||
|                         if (i->second.path == outPath) { |  | ||||||
|                             outputName = i->first; |  | ||||||
|                             break; |  | ||||||
|                         } |  | ||||||
|                     if (outputName == "") |                     if (outputName == "") | ||||||
|                         throw Error(format("derivation `%1%' does not have an output `%2%'") % drvPath % outPath); |                         throw Error(format("derivation `%1%' lacks an `outputName' attribute ") % drvPath); | ||||||
| 
 | 
 | ||||||
|                     if (gcRoot == "") |                     if (gcRoot == "") | ||||||
|                         printGCWarning(); |                         printGCWarning(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue