Use __toString when coercing sets to strings.
For example, "${{ foo = "bar"; __toString = x: x.foo; }}" evaluates
to "bar".
With this, we can delay calling functions like mkDerivation,
buildPythonPackage, etc. until we actually need a derivation, enabling
overrides and other modifications to happen by simple attribute set
update.
			
			
This commit is contained in:
		
							parent
							
								
									6298afc047
								
							
						
					
					
						commit
						14080f3e4b
					
				
					 2 changed files with 10 additions and 2 deletions
				
			
		|  | @ -261,6 +261,7 @@ EvalState::EvalState(const Strings & _searchPath) | ||||||
|     , sLine(symbols.create("line")) |     , sLine(symbols.create("line")) | ||||||
|     , sColumn(symbols.create("column")) |     , sColumn(symbols.create("column")) | ||||||
|     , sFunctor(symbols.create("__functor")) |     , sFunctor(symbols.create("__functor")) | ||||||
|  |     , sToString(symbols.create("__toString")) | ||||||
|     , baseEnv(allocEnv(128)) |     , baseEnv(allocEnv(128)) | ||||||
|     , staticBaseEnv(false, 0) |     , staticBaseEnv(false, 0) | ||||||
| { | { | ||||||
|  | @ -1389,7 +1390,14 @@ string EvalState::coerceToString(const Pos & pos, Value & v, PathSet & context, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (v.type == tAttrs) { |     if (v.type == tAttrs) { | ||||||
|         Bindings::iterator i = v.attrs->find(sOutPath); |         auto i = v.attrs->find(sToString); | ||||||
|  |         if (i != v.attrs->end()) { | ||||||
|  |             forceValue(*i->value, pos); | ||||||
|  |             Value v1; | ||||||
|  |             callFunction(*i->value, v, v1, pos); | ||||||
|  |             return coerceToString(pos, v1, context, coerceMore, copyToStore); | ||||||
|  |         } | ||||||
|  |         i = v.attrs->find(sOutPath); | ||||||
|         if (i == v.attrs->end()) throwTypeError("cannot coerce a set to a string, at %1%", pos); |         if (i == v.attrs->end()) throwTypeError("cannot coerce a set to a string, at %1%", pos); | ||||||
|         return coerceToString(pos, *i->value, context, coerceMore, copyToStore); |         return coerceToString(pos, *i->value, context, coerceMore, copyToStore); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -69,7 +69,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue, |     const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue, | ||||||
|         sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls, |         sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls, | ||||||
|         sFile, sLine, sColumn, sFunctor; |         sFile, sLine, sColumn, sFunctor, sToString; | ||||||
|     Symbol sDerivationNix; |     Symbol sDerivationNix; | ||||||
| 
 | 
 | ||||||
|     /* If set, force copying files to the Nix store even if they
 |     /* If set, force copying files to the Nix store even if they
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue