forked from lix-project/lix
libexpr: move flake.nix attrsetness check out of eval state
this doesn't belong here, getFlake should be handling this instead. we
do lose the debug frame for loading a root flake, but that seems fine.
there's no point in starting a debugger if the root isn't even a flake
Change-Id: I24ad32b6716baee81a1a0f8bf9ce26814d97c7aa
This commit is contained in:
parent
94bb66c867
commit
e44dbfe97a
3 changed files with 13 additions and 12 deletions
|
@ -904,7 +904,7 @@ Value * ExprPath::maybeThunk(EvalState & state, Env & env)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EvalState::evalFile(const SourcePath & path_, Value & v, bool mustBeTrivial)
|
void EvalState::evalFile(const SourcePath & path_, Value & v)
|
||||||
{
|
{
|
||||||
auto path = checkSourcePath(path_);
|
auto path = checkSourcePath(path_);
|
||||||
|
|
||||||
|
@ -933,11 +933,6 @@ void EvalState::evalFile(const SourcePath & path_, Value & v, bool mustBeTrivial
|
||||||
"while evaluating the file '%1%':", resolvedPath.to_string())
|
"while evaluating the file '%1%':", resolvedPath.to_string())
|
||||||
: nullptr;
|
: nullptr;
|
||||||
|
|
||||||
// Enforce that 'flake.nix' is a direct attrset, not a
|
|
||||||
// computation.
|
|
||||||
if (mustBeTrivial &&
|
|
||||||
!(dynamic_cast<ExprAttrs *>(&e)))
|
|
||||||
error<EvalError>("file '%s' must be an attribute set", path).debugThrow();
|
|
||||||
eval(e, v);
|
eval(e, v);
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
e.addTrace(nullptr, "while evaluating the file '%1%':", resolvedPath.to_string());
|
e.addTrace(nullptr, "while evaluating the file '%1%':", resolvedPath.to_string());
|
||||||
|
|
|
@ -401,11 +401,9 @@ public:
|
||||||
Expr & parseStdin();
|
Expr & parseStdin();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Evaluate an expression read from the given file to normal
|
* Evaluate an expression read from the given file to normal form.
|
||||||
* form. Optionally enforce that the top-level expression is
|
|
||||||
* trivial (i.e. doesn't require arbitrary computation).
|
|
||||||
*/
|
*/
|
||||||
void evalFile(const SourcePath & path, Value & v, bool mustBeTrivial = false);
|
void evalFile(const SourcePath & path, Value & v);
|
||||||
|
|
||||||
void resetFileCache();
|
void resetFileCache();
|
||||||
|
|
||||||
|
|
|
@ -241,9 +241,17 @@ static Flake getFlake(
|
||||||
.sourceInfo = std::make_shared<fetchers::Tree>(std::move(sourceInfo))
|
.sourceInfo = std::make_shared<fetchers::Tree>(std::move(sourceInfo))
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOTE evalFile forces vInfo to be an attrset because mustBeTrivial is true.
|
// FIXME: symlink attack
|
||||||
|
auto resolvedFlakeFile = resolveExprPath(state.checkSourcePath(CanonPath(flakeFile)));
|
||||||
|
Expr & flakeExpr = state.parseExprFromFile(state.checkSourcePath(resolvedFlakeFile));
|
||||||
|
|
||||||
|
// Enforce that 'flake.nix' is a direct attrset, not a computation.
|
||||||
|
if (!(dynamic_cast<ExprAttrs *>(&flakeExpr))) {
|
||||||
|
state.error<EvalError>("file '%s' must be an attribute set", resolvedFlakeFile).debugThrow();
|
||||||
|
}
|
||||||
|
|
||||||
Value vInfo;
|
Value vInfo;
|
||||||
state.evalFile(CanonPath(flakeFile), vInfo, true); // FIXME: symlink attack
|
state.eval(flakeExpr, vInfo);
|
||||||
|
|
||||||
if (auto description = vInfo.attrs->get(state.s.description)) {
|
if (auto description = vInfo.attrs->get(state.s.description)) {
|
||||||
expectType(state, nString, *description->value, description->pos);
|
expectType(state, nString, *description->value, description->pos);
|
||||||
|
|
Loading…
Reference in a new issue