* 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…
Reference in a new issue