hydra-eval-jobs: Use JSON instead of XML
[?]
Sep 29, 2014, 10:20 PM
IMQRX4MPANNOXDP6THT2FA4576CDFY44LGNCS74BHV6DWLOCXQOQCDependencies
- [2]
5GPK54IVLog segfaults from the evaluator - [3]
JTHWA6AMRename aggregate members to constituents - [4]
SS4TZXNUDistinguish between permanent evaluation errors and transient input errors - [5]
KJNFONHPBump default silent timeout to 2 hours - [6]
L4LBF7UFHandle derivations without a system attribute - [7]
YNGIYQRFhydra-eval-jobs: Don't keep track of used inputs - [8]
3PNG7NIBRemove trailing whitespace - [9]
QE253KG4* Option to show the tail of a log. - [10]
77VF5TC6* For ease of use during debugging, don't require --gc-roots-dir. - [11]
E7M2WP7ARemove unused Jobs columns - [12]
YGRLM2SK* Export all relevant info about the derivation. - [13]
4LWGZL33 - [14]
YFPZ46YK* hydra: added variant of build input type, 'build output (same system)' to allow better continous integration in one jobset for multiple system. it makes sure that the system of the build that is passed as input for a job has the same system as the job. - [15]
D7GTR6PPRemove wacky "sysbuild" filtering - [16]
ZTQEU5QSHydra: Add support for maxSilent meta attribute (also already added timeout, but not implemented the actual timeout for the build yet) - [17]
7YCFGMZB* Report evaluation errors per job, and don't bail out if a job fails - [18]
PHNLYPKBCall buildFinished when a cached build is added - [19]
P76HTFODRevert "Remove wacky "sysbuild" filtering" - [20]
A63IHCMX* Register GC roots properly. - [21]
FGUL3HAZhydra-eval-jobs: Don't go into an infinite recursion - [22]
WUMCRXFXDon't ignore assertion failures in getDerivation() - [23]
OOQ2D3KC* Refactoring: move fetchInput out of hydra_scheduler into a separate - [24]
JAH3UPWASupport revision control systems via plugins - [25]
DPYJFBXUhydra-eval-jobs: Support meta.license being a list - [26]
CQTN62OHDie tabs die - [27]
SHZLOM5M* eval-jobs -> hydra_eval_jobs. - [28]
HVXL2XUZ - [29]
PMNWRTGJAdd multiple output support - [30]
P45ANG5BFix build - [31]
CHQEG6WYHydra/29: Added timeout to svn/git checkouts, job evaluation - [32]
5MNUNZWR* Store meta.maintainers. - [33]
FYO6NECEhydra - [34]
AEFNBIIW* Merge the GC branch. - [35]
AEKIREIH* Updated hydra_eval_jobs for the new evaluator. - [36]
4N5APGRG* Start of a helper tool to evaluate job expressions efficiently. - [37]
PXUCXYZI* Pass `-j 1' to hydra_eval_jobs to ensure that it can make progress - [38]
POPU2ATH* hydra_scheduler: use eval-jobs. - [39]
5DYPEBSIhydra-eval-jobs: Use function argument default values - [40]
RFE6T5LG* Store jobset evaluations in the database explicitly. This includes - [41]
CGHMXHOLRemove dead code - [42]
PIMGMGAFRename hydra_eval_jobs to hydra-eval-jobs - [43]
GA6XIXAN* Show the input bindings in evaluation error messages. - [44]
RXVJFQ5AEvaluator cleanups - [45]
R42G3IBQDisallow multiple jobs with the same name - [46]
WJTP6VZIFix building against the latest Nix - [47]
JOYONH2KPrevent multiple builds with the same (job, outPath) tuple from being added - [48]
HJYRK37A* Revert r27114, it seems to break stuff. - [49]
KD5237CU* eval-jobs now efficiently evaluates all Hydra jobs from a - [50]
A43SLRSHFix handling of IPC::Run::run exit status - [51]
7GKAIP3VFix build and handling of string inputs starting with a dash - [52]
INNOEHO6* Fix getBuildLog for bzip2'd files. - [53]
5X6FHW3Shydra-eval-jobs: Fix building against the latest unstable Nix - [54]
QMW24O5SAdd support for Guile & Guix. - [55]
AKRVETP5Handle UTF-8 characters in eval error messages - [56]
FTPCV25MStore aggregate members in the database - [57]
7BRTFGVYReally fix hydra-eval-jobs - [58]
SRBU2RAEWarn against multiple jobs with the same name - [59]
3XTHEUMP* Implemented the clone feature. - [60]
VTNP5KDO* Don't catch all errors. Some errors mess up the connection with the - [*]
N22GPKYT* Put info about logs / build products in the DB.
Change contents
- replacement in src/c/hydra-eval-jobs.cc at line 11
#include "xml-writer.hh"#include "value-to-json.hh" - replacement in src/c/hydra-eval-jobs.cc at line 26
static void findJobs(EvalState & state, XMLWriter & doc,static void findJobs(EvalState & state, JSONObject & top, - replacement in src/c/hydra-eval-jobs.cc at line 30
static void tryJobAlts(EvalState & state, XMLWriter & doc,static void tryJobAlts(EvalState & state, JSONObject & top, - replacement in src/c/hydra-eval-jobs.cc at line 41
findJobs(state, doc, argsLeft, v, attrPath);findJobs(state, top, argsLeft, v, attrPath); - replacement in src/c/hydra-eval-jobs.cc at line 53
tryJobAlts(state, doc, argsLeft, attrPath, fun, next, last, actualArgs);tryJobAlts(state, top, argsLeft, attrPath, fun, next, last, actualArgs); - replacement in src/c/hydra-eval-jobs.cc at line 66
tryJobAlts(state, doc, argsLeft2, attrPath, fun, next, last, actualArgs2);tryJobAlts(state, top, argsLeft2, attrPath, fun, next, last, actualArgs2); - replacement in src/c/hydra-eval-jobs.cc at line 96
static void findJobsWrapped(EvalState & state, XMLWriter & doc,static void findJobsWrapped(EvalState & state, JSONObject & top, - edit in src/c/hydra-eval-jobs.cc at line 110
XMLAttrs xmlAttrs; - replacement in src/c/hydra-eval-jobs.cc at line 117[6.124]→[8.6:94](∅→∅),[8.748]→[8.6:94](∅→∅),[8.94]→[8.113:158](∅→∅),[8.789]→[8.113:158](∅→∅),[8.158]→[8.742:1188](∅→∅),[8.562]→[8.0:1](∅→∅),[8.1188]→[8.0:1](∅→∅),[8.1131]→[8.0:1](∅→∅),[8.1]→[8.1189:1291](∅→∅),[8.1291]→[8.2:3](∅→∅),[8.1269]→[8.2:3](∅→∅),[8.3]→[8.1292:1374](∅→∅),[8.127]→[8.0:1](∅→∅),[8.1374]→[8.0:1](∅→∅),[8.1269]→[8.0:1](∅→∅),[8.1]→[5.0:85](∅→∅)
xmlAttrs["jobName"] = attrPath;xmlAttrs["nixName"] = drv.name;xmlAttrs["system"] = drv.system;xmlAttrs["drvPath"] = drvPath = drv.queryDrvPath();xmlAttrs["description"] = drv.queryMetaString("description");xmlAttrs["longDescription"] = drv.queryMetaString("longDescription");xmlAttrs["license"] = queryMetaStrings(state, drv, "license");xmlAttrs["homepage"] = drv.queryMetaString("homepage");xmlAttrs["maintainers"] = queryMetaStrings(state, drv, "maintainers");xmlAttrs["schedulingPriority"] = int2String(drv.queryMetaInt("schedulingPriority", 100));xmlAttrs["timeout"] = int2String(drv.queryMetaInt("timeout", 36000));xmlAttrs["maxSilent"] = int2String(drv.queryMetaInt("maxSilent", 7200));top.attr(attrPath);JSONObject res(top.str);res.attr("nixName", drv.name);res.attr("system", drv.system);res.attr("drvPath", drvPath = drv.queryDrvPath());res.attr("description", drv.queryMetaString("description"));res.attr("longDescription", drv.queryMetaString("longDescription"));res.attr("license", queryMetaStrings(state, drv, "license"));res.attr("homepage", drv.queryMetaString("homepage"));res.attr("maintainers", queryMetaStrings(state, drv, "maintainers"));res.attr("schedulingPriority", drv.queryMetaInt("schedulingPriority", 100));res.attr("timeout", drv.queryMetaInt("timeout", 36000));res.attr("maxSilent", drv.queryMetaInt("maxSilent", 7200)); - replacement in src/c/hydra-eval-jobs.cc at line 145
xmlAttrs["constituents"] = concatStringsSep(" ", drvs);res.attr("constituents", concatStringsSep(" ", drvs)); - replacement in src/c/hydra-eval-jobs.cc at line 156[8.425]→[8.1096:1148](∅→∅),[8.805]→[8.1096:1148](∅→∅),[8.1096]→[8.1096:1148](∅→∅),[8.1148]→[8.66:321](∅→∅)
XMLOpenElement _(doc, "job", xmlAttrs);foreach (DrvInfo::Outputs::iterator, j, outputs) {XMLAttrs attrs2;attrs2["name"] = j->first;attrs2["path"] = j->second;doc.writeEmptyElement("output", attrs2);}res.attr("outputs");JSONObject res2(res.str);for (auto & j : outputs)res2.attr(j.first, j.second); - replacement in src/c/hydra-eval-jobs.cc at line 165
findJobs(state, doc, argsLeft, *i->value,findJobs(state, top, argsLeft, *i->value, - replacement in src/c/hydra-eval-jobs.cc at line 173
tryJobAlts(state, doc, argsLeft, attrPath, v,tryJobAlts(state, top, argsLeft, attrPath, v, - replacement in src/c/hydra-eval-jobs.cc at line 188
static void findJobs(EvalState & state, XMLWriter & doc,static void findJobs(EvalState & state, JSONObject & top, - replacement in src/c/hydra-eval-jobs.cc at line 192
findJobsWrapped(state, doc, argsLeft, v, attrPath);findJobsWrapped(state, top, argsLeft, v, attrPath); - replacement in src/c/hydra-eval-jobs.cc at line 194
XMLAttrs xmlAttrs;xmlAttrs["location"] = attrPath;xmlAttrs["msg"] = e.msg();XMLOpenElement _(doc, "error", xmlAttrs);top.attr(attrPath);JSONObject res(top.str);res.attr("error", e.msg());top.str << "\n"; - replacement in src/c/hydra-eval-jobs.cc at line 262
XMLWriter doc(true, std::cout);XMLOpenElement root(doc, "jobs");findJobs(state, doc, autoArgs, v, "");JSONObject json(std::cout);findJobs(state, json, autoArgs, v, ""); - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 6
use XML::Simple;use JSON; - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 338
(my $res, my $jobsXml, my $stderr) = captureStdoutStderr(10800,(my $res, my $jobsJSON, my $stderr) = captureStdoutStderr(10800, - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 340
if ($res) {die "$evaluator returned " . ($res & 127 ? "signal $res" : "exit code " . ($res >> 8)). ":\n" . ($stderr ? $stderr : "(no output)\n");}die "$evaluator returned " . ($res & 127 ? "signal $res" : "exit code " . ($res >> 8)). ":\n" . ($stderr ? $stderr : "(no output)\n")if $res; - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 346[8.3211]→[8.3211:3251](∅→∅),[8.3251]→[8.4952:5051](∅→∅),[8.5051]→[8.3321:3393](∅→∅),[8.3321]→[8.3321:3393](∅→∅),[8.3393]→[8.0:34](∅→∅),[8.34]→[8.0:67](∅→∅),[8.3393]→[8.0:67](∅→∅),[8.67]→[8.35:431](∅→∅),[8.431]→[7.722:756](∅→∅),[7.756]→[8.360:401](∅→∅),[8.360]→[8.360:401](∅→∅),[8.303]→[8.11:140](∅→∅),[8.140]→[8.303:348](∅→∅),[8.303]→[8.303:348](∅→∅)
my $jobs = XMLin($jobsXml,ForceArray => ['error', 'job', 'arg', 'output'],KeyAttr => { output => "+name" },SuppressEmpty => '')or die "cannot parse XML output";my %jobNames;my $errors;my @filteredJobs = ();foreach my $job (@{$jobs->{job}}) {# Ensure that there is only one job with the given# name. FIXME: this check will become unnecessary after we# remove support for multiple values per jobset input.if (defined $jobNames{$job->{jobName}}) {$errors .= "error: there are multiple jobs named ‘$job->{jobName}’\n\n";next;}$jobNames{$job->{jobName}} = 1;push @filteredJobs, $job;}$jobs->{job} = \@filteredJobs;# Handle utf-8 characters in error messages. No idea why this works.utf8::decode($_->{msg}) foreach @{$jobs->{error}};return ($jobs, $nixExprInput, $errors);return (decode_json($jobsJSON), $nixExprInput); - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 440
my @outputNames = sort keys %{$buildInfo->{output}};my @outputNames = sort keys %{$buildInfo->{outputs}}; - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 447
my $firstOutputPath = $buildInfo->{output}->{$firstOutputName}->{path};my $firstOutputPath = $buildInfo->{outputs}->{$firstOutputName}; - edit in src/lib/Hydra/Helper/AddBuilds.pm at line 452
my $priority = 100;$priority = int($buildInfo->{schedulingPriority})if $buildInfo->{schedulingPriority} =~ /^\d+$/; - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 503
my $path = $buildInfo->{output}->{$name}->{path};my $path = $buildInfo->{outputs}->{$name}; - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 545
, priority => $priority, priority => $buildInfo->{schedulingPriority} - replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 551
$build->buildoutputs->create({ name => $_, path => $buildInfo->{output}->{$_}->{path} })$build->buildoutputs->create({ name => $_, path => $buildInfo->{outputs}->{$_} }) - replacement in src/script/hydra-evaluator at line 147
my ($jobs, $nixExprInput, $msg) = evalJobs($inputInfo, $exprType, $jobset->nixexprinput, $jobset->nixexprpath);my ($jobs, $nixExprInput) = evalJobs($inputInfo, $exprType, $jobset->nixexprinput, $jobset->nixexprpath); - edit in src/script/hydra-evaluator at line 149
$jobs->{$_}->{jobName} = $_ for keys %{$jobs}; - replacement in src/script/hydra-evaluator at line 165
foreach my $job (permute @{$jobs->{job}}) {next if $job->{jobName} eq "";foreach my $job (permute(values %{$jobs})) {next if defined $job->{error}; - replacement in src/script/hydra-evaluator at line 249
foreach my $error (@{$jobs->{error}}) {my $msg = "";foreach my $job (values %{$jobs}) {next unless defined $job->{error}; - replacement in src/script/hydra-evaluator at line 253
($error->{location} ne "" ? "in job ‘$error->{location}’" : "at top-level") .":\n" . $error->{msg} . "\n\n";($job->{jobName} ne "" ? "in job ‘$job->{jobName}’" : "at top-level") .":\n" . $job->{error} . "\n\n";