From c8b52f58363b1e399cfc225a435c2445e92718d5 Mon Sep 17 00:00:00 2001 From: Timothy DeHerrera Date: Fri, 4 Nov 2022 09:10:54 -0600 Subject: [PATCH] fix: use `InstallableFlake` type & methods Fixes #134 Use the `InstallableFlake` type in order to make use of it's `toValue` method. This fixes the functor auto-call by including the work from nixos/nix#6404. Future work may make use of this object and its methods to employ the flake based eval cache. --- src/nix-eval-jobs.cc | 62 ++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/src/nix-eval-jobs.cc b/src/nix-eval-jobs.cc index 12ad152..f6dacb5 100644 --- a/src/nix-eval-jobs.cc +++ b/src/nix-eval-jobs.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -148,44 +149,10 @@ static Value *releaseExprTopLevelValue(EvalState &state, Bindings &autoArgs) { return vRoot; } -static Value *flakeTopLevelValue(EvalState &state, Bindings &autoArgs) { - using namespace flake; - - auto [flakeRef, fragment] = - parseFlakeRefWithFragment(myArgs.releaseExpr, absPath(".")); - - auto vFlake = state.allocValue(); - - auto lockedFlake = lockFlake(state, flakeRef, - LockFlags{ - .updateLockFile = false, - .useRegistries = false, - .allowMutable = false, - }); - - callFlake(state, lockedFlake, *vFlake); - - auto vOutputs = vFlake->attrs->get(state.symbols.create("outputs"))->value; - state.forceValue(*vOutputs, noPos); - auto vTop = *vOutputs; - - if (fragment.length() > 0) { - Bindings &bindings(*state.allocBindings(0)); - auto [nTop, pos] = findAlongAttrPath(state, fragment, bindings, vTop); - if (!nTop) - throw Error("error: attribute '%s' missing", nTop); - vTop = *nTop; - } - - auto vRoot = state.allocValue(); - state.autoCallFunction(autoArgs, vTop, *vRoot); - - return vRoot; -} - -Value *topLevelValue(EvalState &state, Bindings &autoArgs) { - return myArgs.flake ? flakeTopLevelValue(state, autoArgs) - : releaseExprTopLevelValue(state, autoArgs); +Value *topLevelValue(EvalState &state, Bindings &autoArgs, + std::optional flake) { + return flake.has_value() ? flake.value().toValue(state).first + : releaseExprTopLevelValue(state, autoArgs); } bool queryIsCached(Store &store, std::map &outputs) { @@ -279,7 +246,24 @@ std::string attrPathJoin(json input) { static void worker(EvalState &state, Bindings &autoArgs, AutoCloseFD &to, AutoCloseFD &from) { - auto vRoot = topLevelValue(state, autoArgs); + + std::optional flake; + if (myArgs.flake) { + auto [flakeRef, fragment, outputSpec] = + parseFlakeRefWithFragmentAndOutputsSpec(myArgs.releaseExpr, + absPath(".")); + + flake.emplace(InstallableFlake({}, ref(&state), + std::move(flakeRef), fragment, + outputSpec, {}, {}, + flake::LockFlags{ + .updateLockFile = false, + .useRegistries = false, + .allowMutable = false, + })); + }; + + auto vRoot = topLevelValue(state, autoArgs, flake); while (true) { /* Wait for the collector to send us a job name. */