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]
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. - [9]
POPU2ATH* hydra_scheduler: use eval-jobs. - [10]
3PNG7NIBRemove trailing whitespace - [11]
FGUL3HAZhydra-eval-jobs: Don't go into an infinite recursion - [12]
5DYPEBSIhydra-eval-jobs: Use function argument default values - [13]
HVXL2XUZ - [14]
E7M2WP7ARemove unused Jobs columns - [15]
CGHMXHOLRemove dead code - [16]
A43SLRSHFix handling of IPC::Run::run exit status - [17]
AEKIREIH* Updated hydra_eval_jobs for the new evaluator. - [18]
7YCFGMZB* Report evaluation errors per job, and don't bail out if a job fails - [19]
SRBU2RAEWarn against multiple jobs with the same name - [20]
4LWGZL33 - [21]
4N5APGRG* Start of a helper tool to evaluate job expressions efficiently. - [22]
JOYONH2KPrevent multiple builds with the same (job, outPath) tuple from being added - [23]
5MNUNZWR* Store meta.maintainers. - [24]
D7GTR6PPRemove wacky "sysbuild" filtering - [25]
INNOEHO6* Fix getBuildLog for bzip2'd files. - [26]
R42G3IBQDisallow multiple jobs with the same name - [27]
FYO6NECEhydra - [28]
YGRLM2SK* Export all relevant info about the derivation. - [29]
KD5237CU* eval-jobs now efficiently evaluates all Hydra jobs from a - [30]
VTNP5KDO* Don't catch all errors. Some errors mess up the connection with the - [31]
WJTP6VZIFix building against the latest Nix - [32]
7BRTFGVYReally fix hydra-eval-jobs - [33]
SHZLOM5M* eval-jobs -> hydra_eval_jobs. - [34]
JAH3UPWASupport revision control systems via plugins - [35]
QMW24O5SAdd support for Guile & Guix. - [36]
A63IHCMX* Register GC roots properly. - [37]
P45ANG5BFix build - [38]
CHQEG6WYHydra/29: Added timeout to svn/git checkouts, job evaluation - [39]
RXVJFQ5AEvaluator cleanups - [40]
3XTHEUMP* Implemented the clone feature. - [41]
ZTQEU5QSHydra: Add support for maxSilent meta attribute (also already added timeout, but not implemented the actual timeout for the build yet) - [42]
RFE6T5LG* Store jobset evaluations in the database explicitly. This includes - [43]
OOQ2D3KC* Refactoring: move fetchInput out of hydra_scheduler into a separate - [44]
77VF5TC6* For ease of use during debugging, don't require --gc-roots-dir. - [45]
GA6XIXAN* Show the input bindings in evaluation error messages. - [46]
WUMCRXFXDon't ignore assertion failures in getDerivation() - [47]
PMNWRTGJAdd multiple output support - [48]
FTPCV25MStore aggregate members in the database - [49]
P76HTFODRevert "Remove wacky "sysbuild" filtering" - [50]
PIMGMGAFRename hydra_eval_jobs to hydra-eval-jobs - [51]
AEFNBIIW* Merge the GC branch. - [52]
PXUCXYZI* Pass `-j 1' to hydra_eval_jobs to ensure that it can make progress - [53]
PHNLYPKBCall buildFinished when a cached build is added - [54]
5X6FHW3Shydra-eval-jobs: Fix building against the latest unstable Nix - [55]
AKRVETP5Handle UTF-8 characters in eval error messages - [56]
DPYJFBXUhydra-eval-jobs: Support meta.license being a list - [57]
QE253KG4* Option to show the tail of a log. - [58]
7GKAIP3VFix build and handling of string inputs starting with a dash - [59]
HJYRK37A* Revert r27114, it seems to break stuff. - [60]
CQTN62OHDie tabs die - [*]
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";