* Quick hack to fix NIX-67: evaluation result differing if the Nix
expression resides in the store.
This commit is contained in:
		
							parent
							
								
									bd0c40e1e9
								
							
						
					
					
						commit
						0c4c5c2020
					
				
					 2 changed files with 16 additions and 13 deletions
				
			
		|  | @ -244,9 +244,11 @@ string coerceToStringWithContext(EvalState & state, | ||||||
|      |      | ||||||
|     e = evalExpr(state, e); |     e = evalExpr(state, e); | ||||||
| 
 | 
 | ||||||
|  |     bool isWrapped = false; | ||||||
|     ATermList es; |     ATermList es; | ||||||
|     ATerm e2; |     ATerm e2; | ||||||
|     if (matchContext(e, es, e2)) { |     if (matchContext(e, es, e2)) { | ||||||
|  |         isWrapped = true; | ||||||
|         e = e2; |         e = e2; | ||||||
|         context = ATconcat(es, context); |         context = ATconcat(es, context); | ||||||
|     } |     } | ||||||
|  | @ -258,7 +260,7 @@ string coerceToStringWithContext(EvalState & state, | ||||||
|     if (matchPath(e, s)) { |     if (matchPath(e, s)) { | ||||||
|         isPath = true; |         isPath = true; | ||||||
|         Path path = aterm2String(s); |         Path path = aterm2String(s); | ||||||
|         if (isInStore(path)) { |         if (isInStore(path) && !isWrapped) { | ||||||
|             context = ATinsert(context, makePath(toATerm(toStorePath(path)))); |             context = ATinsert(context, makePath(toATerm(toStorePath(path)))); | ||||||
|         } |         } | ||||||
|         return path; |         return path; | ||||||
|  | @ -295,16 +297,18 @@ static ATerm concatStrings(EvalState & state, const ATermVector & args) | ||||||
|     std::ostringstream s; |     std::ostringstream s; | ||||||
|     bool isPath = false; |     bool isPath = false; | ||||||
| 
 | 
 | ||||||
|  |     /* Note that if the first argument in the concatenation is a path,
 | ||||||
|  |        then the result is also a path. */ | ||||||
|  | 
 | ||||||
|     for (ATermVector::const_iterator i = args.begin(); i != args.end(); ++i) { |     for (ATermVector::const_iterator i = args.begin(); i != args.end(); ++i) { | ||||||
|         bool isPath2; |         bool isPath2; | ||||||
|         s << coerceToStringWithContext(state, context, *i, isPath2); |         s << coerceToStringWithContext(state, context, *i, isPath2); | ||||||
|         if (i == args.begin()) isPath = isPath2; |         if (i == args.begin()) isPath = isPath2; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     Expr result = isPath |     return wrapInContext(context, isPath | ||||||
|         ? makePath(toATerm(canonPath(s.str()))) |         ? makePath(toATerm(canonPath(s.str()))) | ||||||
|         : makeStr(toATerm(s.str())); |         : makeStr(toATerm(s.str()))); | ||||||
|     return wrapInContext(context, result); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -159,8 +159,15 @@ void toString(EvalState & state, Expr e, | ||||||
|     else if (matchPath(e, s)) { |     else if (matchPath(e, s)) { | ||||||
|         Path path(canonPath(aterm2String(s))); |         Path path(canonPath(aterm2String(s))); | ||||||
| 
 | 
 | ||||||
|         if (!isInStore(path)) { |         if (isStorePath(path) || (isWrapped && isInStore(path))) { | ||||||
|  |             result += path; | ||||||
|  |             /* !!! smells hacky.  Check whether this is the Right
 | ||||||
|  |                Thing To Do. */ | ||||||
|  |             if (!isWrapped) | ||||||
|  |                 context = ATinsert(context, makePath(toATerm(toStorePath(path)))); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|  |         else { | ||||||
|             if (isDerivation(path)) |             if (isDerivation(path)) | ||||||
|                 throw EvalError(format("file names are not allowed to end in `%1%'") |                 throw EvalError(format("file names are not allowed to end in `%1%'") | ||||||
|                     % drvExtension); |                     % drvExtension); | ||||||
|  | @ -178,14 +185,6 @@ void toString(EvalState & state, Expr e, | ||||||
|             result += dstPath; |             result += dstPath; | ||||||
|             context = ATinsert(context, makePath(toATerm(dstPath))); |             context = ATinsert(context, makePath(toATerm(dstPath))); | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         else { |  | ||||||
|             result += path; |  | ||||||
|             /* !!! smells hacky.  Check whether this is the Right
 |  | ||||||
|                Thing To Do. */ |  | ||||||
|             if (!isWrapped) |  | ||||||
|                 context = ATinsert(context, makePath(toATerm(toStorePath(path)))); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     else if (matchList(e, es)) { |     else if (matchList(e, es)) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue