XML::Simple is pretty slow - reading the output for the Nixpkgs jobset takes half a minute or so. JSON is pretty much instantaneous.
IMQRX4MPANNOXDP6THT2FA4576CDFY44LGNCS74BHV6DWLOCXQOQC 5GPK54IVSFG4NBNGVJBPBTNBSLKSNGKIYN5CIO4YEHH6GKFD2RYAC JTHWA6AM6UU4ZVWBH2JKUVFR743LVIMRU7IMDUVDLN4M3K7MR4XQC SS4TZXNUWXSEJC3XYHGVS3IBZ2D7GPIPELODVQOHRRGYADI2L72AC KJNFONHP6B4XYFAFM5USXEH3HVOGUDNEP475MBTUEO5NJS46KIRQC L4LBF7UFTG7SVPSZNHINTDQRXEOW7IX4AUASALYHDGMMAWRX6U7QC YNGIYQRFBKRKSRPSYSIG3R3U73ANOO5MC6C7VO4XOTDNBQHCKL3AC 4LWGZL33NOCTVZXUZZM5P6BRBHDUMEAJPVPNB52PN3UZVC7DMSZAC 4N5APGRGHTKFMEJ7THSJX6TSYYAP3BUZQG73AJBKCQLXOOEHPATQC YGRLM2SKOIPP4M24VYZTRREELKICDFKXL7ZHHR54BR5HVRCDOP6AC KD5237CUR4X3VRUD46H3CVU22NYS7LOPF3WXENWHNSF7GKEIQZ6QC AEFNBIIWLCTYPU6PDYG6D7OYGVP3E7DAGMYPIXVKCVVHJAM63FNAC 5DYPEBSIG2F2DY44Z52YQWDL6N4G4TDUCINMFAIA3G7PTEOPSAZQC AEKIREIHNEHL4CQEHRZJGRWMCV2XO6ICZK2OM342IKAJV6MUMDOAC 7YCFGMZBCWDOOO3DHSJ3ZWPUWFMEO6OLQGDZWLULAPER3YZOYUJAC WUMCRXFXFHI2QOJJDWVBG3SXSXKZOHOWRJ775DCBQWAP2ZAXSRQQC POPU2ATH2HHBTGHKRAV3EY2K55P664IARI3YJGLDKVJ6PQPXBQ4AC 5X6FHW3SHOE5R37WJPLKNVJM6VWFT6SNRMC5OFFCCW3IGC4ORY2QC DPYJFBXU55M7PFYHARO5FSZ4GFNZQQI4GYV5YTIXC77FUCVUU3PAC ZTQEU5QSAJYC66QQABJLVR7EEZWEIW6UMQMSIEP2KRZH5PGEB53QC HVXL2XUZTOWJPESBHBFD74B4QXNMG5SX4LOXDLPJ7732IU4SUYWQC 5MNUNZWR3HN5OOY4G6UQ5CMJTOSQIEFSJR5VOU4NE2KYLJAYRA3AC FTPCV25MOLQUNR5CAR453W7T7QTUZRLPLEOSDZ5HSDFAXQZVHOYQC A63IHCMXH3F4V56HDXJLJVVHKXRSJCJMT2PWXXI2IW3J734J6SGQC 3PNG7NIBQQURUUPRVQXYL342OT7JUUYOMY2JJNP6YDX7SYJDZMYAC PMNWRTGJ4GVSMSSAWSUD57B26PCRAHMZIQ5SIWJIK7A74ENKEQLAC FGUL3HAZDA6JGTAZNCJZIIKALZ4VMVTXYWFNSXWDYR5LXNGCO3RAC P45ANG5BPCZJQ7TJXNTBWHFDEDCSICMUWVWUI3DZ44TBSFXD3KEQC VTNP5KDOVQPWGRARMFJJ3MTU7IAZT4NP7ZFY4HJYT3KYJUSAZEZAC 7GKAIP3VYKM4MGGHOGBB3DR2M6B6SENBR5IZQVJYO65AWT4BW7LAC AKRVETP5YMH3O36HFKUP7BHF2Q3Y3HMVYYG2N75JMRJVF5HVVYNAC 3XTHEUMP2ZOMPQWE3S5QWHIHCEJNEXGDPQB3JUVZFPS3RFMY455QC OOQ2D3KCLFPYNAN253PHWLBQMB6OMO2KYQWQXLTP65SQAYZWQ5LAC INNOEHO6CTW75YEEGNLUKISQEMOAE4P2C2SEVHEKOVIFHADWY4OAC CHQEG6WY44VSOTLNH5KDZWJCCHNHRUCX6BEREXUUO56VOKHNSUZAC QMW24O5S43MYF5ZTBULUEZNDW2FKJ3QP2GL46P6B2SVGSQLVEACAC A43SLRSH6OIIEZWLRKLMERX7HOMBICKG7WHELCZYLOJWZ3JFRV2AC R42G3IBQUDLFWG65UX7T35MI4KTUTHNWU5EABND3N7XB66GTBQIAC P76HTFODGDSA53OZ2LQM6Y7CSCC3CXHQNZQDN4ZML6XAFFO2CFKQC SRBU2RAEHX4NRDIE7IYFUHJQWJF7A547AXFDOOUEZ2YOCXCQVLJQC CQTN62OHT4DY35E2MJEG7GFTVNEE5KRDMV6ASBQLBHN7BUDK7WHAC RFE6T5LGBFFNEPHZOPF4UNMFC2L4CGD5TPAMOXDLRPH3TZJ43UBAC N22GPKYTOLZLBGTGDATQDVZ4R5APZEAOIA7L32X4UXBH4XNI7MWAC JOYONH2KARKK2Z72WQW6DZ4B6WT47Z4VHOHGL7KM3B6RT3CBAMLQC RXVJFQ5AV3WME4HDVBPSRCALQTXROT4KQPOQVO6KTWTBNZIZZGPAC SHZLOM5M2NVH2J7CJJMS562EV5NPCTNWQ5P3K2SSL2YFYUI7PMIQC FYO6NECE4YJC76HQIG35NNJABODV7KNQKREK5YKZU6O2MNNSQTMAC 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));
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);
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;
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);