forked from lix-project/hydra
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.
This commit is contained in:
parent
ddcf05ac22
commit
6ee6ec3bda
|
@ -13,6 +13,8 @@
|
||||||
#include "get-drvs.hh"
|
#include "get-drvs.hh"
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "common-eval-args.hh"
|
#include "common-eval-args.hh"
|
||||||
|
#include "flakeref.hh"
|
||||||
|
#include "flake.hh"
|
||||||
|
|
||||||
#include "hydra-config.hh"
|
#include "hydra-config.hh"
|
||||||
|
|
||||||
|
@ -183,6 +185,7 @@ int main(int argc, char * * argv)
|
||||||
struct MyArgs : MixEvalArgs, MixCommonArgs
|
struct MyArgs : MixEvalArgs, MixCommonArgs
|
||||||
{
|
{
|
||||||
Path releaseExpr;
|
Path releaseExpr;
|
||||||
|
bool flake = false;
|
||||||
|
|
||||||
MyArgs() : MixCommonArgs("hydra-eval-jobs")
|
MyArgs() : MixCommonArgs("hydra-eval-jobs")
|
||||||
{
|
{
|
||||||
|
@ -205,6 +208,11 @@ int main(int argc, char * * argv)
|
||||||
.description("don't create store derivations")
|
.description("don't create store derivations")
|
||||||
.set(&settings.readOnlyMode, true);
|
.set(&settings.readOnlyMode, true);
|
||||||
|
|
||||||
|
mkFlag()
|
||||||
|
.longName("flake")
|
||||||
|
.description("build a flake")
|
||||||
|
.set(&flake, true);
|
||||||
|
|
||||||
expectArg("expr", &releaseExpr);
|
expectArg("expr", &releaseExpr);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -222,6 +230,10 @@ int main(int argc, char * * argv)
|
||||||
to the environment. */
|
to the environment. */
|
||||||
evalSettings.restrictEval = true;
|
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 (myArgs.releaseExpr == "") throw UsageError("no expression specified");
|
||||||
|
|
||||||
if (gcRootsDir == "") printMsg(lvlError, "warning: `--gc-roots-dir' not 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);
|
Bindings & autoArgs = *myArgs.getAutoArgs(state);
|
||||||
|
|
||||||
Value v;
|
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, "");
|
findJobs(state, json, autoArgs, v, "");
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue