forked from lix-project/lix
* Pass the autoArgs to findAlongAttrPath so that "nix-instantiate
foo.nix -A attr --arg name value" will work if (name, value) is needed in the evaluation leading up to "attr".
This commit is contained in:
parent
b19cebc513
commit
9638f3f393
|
@ -12,7 +12,8 @@ bool isAttrs(EvalState & state, Expr e, ATermMap & attrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Expr findAlongAttrPath(EvalState & state, const string & attrPath, Expr e)
|
Expr findAlongAttrPath(EvalState & state, const string & attrPath,
|
||||||
|
const ATermMap & autoArgs, Expr e)
|
||||||
{
|
{
|
||||||
Strings tokens = tokenizeString(attrPath, ".");
|
Strings tokens = tokenizeString(attrPath, ".");
|
||||||
|
|
||||||
|
@ -33,7 +34,7 @@ Expr findAlongAttrPath(EvalState & state, const string & attrPath, Expr e)
|
||||||
if (string2Int(attr, attrIndex)) apType = apIndex;
|
if (string2Int(attr, attrIndex)) apType = apIndex;
|
||||||
|
|
||||||
/* Evaluate the expression. */
|
/* Evaluate the expression. */
|
||||||
e = evalExpr(state, autoCallFunction(evalExpr(state, e), ATermMap(1)));
|
e = evalExpr(state, autoCallFunction(evalExpr(state, e), autoArgs));
|
||||||
|
|
||||||
/* It should evaluate to either an attribute set or an
|
/* It should evaluate to either an attribute set or an
|
||||||
expression, according to what is specified in the
|
expression, according to what is specified in the
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
#include "eval.hh"
|
#include "eval.hh"
|
||||||
|
|
||||||
|
|
||||||
Expr findAlongAttrPath(EvalState & state, const string & attrPath, Expr e);
|
Expr findAlongAttrPath(EvalState & state, const string & attrPath,
|
||||||
|
const ATermMap & autoArgs, Expr e);
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__ATTR_PATH_H */
|
#endif /* !__ATTR_PATH_H */
|
||||||
|
|
|
@ -178,9 +178,10 @@ Expr strictEval(EvalState & state, Expr e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Expr doEval(EvalState & state, string attrPath, bool parseOnly, bool strict, Expr e)
|
Expr doEval(EvalState & state, string attrPath, bool parseOnly, bool strict,
|
||||||
|
const ATermMap & autoArgs, Expr e)
|
||||||
{
|
{
|
||||||
e = findAlongAttrPath(state, attrPath, e);
|
e = findAlongAttrPath(state, attrPath, autoArgs, e);
|
||||||
if (!parseOnly)
|
if (!parseOnly)
|
||||||
if (strict)
|
if (strict)
|
||||||
e = strictEval(state, e);
|
e = strictEval(state, e);
|
||||||
|
@ -229,6 +230,7 @@ void run(Strings args)
|
||||||
if (i == args.end())
|
if (i == args.end())
|
||||||
throw UsageError("`--arg' requires two arguments");
|
throw UsageError("`--arg' requires two arguments");
|
||||||
Expr value = parseExprFromString(state, *i++, absPath("."));
|
Expr value = parseExprFromString(state, *i++, absPath("."));
|
||||||
|
printMsg(lvlError, format("X %1% Y %2%") % name % value);
|
||||||
autoArgs.set(toATerm(name), value);
|
autoArgs.set(toATerm(name), value);
|
||||||
}
|
}
|
||||||
else if (arg == "--add-root") {
|
else if (arg == "--add-root") {
|
||||||
|
@ -252,7 +254,7 @@ void run(Strings args)
|
||||||
|
|
||||||
if (readStdin) {
|
if (readStdin) {
|
||||||
Expr e = parseStdin(state);
|
Expr e = parseStdin(state);
|
||||||
e = doEval(state, attrPath, parseOnly, strict, e);
|
e = doEval(state, attrPath, parseOnly, strict, autoArgs, e);
|
||||||
printResult(state, e, evalOnly, xmlOutput, autoArgs);
|
printResult(state, e, evalOnly, xmlOutput, autoArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,7 +263,7 @@ void run(Strings args)
|
||||||
{
|
{
|
||||||
Path path = absPath(*i);
|
Path path = absPath(*i);
|
||||||
Expr e = parseExprFromFile(state, path);
|
Expr e = parseExprFromFile(state, path);
|
||||||
e = doEval(state, attrPath, parseOnly, strict, e);
|
e = doEval(state, attrPath, parseOnly, strict, autoArgs, e);
|
||||||
printResult(state, e, evalOnly, xmlOutput, autoArgs);
|
printResult(state, e, evalOnly, xmlOutput, autoArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue