diff --git a/flake.lock b/flake.lock index cf03d2a..7602a77 100644 --- a/flake.lock +++ b/flake.lock @@ -47,11 +47,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1732112222, - "narHash": "sha256-H7GN4++a4vE49SUNojZx+FSk4mmpb2ifJUtJMJHProI=", - "rev": "66f6dbda32959dd5cf3a9aaba15af72d037ab7ff", + "lastModified": 1733448312, + "narHash": "sha256-id5U81bzXk/Lg900nGLM4CQb0wmTdzIvQz7CZk2OcTM=", + "rev": "2a9e560570982a91937d199af3e7b7a8f3cbe14b", "type": "tarball", - "url": "https://git.lix.systems/api/v1/repos/lix-project/lix/archive/66f6dbda32959dd5cf3a9aaba15af72d037ab7ff.tar.gz?rev=66f6dbda32959dd5cf3a9aaba15af72d037ab7ff" + "url": "https://git.lix.systems/api/v1/repos/lix-project/lix/archive/2a9e560570982a91937d199af3e7b7a8f3cbe14b.tar.gz?rev=2a9e560570982a91937d199af3e7b7a8f3cbe14b" }, "original": { "type": "tarball", @@ -96,11 +96,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1732244845, - "narHash": "sha256-aspop5sCDNpDMS23BplGFtQDadwkSb/sOxpuC3lafvo=", + "lastModified": 1733408989, + "narHash": "sha256-VCQpCQy+6ik+oYKWUCvq0WM2V7UtEKldqdsEzCNEOLc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "df94f897ffe1af1bcd60cb68697c5d8e6431346e", + "rev": "d916387b68a74040a3873ad2a08a559c60cedb5e", "type": "github" }, "original": { diff --git a/src/drv.cc b/src/drv.cc index dca58de..bacbf2a 100644 --- a/src/drv.cc +++ b/src/drv.cc @@ -45,13 +45,13 @@ queryIsCached(nix::Store &store, Drv::Drv(std::string &attrPath, nix::EvalState &state, nix::DrvInfo &drvInfo, MyArgs &args) { - auto localStore = state.store.dynamic_pointer_cast(); + auto localStore = state.ctx.store.dynamic_pointer_cast(); try { // CA derivations do not have static output paths, so we have to // defensively not query output paths in case we encounter one. for (auto &[outputName, optOutputPath] : - drvInfo.queryOutputs(!nix::experimentalFeatureSettings.isEnabled( + drvInfo.queryOutputs(state, !nix::experimentalFeatureSettings.isEnabled( nix::Xp::CaDerivations))) { if (optOutputPath) { outputs[outputName] = @@ -63,18 +63,19 @@ Drv::Drv(std::string &attrPath, nix::EvalState &state, nix::DrvInfo &drvInfo, } } } catch (const std::exception &e) { - throw nix::EvalError(state, + state.ctx.errors.make( "derivation '%s' does not have valid outputs: %s", - attrPath, e.what()); + attrPath, e.what() + ).debugThrow(); } if (args.meta) { nlohmann::json meta_; - for (auto &metaName : drvInfo.queryMetaNames()) { + for (auto &metaName : drvInfo.queryMetaNames(state)) { nix::NixStringContext context; std::stringstream ss; - auto metaValue = drvInfo.queryMeta(metaName); + auto metaValue = drvInfo.queryMeta(state, metaName); // Skip non-serialisable types // TODO: Fix serialisation of derivations to store paths if (metaValue == 0) { @@ -96,9 +97,9 @@ Drv::Drv(std::string &attrPath, nix::EvalState &state, nix::DrvInfo &drvInfo, cacheStatus = Drv::CacheStatus::Unknown; } - drvPath = localStore->printStorePath(drvInfo.requireDrvPath()); + drvPath = localStore->printStorePath(drvInfo.requireDrvPath(state)); - auto drv = localStore->readDerivation(drvInfo.requireDrvPath()); + auto drv = localStore->readDerivation(drvInfo.requireDrvPath(state)); for (const auto &[inputDrvPath, inputNode] : drv.inputDrvs.map) { std::set inputDrvOutputs; for (auto &outputName : inputNode.value) { @@ -106,7 +107,7 @@ Drv::Drv(std::string &attrPath, nix::EvalState &state, nix::DrvInfo &drvInfo, } inputDrvs[localStore->printStorePath(inputDrvPath)] = inputDrvOutputs; } - name = drvInfo.queryName(); + name = drvInfo.queryName(state); system = drv.platform; } diff --git a/src/nix-eval-jobs.cc b/src/nix-eval-jobs.cc index 2b4885e..8cba1c2 100644 --- a/src/nix-eval-jobs.cc +++ b/src/nix-eval-jobs.cc @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -47,9 +46,8 @@ using namespace nlohmann; static MyArgs myArgs; -typedef std::function state, Bindings &autoArgs, - AutoCloseFD &to, AutoCloseFD &from, MyArgs &args)> - Processor; +using Processor = std::function state, Bindings &autoArgs, + AutoCloseFD &to, AutoCloseFD &from, MyArgs &args)>; /* Auto-cleanup of fork's process and fds. */ struct Proc { @@ -70,10 +68,10 @@ struct Proc { auto evalStore = myArgs.evalStoreUrl ? openStore(*myArgs.evalStoreUrl) : openStore(); - auto state = std::make_shared(myArgs.searchPath, + auto evaluator = nix::make_ref(myArgs.searchPath, evalStore); - Bindings &autoArgs = *myArgs.getAutoArgs(*state); - proc(ref(state), autoArgs, *to, *from, myArgs); + Bindings &autoArgs = *myArgs.getAutoArgs(*evaluator); + proc(evaluator, autoArgs, *to, *from, myArgs); } catch (Error &e) { nlohmann::json err; auto msg = e.msg(); diff --git a/src/worker.cc b/src/worker.cc index 5e5ff9f..9c8caa2 100644 --- a/src/worker.cc +++ b/src/worker.cc @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -48,14 +49,14 @@ static nix::Value *releaseExprTopLevelValue(nix::EvalState &state, nix::Value vTop; if (args.fromArgs) { - nix::Expr &e = state.parseExprFromString( - args.releaseExpr, state.rootPath(nix::CanonPath::fromCwd())); + nix::Expr &e = state.ctx.parseExprFromString( + args.releaseExpr, nix::CanonPath::fromCwd()); state.eval(e, vTop); } else { - state.evalFile(lookupFileArg(state, args.releaseExpr), vTop); + state.evalFile(nix::lookupFileArg(state.ctx, args.releaseExpr), vTop); } - auto vRoot = state.allocValue(); + auto vRoot = state.ctx.mem.allocValue(); state.autoCallFunction(autoArgs, vTop, *vRoot); @@ -73,16 +74,17 @@ static std::string attrPathJoin(nlohmann::json input) { }); } -void worker(nix::ref state, nix::Bindings &autoArgs, +void worker(nix::ref evaluator, nix::Bindings &autoArgs, nix::AutoCloseFD &to, nix::AutoCloseFD &from, MyArgs &args) { nix::Value *vRoot = [&]() { + auto state = evaluator->begin(); if (args.flake) { auto [flakeRef, fragment, outputSpec] = nix::parseFlakeRefWithFragmentAndExtendedOutputsSpec( args.releaseExpr, nix::absPath(".")); nix::InstallableFlake flake{ - {}, state, std::move(flakeRef), fragment, outputSpec, + {}, evaluator, std::move(flakeRef), fragment, outputSpec, {}, {}, args.lockFlags}; return flake.toValue(*state).first; @@ -92,6 +94,7 @@ void worker(nix::ref state, nix::Bindings &autoArgs, }(); LineReader fromReader(from.release()); + auto state = evaluator->begin(); while (true) { /* Wait for the collector to send us a job name. */ @@ -119,7 +122,7 @@ void worker(nix::ref state, nix::Bindings &autoArgs, nix::findAlongAttrPath(*state, attrPathS, autoArgs, *vRoot) .first; - auto v = state->allocValue(); + auto v = evaluator->mem.allocValue(); state->autoCallFunction(autoArgs, *vTmp, *v); if (v->type() == nix::nAttrs) { @@ -136,7 +139,7 @@ void worker(nix::ref state, nix::Bindings &autoArgs, std::string(nix::baseNameOf(drv.drvPath)); if (!nix::pathExists(root)) { auto localStore = - state->store + evaluator->store .dynamic_pointer_cast(); auto storePath = localStore->parseStorePath(drv.drvPath); @@ -151,14 +154,14 @@ void worker(nix::ref state, nix::Bindings &autoArgs, // = true;` for top-level attrset for (auto &i : - v->attrs->lexicographicOrder(state->symbols)) { - const std::string &name = state->symbols[i->name]; + v->attrs->lexicographicOrder(evaluator->symbols)) { + const std::string &name = evaluator->symbols[i->name]; attrs.push_back(name); if (name == "recurseForDerivations" && !args.forceRecurse) { auto attrv = - v->attrs->get(state->sRecurseForDerivations); + v->attrs->get(evaluator->s.recurseForDerivations); recurse = state->forceBool( *attrv->value, attrv->pos, "while evaluating recurseForDerivations"); diff --git a/src/worker.hh b/src/worker.hh index caf4200..013e64a 100644 --- a/src/worker.hh +++ b/src/worker.hh @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include "eval-args.hh" @@ -13,5 +14,5 @@ class EvalState; template class ref; } // namespace nix -void worker(nix::ref state, nix::Bindings &autoArgs, +void worker(nix::ref evaluator, nix::Bindings &autoArgs, nix::AutoCloseFD &to, nix::AutoCloseFD &from, MyArgs &args);