From 3268f3a6affd6a904bb5e4ac1266a5ea57c71afe Mon Sep 17 00:00:00 2001 From: adisbladis Date: Thu, 6 Jan 2022 13:19:15 +1300 Subject: [PATCH] Add flag to enable meta I removed meta from the output in https://github.com/nix-community/nix-eval-jobs/commit/434376f8e1ef653e79b4c2b5a38cba45109152e4 with the intention of adding it back gated by a flag, but that never happened. Adding meta is quite a substantial increase in output size and has some non-trivial performance impact at scale, so it's best to leave it as opt-in. --- src/nix-eval-jobs.cc | 36 +++++++++++++++++++++++------------- tests/test_eval.py | 5 +++-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/nix-eval-jobs.cc b/src/nix-eval-jobs.cc index 996d5f2..47f202b 100644 --- a/src/nix-eval-jobs.cc +++ b/src/nix-eval-jobs.cc @@ -34,6 +34,7 @@ struct MyArgs : MixEvalArgs, MixCommonArgs Path releaseExpr; Path gcRootsDir; bool flake = false; + bool meta = false; size_t nrWorkers = 1; size_t maxMemorySize = 4096; pureEval evalMode = evalAuto; @@ -94,6 +95,12 @@ struct MyArgs : MixEvalArgs, MixCommonArgs .handler = {&flake, true} }); + addFlag({ + .longName = "meta", + .description = "include derivation meta field in output", + .handler = {&meta, true} + }); + expectArg("expr", &releaseExpr); } }; @@ -182,21 +189,24 @@ static void worker( reply["outputs"][out.first] = out.second; } - nlohmann::json meta; - for (auto & name : drv->queryMetaNames()) { - PathSet context; - std::stringstream ss; + if (myArgs.meta) { + nlohmann::json meta; + for (auto & name : drv->queryMetaNames()) { + PathSet context; + std::stringstream ss; - auto metaValue = drv->queryMeta(name); - // Skip non-serialisable types - // TODO: Fix serialisation of derivations to store paths - if (metaValue == 0) { - continue; - } + auto metaValue = drv->queryMeta(name); + // Skip non-serialisable types + // TODO: Fix serialisation of derivations to store paths + if (metaValue == 0) { + continue; + } - printValueAsJSON(state, true, *metaValue, noPos, ss, context); - nlohmann::json field = nlohmann::json::parse(ss.str()); - meta[name] = field; + printValueAsJSON(state, true, *metaValue, noPos, ss, context); + nlohmann::json field = nlohmann::json::parse(ss.str()); + meta[name] = field; + } + reply["meta"] = meta; } /* Register the derivation as a GC root. !!! This diff --git a/tests/test_eval.py b/tests/test_eval.py index 7df722a..db93f97 100644 --- a/tests/test_eval.py +++ b/tests/test_eval.py @@ -13,7 +13,7 @@ BIN = PROJECT_ROOT.joinpath("build", "src", "nix-eval-jobs") def common_test(extra_args: List[str]) -> None: with TemporaryDirectory() as tempdir: - cmd = [str(BIN), "--gc-roots-dir", tempdir] + extra_args + cmd = [str(BIN), "--gc-roots-dir", tempdir, "--meta"] + extra_args res = subprocess.run( cmd, cwd=TEST_ROOT.joinpath("assets"), @@ -30,11 +30,12 @@ def common_test(extra_args: List[str]) -> None: assert built_job["name"] == "job1" assert built_job["outputs"]["out"].startswith("/nix/store") assert built_job["drvPath"].endswith(".drv") - + assert built_job["meta"]['broken'] is False substituted_job = results[1] assert substituted_job["attr"] == "substitutedJob" assert substituted_job["name"].startswith("hello-") + assert substituted_job["meta"]['broken'] is False def test_flake() -> None: