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:
eldritch horrors 2024-11-27 02:09:08 +01:00
parent 94bb66c867
commit e44dbfe97a
3 changed files with 13 additions and 12 deletions

View file

@ -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_);
@ -933,11 +933,6 @@ void EvalState::evalFile(const SourcePath & path_, Value & v, bool mustBeTrivial
"while evaluating the file '%1%':", resolvedPath.to_string())
: 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);
} catch (Error & e) {
e.addTrace(nullptr, "while evaluating the file '%1%':", resolvedPath.to_string());

View file

@ -401,11 +401,9 @@ public:
Expr & parseStdin();
/**
* Evaluate an expression read from the given file to normal
* form. Optionally enforce that the top-level expression is
* trivial (i.e. doesn't require arbitrary computation).
* Evaluate an expression read from the given file to normal form.
*/
void evalFile(const SourcePath & path, Value & v, bool mustBeTrivial = false);
void evalFile(const SourcePath & path, Value & v);
void resetFileCache();

View file

@ -241,9 +241,17 @@ static Flake getFlake(
.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;
state.evalFile(CanonPath(flakeFile), vInfo, true); // FIXME: symlink attack
state.eval(flakeExpr, vInfo);
if (auto description = vInfo.attrs->get(state.s.description)) {
expectType(state, nString, *description->value, description->pos);