* Fix importing a derivation. This gave a segfault.

This commit is contained in:
Eelco Dolstra 2012-01-26 13:13:00 +00:00
parent 4c9fdd2cd6
commit baa0501cc1

View file

@ -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