Disable IFD selectively

It's now disabled by default for the following:

* 'nix search' (this was already implied by read-only mode)
* 'nix flake show'
* 'nix flake check', but only on the hydraJobs output
This commit is contained in:
Eelco Dolstra 2021-09-22 17:15:07 +02:00
parent d8c10028d9
commit 8623a5b595
2 changed files with 31 additions and 9 deletions

View file

@ -131,9 +131,19 @@ static void enumerateOutputs(EvalState & state, Value & vFlake,
state.forceAttrs(*aOutputs->value); state.forceAttrs(*aOutputs->value);
for (auto & attr : *aOutputs->value->attrs) auto sHydraJobs = state.symbols.create("hydraJobs");
/* Hack: ensure that hydraJobs is evaluated before anything
else. This way we can disable IFD for hydraJobs and then enable
it for other outputs. */
if (auto attr = aOutputs->value->attrs->get(sHydraJobs))
callback(attr->name, *attr->value, *attr->pos);
for (auto & attr : *aOutputs->value->attrs) {
if (attr.name != sHydraJobs)
callback(attr.name, *attr.value, *attr.pos); callback(attr.name, *attr.value, *attr.pos);
} }
}
struct CmdFlakeMetadata : FlakeCommand, MixJSON struct CmdFlakeMetadata : FlakeCommand, MixJSON
{ {
@ -269,7 +279,10 @@ struct CmdFlakeCheck : FlakeCommand
void run(nix::ref<nix::Store> store) override void run(nix::ref<nix::Store> store) override
{ {
settings.readOnlyMode = !build; if (!build) {
settings.readOnlyMode = true;
evalSettings.enableImportFromDerivation.setDefault(false);
}
auto state = getEvalState(); auto state = getEvalState();
@ -381,9 +394,13 @@ struct CmdFlakeCheck : FlakeCommand
for (auto & attr : *v.attrs) { for (auto & attr : *v.attrs) {
state->forceAttrs(*attr.value, *attr.pos); state->forceAttrs(*attr.value, *attr.pos);
if (!state->isDerivation(*attr.value)) auto attrPath2 = attrPath + "." + (std::string) attr.name;
checkHydraJobs(attrPath + "." + (std::string) attr.name, if (state->isDerivation(*attr.value)) {
*attr.value, *attr.pos); Activity act(*logger, lvlChatty, actUnknown,
fmt("checking Hydra job '%s'", attrPath2));
checkDerivation(attrPath2, *attr.value, *attr.pos);
} else
checkHydraJobs(attrPath2, *attr.value, *attr.pos);
} }
} catch (Error & e) { } catch (Error & e) {
@ -447,8 +464,8 @@ struct CmdFlakeCheck : FlakeCommand
if (!v.isLambda()) if (!v.isLambda())
throw Error("bundler must be a function"); throw Error("bundler must be a function");
if (!v.lambda.fun->formals || if (!v.lambda.fun->formals ||
v.lambda.fun->formals->argNames.find(state->symbols.create("program")) == v.lambda.fun->formals->argNames.end() || !v.lambda.fun->formals->argNames.count(state->symbols.create("program")) ||
v.lambda.fun->formals->argNames.find(state->symbols.create("system")) == v.lambda.fun->formals->argNames.end()) !v.lambda.fun->formals->argNames.count(state->symbols.create("system")))
throw Error("bundler must take formal arguments 'program' and 'system'"); throw Error("bundler must take formal arguments 'program' and 'system'");
} catch (Error & e) { } catch (Error & e) {
e.addTrace(pos, hintfmt("while checking the template '%s'", attrPath)); e.addTrace(pos, hintfmt("while checking the template '%s'", attrPath));
@ -469,6 +486,8 @@ struct CmdFlakeCheck : FlakeCommand
fmt("checking flake output '%s'", name)); fmt("checking flake output '%s'", name));
try { try {
evalSettings.enableImportFromDerivation.setDefault(name != "hydraJobs");
state->forceValue(vOutput, pos); state->forceValue(vOutput, pos);
if (name == "checks") { if (name == "checks") {
@ -603,7 +622,7 @@ struct CmdFlakeCheck : FlakeCommand
store->buildPaths(drvPaths); store->buildPaths(drvPaths);
} }
if (hasErrors) if (hasErrors)
throw Error("Some errors were encountered during the evaluation"); throw Error("some errors were encountered during the evaluation");
} }
}; };
@ -873,6 +892,8 @@ struct CmdFlakeShow : FlakeCommand, MixJSON
void run(nix::ref<nix::Store> store) override void run(nix::ref<nix::Store> store) override
{ {
evalSettings.enableImportFromDerivation.setDefault(false);
auto state = getEvalState(); auto state = getEvalState();
auto flake = std::make_shared<LockedFlake>(lockFlake()); auto flake = std::make_shared<LockedFlake>(lockFlake());

View file

@ -62,6 +62,7 @@ struct CmdSearch : InstallableCommand, MixJSON
void run(ref<Store> store) override void run(ref<Store> store) override
{ {
settings.readOnlyMode = true; settings.readOnlyMode = true;
evalSettings.enableImportFromDerivation.setDefault(false);
// Empty search string should match all packages // Empty search string should match all packages
// Use "^" here instead of ".*" due to differences in resulting highlighting // Use "^" here instead of ".*" due to differences in resulting highlighting