diff --git a/flake.nix b/flake.nix index 998772d..bf87bd6 100644 --- a/flake.nix +++ b/flake.nix @@ -16,7 +16,9 @@ defaultPackage = self.packages.${system}.hydra-eval-jobs; devShell = defaultPackage.overrideAttrs (old: { nativeBuildInputs = old.nativeBuildInputs ++ [ - pkgs.python3.pkgs.pytest + (pkgs.python3.withPackages(ps: [ + ps.pytest + ])) ]; }); }); diff --git a/src/hydra-eval-jobs.cc b/src/hydra-eval-jobs.cc index bcfecb7..8d509ff 100644 --- a/src/hydra-eval-jobs.cc +++ b/src/hydra-eval-jobs.cc @@ -17,6 +17,8 @@ #include #include +#include + #include #include #include @@ -98,31 +100,6 @@ struct MyArgs : MixEvalArgs, MixCommonArgs static MyArgs myArgs; -static std::string queryMetaStrings(EvalState & state, DrvInfo & drv, const string & name, const string & subAttribute) -{ - Strings res; - std::function rec; - - rec = [&](Value & v) { - state.forceValue(v); - if (v.type() == nString) - res.push_back(v.string.s); - else if (v.isList()) - for (unsigned int n = 0; n < v.listSize(); ++n) - rec(*v.listElems()[n]); - else if (v.type() == nAttrs) { - auto a = v.attrs->find(state.symbols.create(subAttribute)); - if (a != v.attrs->end()) - res.push_back(state.forceString(*a->value)); - } - }; - - Value * v = drv.queryMeta(name); - if (v) rec(*v); - - return concatStringsSep(", ", res); -} - static nlohmann::json serializeStorePathSet(StorePathSet &paths, LocalFSStore &store) { auto array = nlohmann::json::array(); for (auto & p : paths) { @@ -208,14 +185,16 @@ static void worker( job["nixName"] = drv->queryName(); job["system"] =drv->querySystem(); job["drvPath"] = drvPath; - job["description"] = drv->queryMetaString("description"); - job["license"] = queryMetaStrings(state, *drv, "license", "shortName"); - job["homepage"] = drv->queryMetaString("homepage"); - job["maintainers"] = queryMetaStrings(state, *drv, "maintainers", "email"); - job["schedulingPriority"] = drv->queryMetaInt("schedulingPriority", 100); - job["timeout"] = drv->queryMetaInt("timeout", 36000); - job["maxSilent"] = drv->queryMetaInt("maxSilent", 7200); - job["isChannel"] = drv->queryMetaBool("isHydraChannel", false); + + nlohmann::json meta; + for (auto & name : drv->queryMetaNames()) { + PathSet context; + std::stringstream ss; + printValueAsJSON(state, true, *drv->queryMeta(name), ss, context); + nlohmann::json field = nlohmann::json::parse(ss.str()); + meta[name] = field; + } + job["meta"] = meta; /* If this is an aggregate, then get its constituents. */ auto a = v->attrs->get(state.symbols.create("_hydraAggregate"));