From 6ee6ec3bda5c20c4920135bac090ea9af7600719 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 10 May 2019 22:18:37 +0200 Subject: [PATCH] hydra-eval-jobs: Support flakes E.g. 'hydra-eval-jobs ~/Dev/patchelf' is enough to evaluate patchelf - no need to set up a $NIX_PATH, pass arguments, etc. --- src/hydra-eval-jobs/hydra-eval-jobs.cc | 32 ++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/hydra-eval-jobs/hydra-eval-jobs.cc b/src/hydra-eval-jobs/hydra-eval-jobs.cc index 6b463634..fa5fc176 100644 --- a/src/hydra-eval-jobs/hydra-eval-jobs.cc +++ b/src/hydra-eval-jobs/hydra-eval-jobs.cc @@ -13,6 +13,8 @@ #include "get-drvs.hh" #include "globals.hh" #include "common-eval-args.hh" +#include "flakeref.hh" +#include "flake.hh" #include "hydra-config.hh" @@ -183,6 +185,7 @@ int main(int argc, char * * argv) struct MyArgs : MixEvalArgs, MixCommonArgs { Path releaseExpr; + bool flake = false; MyArgs() : MixCommonArgs("hydra-eval-jobs") { @@ -205,6 +208,11 @@ int main(int argc, char * * argv) .description("don't create store derivations") .set(&settings.readOnlyMode, true); + mkFlag() + .longName("flake") + .description("build a flake") + .set(&flake, true); + expectArg("expr", &releaseExpr); } }; @@ -222,6 +230,10 @@ int main(int argc, char * * argv) to the environment. */ evalSettings.restrictEval = true; + /* When building a flake, use pure evaluation (no access to + 'getEnv', 'currentSystem' etc. */ + evalSettings.pureEval = myArgs.flake; + if (myArgs.releaseExpr == "") throw UsageError("no expression specified"); if (gcRootsDir == "") printMsg(lvlError, "warning: `--gc-roots-dir' not specified"); @@ -231,9 +243,25 @@ int main(int argc, char * * argv) Bindings & autoArgs = *myArgs.getAutoArgs(state); Value v; - state.evalFile(lookupFileArg(state, myArgs.releaseExpr), v); + + if (myArgs.flake) { + FlakeRef flakeRef(myArgs.releaseExpr); + auto vFlake = state.allocValue(); + makeFlakeValue(state, flakeRef, AllowRegistryAtTop, *vFlake); + + auto vProvides = (*vFlake->attrs->get(state.symbols.create("provides")))->value; + state.forceValue(*vProvides); + + auto aHydraJobs = vProvides->attrs->get(state.symbols.create("hydraJobs")); + if (!aHydraJobs) + throw Error("flake '%s' does not provide any Hydra jobs", flakeRef); + + v = *(*aHydraJobs)->value; + + } else { + state.evalFile(lookupFileArg(state, myArgs.releaseExpr), v); + } findJobs(state, json, autoArgs, v, ""); - }); }