* Fix importing a derivation. This gave a segfault.
This commit is contained in:
		
							parent
							
								
									4c9fdd2cd6
								
							
						
					
					
						commit
						baa0501cc1
					
				
					 1 changed files with 23 additions and 8 deletions
				
			
		|  | @ -23,6 +23,18 @@ namespace nix { | ||||||
|  *************************************************************/ |  *************************************************************/ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | /* Decode a context string ‘!<name>!<path>’ into a pair <path,
 | ||||||
|  |    name>. */ | ||||||
|  | std::pair<string, string> decodeContext(const string & s) | ||||||
|  | { | ||||||
|  |     if (s.at(0) == '!') { | ||||||
|  |         size_t index = s.find("!", 1); | ||||||
|  |         return std::pair<string, string>(string(s, index + 1), string(s, 1, index - 1)); | ||||||
|  |     } else | ||||||
|  |         return std::pair<string, string>(s, ""); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| /* Load and evaluate an expression from path specified by the
 | /* Load and evaluate an expression from path specified by the
 | ||||||
|    argument. */  |    argument. */  | ||||||
| static void prim_import(EvalState & state, Value * * args, Value & v) | static void prim_import(EvalState & state, Value * * args, Value & v) | ||||||
|  | @ -30,14 +42,17 @@ static void prim_import(EvalState & state, Value * * args, Value & v) | ||||||
|     PathSet context; |     PathSet context; | ||||||
|     Path path = state.coerceToPath(*args[0], context); |     Path path = state.coerceToPath(*args[0], context); | ||||||
| 
 | 
 | ||||||
|     for (PathSet::iterator i = context.begin(); i != context.end(); ++i) { |     foreach (PathSet::iterator, i, context) { | ||||||
|         assert(isStorePath(*i)); |         Path ctx = decodeContext(*i).first; | ||||||
|         if (!store->isValidPath(*i)) |         assert(isStorePath(ctx)); | ||||||
|  |         if (!store->isValidPath(ctx)) | ||||||
|             throw EvalError(format("cannot import `%1%', since path `%2%' is not valid") |             throw EvalError(format("cannot import `%1%', since path `%2%' is not valid") | ||||||
|                 % path % *i); |                 % path % ctx); | ||||||
|         if (isDerivation(*i)) |         if (isDerivation(ctx)) | ||||||
|             try { |             try { | ||||||
|                 store->buildDerivations(singleton<PathSet>(*i)); |                 /* !!! If using a substitute, we only need to fetch
 | ||||||
|  |                    the selected output of this derivation. */ | ||||||
|  |                 store->buildDerivations(singleton<PathSet>(ctx)); | ||||||
|             } catch (Error & e) { |             } catch (Error & e) { | ||||||
|                 throw ImportError(e.msg()); |                 throw ImportError(e.msg()); | ||||||
|             } |             } | ||||||
|  | @ -374,8 +389,8 @@ static void prim_derivationStrict(EvalState & state, Value * * args, Value & v) | ||||||
| 
 | 
 | ||||||
|         /* Handle derivation outputs of the form ‘!<name>!<path>’. */ |         /* Handle derivation outputs of the form ‘!<name>!<path>’. */ | ||||||
|         else if (path.at(0) == '!') { |         else if (path.at(0) == '!') { | ||||||
|             size_t index = path.find("!", 1); |             std::pair<string, string> ctx = decodeContext(path); | ||||||
|             drv.inputDrvs[string(path, index + 1)].insert(string(path, 1, index - 1)); |             drv.inputDrvs[ctx.first].insert(ctx.second); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /* Handle derivation contexts returned by
 |         /* Handle derivation contexts returned by
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue