hydra-server: Support logs in S3
[?]
Apr 5, 2017, 3:55 PM
EYAA7MJYQFEYESCXEHXOZ7QXIFFLYQYB5C6PIKHKBWS734KEFO2QCDependencies
- [2]
4KHO6UPQchange regexp for ascii escapes in log - [3]
JFGNTEABplain-reload: Scroll down at document load. - [4]
XO72X6PQHandle SSH hosts without a @ - [5]
NX5BM2OIMachine status page: Show disabled machines and some machine stats - [6]
CHKVSGZGbuild.tt: Fix reference to build.ischannel. - [7]
ABVOFHCVConstruct uri using uri_for, which respects X-Request-Base. - [8]
O5ZANJMRMake "Running builds" and "Machine status" pages faster - [9]
UKFZFDJORemove the pretty-printed log - [10]
ZWCTAZGLadded newsitems, added some admin options to clear various caches. - [11]
WNQRX7QBDoh - [12]
W3XAFDK6Remove obsolete/broken timeline feature - [13]
ZIQRKUMJEscape the log tail to ensure we produce correct HTML - [14]
WXV6M6XNAdd a convenient way to get logs of a path/drv. Requested by phreedom. - [15]
WDKFN4B2Make sign in a modal dialog box rather than a separate page - [16]
KXGOUX7P* Creating releases. - [17]
SAIUFDP3hydra: make sure viewing logs works when logs are bz2'd - [18]
YOA2RTLEplain-reload.tt: Properly escape tail content. - [19]
D5QIOJGP* Move everything up one directory. - [20]
WRIU3S5E* UI for cloning builds (not functional yet). - [21]
CNEQ7L4GDon't show logs bigger than 64 MB - [22]
JFW656FTAdd a flag to enable Persona support - [23]
6F4UNDTC* Provide access to the raw, non-pretty-printed logfiles. - [24]
ZB3JV52WAdd a "My jobsets" tab to the dashboard - [25]
GAIBDEZZ* Store the name of the machine that performed a build step in the - [26]
YU6CND7CRemove support for views - [27]
U2X3Y53Gmake sure status images always display for a list of builds - [28]
CLJQCY2X* Store info about all the build actions and allow them to be - [29]
BD3GRK4B* Get rid of "positive failures" and separate log phases. - [30]
4JPNFWRB* Use jquery for the logfile manipulation. - [31]
RBNQKATL* Adding persistant releases. A release is a named set of builds. - [32]
6Q2JPSWGFix lazy tab loading - [33]
F5RYSE7Tqualify order by column - [34]
KI423DCQStream logs if possible and remove size limit - [35]
MMDLWWZ2automatic reload of tail log when build is running - [36]
OR5SJ42YShow releases in a tab on the project page - [37]
RGRBQI2Fshow all related jobset/job links in navbar for the tail/-reload logs - [38]
UICHT2PSAdd a search feature - [39]
VH5ZABDRAdd a page to show the latest evaluations for the entire server - [40]
3E6IP3R3* Add the name of the jobset to ReleaseSetJobs, otherwise we can't - [41]
XDDCO6CH* hydra: add dependency list with links to logfiles - [42]
HPEG2RHVMerge the BuildResultInfo table into the Builds table - [43]
BIVZGPUTOptimise clickable rows - [44]
U72VNKRURemove unused file - [45]
KKJNJHO5Update bootstrap to 2.0.3 - [46]
SYAIW23XAdd missing file - [47]
R2PON6R7Allow non-admin users to see the machine status page - [48]
EFWN7JBV* Added a status page that shows all the currently executing build steps. - [49]
UMEKGOSYUpdate flot to 0.8.3 - [50]
LSZLZHJYAllow users to edit their own settings - [51]
2GUAKGTBFix indentation of build.tt - [52]
BB2KXLXZMove the build time chart to the job page - [53]
2T3XCADOBuild.pm: Don't get isChannel using buildproducts. - [54]
ZH6B56XRTry harder to find build logs - [55]
JOVVHIJXRemove all entry points to modify machines - [56]
XKXMU5PVEllipsize long jobset/job names to prevent bootstrap navbar breakage - [57]
HRAFVVOEmake logo configurable via HYDRA_LOGO env var - [58]
IN272KZW* Automatically keep all builds in the latest successful release in - [59]
6JGCGK5X - [60]
Q24QXGSM* Don't do pretty printing for large logs, because the XSLT processing - [61]
6FRLEP4Pfirst try for timeline of last 24 hours in hydra - [62]
CQTN62OHDie tabs die - [63]
OX6NYJDVSplit viewing and editing a jobset - [64]
ODNCGFQ5* Improved the navigation bar: don't include all projects (since that - [65]
YW66LY44* hydra: enable pp'ing of logs for bigger files again - [66]
GJFYEU3S* Nix now stores logs by default as bzip2, make sure the build page uncompresses before showing. - [67]
TX7Q4RASAdd page showing latest build steps - [68]
DAPOSS44Use the REST API in the web interface for editing projects - [69]
QWVUIGFYadd link to build on tail/-reload log pages - [70]
VCG6KNUXRemove the "clone build" feature - [71]
5AIYUMTBBasic remote building - [72]
3PJ77S7QSet utf-8 charset for raw logs - [73]
UDS5VIT6Lazy load the metrics tab - [74]
RBHHV7P7* Read logs using logContents function in stead of handling it everywhere separately. - [75]
TQVKZQUGUse the REST API in the web interface for editing jobsets - [76]
75XUS62Y* Added a page to quickly see all failed builds and failed evaluations - [77]
KLSDJV75Serve raw uncompressed logs directly - [78]
QL55ECJ6- adapted ui for hydra, more in line with nixos.org website - [79]
64IV56HIReplace bootstrap tarball - [80]
PY4WQF5Gremove ascii escapes from log in tail page and emails - [81]
HZWUT4YNAllow users to reproduce builds on their own systems - [82]
2GK5DOU7* Downloading closures. - [83]
VBWHG272Re-add the history tab (store size and build time), now as lazy-loaded tab on build page. - [84]
MSIHMO45Tweak build steps - [85]
AS2OXLRM* Editing releases. - [86]
4WZQW2N6Fix indentation and get rid of some unnecessary whitespace in the output - [87]
X6RB5HQ6Put a 5-second CPU time limit on the log processing pipeline. - [88]
MOX7XJ2EMerge the BuildSchedulingInfo table into the Builds table - [89]
Y6AHH4THRemove the logfile and logSize columns from the database - [90]
QE253KG4* Option to show the tail of a log. - [91]
G2WXEQHERemove the Errors page - [92]
J3RYO2CURemove the jobs status page - [93]
KZ55DLPHFix UTF-8 handling of log files - [94]
P5X4P6VK* Renaming "release sets" to "views" (not finished yet). Having - [95]
3PNG7NIBRemove trailing whitespace - [96]
V6S6OYIAFormatting tweaks - [97]
JY7BXXOPSplit viewing and editing a project - [98]
O776XDS2Make getDrvLogPath work with both bucketed and non-bucketed nix logs. - [99]
QAUDQPWGAdd a more concise queue page - [100]
3EJABTVVShow build products on aggregates with channels. - [101]
C2DCO6AS - [102]
RX7USXWQjobset: Add a new "channels" tab. - [103]
RSEGBU6CHydra/20: Jobset clone feature - [104]
U4TD3AIQAdd support for viewing jobset evaluations - [105]
AK2UZDS2Jobset page: Add a new tab to show job status in a matrix - [106]
SZYDW2DGhydra: added some user admin - [107]
ZFEN2MAOSimplify jobset cloning - [108]
J5UVLXOK* Start of a basic Catalyst web interface. - [109]
A63IHCMX* Register GC roots properly. - [110]
2BUX775I* More release -> view. - [111]
FHOH54HQWhen searching a path / drv path, use separate queries for both options to prevent seq. scan. - [112]
M6WGSGNMDon't show duration of unfinished builds - [113]
HN3V252LOn the build page, show how many aggregate constituents failed - [114]
U6UJRDG2* Oops. - [115]
TRDGNILTRemove unused file - [116]
KSBB33REAdd a dashboard - [117]
LBNVQXUB* Build the /build stuff in a separate controller. - [118]
PMNWRTGJAdd multiple output support - [119]
36M6DGITShow the runtime/build dependencies in the build page - [120]
QTC3SYBMJobset page: Load the jobs and status tabs on demand - [121]
PPAE3Z3Dplain-reload: Constrain tail output to 50 lines. - [122]
6KIJX24RGet rid of unnecessary [%- and -%] tags - [123]
FV2M6MOThydra: use autoconf/-make - [124]
YPDYBK5GShow dependencies as a tree rather than a list - [125]
TUMFOKWNFix "Use of uninitialized value $mode" - [126]
AFTXA575* $HYDRA_DATA environment variable. - [127]
NEQ4BISOAdd bootstrap.zip - [128]
CAFO4ATEAlways show the build duration (using the cached build if necessary) - [129]
QCGCX2BRGeneralize lazy tabs - [130]
FNHGYTB4Tweak - [131]
FQAZTEK6Don't set Expires header for logs of unfinished builds/steps - [132]
3QWDDLBRAdd support for logging in via a Google account - [133]
3JBUMW3Eforgot to commit a file - [134]
TPNHTE5VRemove obsolete Builds columns and provide accurate "Running builds" - [135]
SMTMFEKEhydra: add missing templates - [136]
GS4BE6TBAsynchronously compress build logs - [137]
3TZYSSGXbuilt.tt: Handle the case where the original build is not known - [138]
VG4QG336Remove tablesorter - [139]
LFVXESGIRemove already disabled jobstatus code - [140]
6M4KNDXX* Catalyst::View::Download::Plain doesn't like empty files. - [141]
D7X6XTKQIntegrate the "Job status" and "All jobs" tabs - [142]
5DSDXORDhydra: missing plain.tt - [143]
T5BIOVJEAdd support for tracking custom metrics - [144]
OTNJLJHASort build steps - [145]
OOQ2D3KC* Refactoring: move fetchInput out of hydra_scheduler into a separate - [146]
5EIPRLDDexport logContents - [*]
2MSFKTD5Ensure proper encoding of error messages - [*]
IK53RV4V - [*]
2P7VNAACMove common Javascript code into a separate file
Change contents
- edit in src/lib/Hydra/Controller/Build.pm at line 9
use File::Basename; - replacement in src/lib/Hydra/Controller/Build.pm at line 129
showLog($c, $mode, $step->busy == 0, $step->drvpath,map { $_->path } $step->buildstepoutputs->all);showLog($c, $mode, $step->busy == 0, $step->drvpath); - replacement in src/lib/Hydra/Controller/Build.pm at line 136
$c->stash->{build}->drvpath,map { $_->path } $c->stash->{build}->buildoutputs->all);$c->stash->{build}->drvpath); - replacement in src/lib/Hydra/Controller/Build.pm at line 141
my ($c, $mode, $finished, $drvPath, @outPaths) = @_;my ($c, $mode, $finished, $drvPath) = @_; - edit in src/lib/Hydra/Controller/Build.pm at line 143[10.24]→[10.0:1](∅→∅),[10.339]→[10.0:1](∅→∅),[10.341]→[10.0:1](∅→∅),[10.755]→[10.0:1](∅→∅),[10.334]→[10.0:1](∅→∅),[10.1]→[10.756:808](∅→∅)
my $logPath = findLog($c, $drvPath, @outPaths); - replacement in src/lib/Hydra/Controller/Build.pm at line 144
notFound($c, "The build log of derivation ‘$drvPath’ is not available.") unless defined $logPath;my $log_uri = $c->uri_for($c->controller('Root')->action_for("log"), [basename($drvPath)]); - edit in src/lib/Hydra/Controller/Build.pm at line 146[10.1]→[10.0:345](∅→∅),[10.145]→[10.198:199](∅→∅),[10.244]→[10.198:199](∅→∅),[10.345]→[10.198:199](∅→∅),[10.486]→[10.198:199](∅→∅),[10.492]→[10.198:199](∅→∅),[10.198]→[10.198:199](∅→∅)
# Don't send logs that we can't stream.my $size = stat($logPath)->size; # FIXME: not so meaningful for compressed logserror($c, "This build log is too big to display ($size bytes).") unless$mode eq "raw"|| (($mode eq "tail" || $mode eq "tail-reload") && $logPath !~ /\.bz2$/)|| $size < 64 * 1024 * 1024; - edit in src/lib/Hydra/Controller/Build.pm at line 147
$c->stash->{log_uri} = $log_uri; - edit in src/lib/Hydra/Controller/Build.pm at line 149
$c->stash->{logtext} = logContents($logPath); - replacement in src/lib/Hydra/Controller/Build.pm at line 152[10.759]→[10.346:387](∅→∅),[10.387]→[10.340:383](∅→∅),[10.383]→[10.387:431](∅→∅),[10.387]→[10.387:431](∅→∅),[10.240]→[10.0:44](∅→∅),[10.447]→[10.0:44](∅→∅),[10.396]→[10.0:44](∅→∅),[10.44]→[7.0:55](∅→∅),[7.55]→[10.1206:1244](∅→∅),[10.1206]→[10.1206:1244](∅→∅),[10.1244]→[10.123:156](∅→∅),[10.123]→[10.123:156](∅→∅),[10.156]→[10.789:850](∅→∅),[10.850]→[10.274:307](∅→∅),[10.1522]→[10.274:307](∅→∅),[10.274]→[10.274:307](∅→∅),[10.307]→[10.1016:1091](∅→∅),[10.332]→[10.382:433](∅→∅),[10.699]→[10.382:433](∅→∅),[10.1091]→[10.382:433](∅→∅),[10.382]→[10.382:433](∅→∅)
$c->stash->{logPath} = $logPath;$c->stash->{finished} = $finished;$c->forward('Hydra::View::NixLog');}elsif ($mode eq "tail-reload") {my $url = $c->uri_for($c->request->uri->path);$url =~ s/tail-reload/tail/g;$c->stash->{url} = $url;$c->stash->{reload} = !$c->stash->{build}->finished;$c->stash->{title} = "";$c->stash->{contents} = (scalar logContents($logPath, 50)) || " ";$c->stash->{template} = 'plain-reload.tt';$c->res->redirect($log_uri); - replacement in src/lib/Hydra/Controller/Build.pm at line 156[10.49]→[10.1092:1178](∅→∅),[10.79]→[10.119:162](∅→∅),[10.80]→[10.119:162](∅→∅),[10.416]→[10.119:162](∅→∅),[10.483]→[10.119:162](∅→∅),[10.786]→[10.119:162](∅→∅),[10.1178]→[10.119:162](∅→∅),[10.119]→[10.119:162](∅→∅)
$c->stash->{'plain'} = { data => (scalar logContents($logPath, 50)) || " " };$c->forward('Hydra::View::Plain');my $lines = 50;$c->stash->{log_uri} = $log_uri . "?tail=$lines";$c->stash->{tail} = $lines;$c->stash->{template} = 'log.tt'; - replacement in src/lib/Hydra/Controller/Build.pm at line 163
error($c, "Unknown log display mode `$mode'.");error($c, "Unknown log display mode '$mode'."); - edit in src/lib/Hydra/Controller/Root.pm at line 13
use File::Basename; - edit in src/lib/Hydra/Controller/Root.pm at line 438
sub serveLogFile {my ($c, $logPath, $tail) = @_;$c->stash->{logPath} = $logPath;$c->stash->{tail} = $tail;$c->forward('Hydra::View::NixLog');} - replacement in src/lib/Hydra/Controller/Root.pm at line 446
my ($self, $c, $path) = @_;my ($self, $c, $drvPath) = @_; - replacement in src/lib/Hydra/Controller/Root.pm at line 448
$path = ($ENV{NIX_STORE_DIR} || "/nix/store")."/$path";$drvPath = "/nix/store/$drvPath"; - replacement in src/lib/Hydra/Controller/Root.pm at line 450
my @outpaths = ($path);my $logPath = findLog($c, $path, @outpaths);notFound($c, "The build log of $path is not available.") unless defined $logPath;my $tail = $c->request->params->{"tail"}; - replacement in src/lib/Hydra/Controller/Root.pm at line 452
$c->stash->{logPath} = $logPath;$c->forward('Hydra::View::NixLog');}die if defined $tail && $tail !~ /^[0-9]+$/;my $logFile = findLog($c, $drvPath);if (defined $logFile) {serveLogFile($c, $logFile, $tail);return;}my $logPrefix = $c->config->{log_prefix}; - edit in src/lib/Hydra/Controller/Root.pm at line 463
if (defined $logPrefix) {$c->res->redirect($logPrefix . "log/" . basename($drvPath));} else {notFound($c, "The build log of $drvPath is not available.");}} - replacement in src/lib/Hydra/Helper/Nix.pm at line 21
removeAsciiEscapes getDrvLogPath findLog logContentsgetDrvLogPath findLog - replacement in src/lib/Hydra/Helper/Nix.pm at line 157
my $fn = ($ENV{NIX_LOG_DIR} || "/nix/var/log/nix") . "/drvs/";my $fn2 = Hydra::Model::DB::getHydraPath . "/build-logs/";for ($fn2 . $bucketed, $fn2 . $bucketed . ".bz2", $fn . $bucketed . ".bz2", $fn . $bucketed, $fn . $base . ".bz2", $fn . $base) {my $fn = Hydra::Model::DB::getHydraPath . "/build-logs/";for ($fn . $bucketed, $fn . $bucketed . ".bz2") { - edit in src/lib/Hydra/Helper/Nix.pm at line 191[10.3666]→[10.3666:3668](∅→∅),[10.3668]→[10.5599:5600](∅→∅),[10.5600]→[10.1313:1314](∅→∅),[10.1314]→[10.441:459](∅→∅),[10.5600]→[10.441:459](∅→∅),[10.459]→[10.2046:2077](∅→∅),[10.1422]→[10.487:500](∅→∅),[10.2077]→[10.487:500](∅→∅),[10.487]→[10.487:500](∅→∅),[10.500]→[10.1423:1551](∅→∅),[10.1551]→[10.624:641](∅→∅),[10.624]→[10.624:641](∅→∅),[10.641]→[10.1552:1624](∅→∅),[10.1624]→[10.707:713](∅→∅),[10.707]→[10.707:713](∅→∅),[10.713]→[10.174:210](∅→∅)
}sub logContents {my ($logPath, $tail) = @_;my $cmd;if ($logPath =~ /.bz2$/) {$cmd = "bzip2 -d < $logPath";$cmd = $cmd . " | tail -n $tail" if defined $tail;}else {$cmd = defined $tail ? "tail -$tail $logPath" : "cat $logPath";}return decode("utf-8", `$cmd`); - edit in src/lib/Hydra/Helper/Nix.pm at line 194[10.1646]→[10.150:199](∅→∅),[10.850]→[10.150:199](∅→∅),[10.199]→[2.0:41](∅→∅),[2.41]→[10.234:257](∅→∅),[10.234]→[10.234:257](∅→∅),[10.257]→[10.371:372](∅→∅),[10.850]→[10.371:372](∅→∅),[10.372]→[10.5601:5602](∅→∅)
sub removeAsciiEscapes {my ($logtext) = @_;$logtext =~ s/\e\[[0-9]*[A-Za-z]//g;return $logtext;} - edit in src/lib/Hydra/View/NixLog.pm at line 15
my $tail = int($c->stash->{tail} // "0"); - replacement in src/lib/Hydra/View/NixLog.pm at line 19
open $fh, "bzip2 -dc < '$logPath' |" or die;my $doTail = $tail ? " tail -n '$tail' |" : "";open $fh, "bzip2 -dc < '$logPath' | $doTail" or die; - replacement in src/lib/Hydra/View/NixLog.pm at line 22
open $fh, "<$logPath" or die;if ($tail) {open $fh, "tail -n '$tail' '$logPath' |" or die;} else {open $fh, "<$logPath" or die;} - edit in src/lib/Hydra/View/TT.pm at line 16
return 1 if defined $c->config->{log_prefix}; - edit in src/lib/Hydra/View/TT.pm at line 23
return 1 if defined $c->config->{log_prefix}; - edit in src/lib/Hydra/View/TT.pm at line 28
- file deletion: plain-reload.tt
[% WRAPPER layout.tt title="Log of " _ (step ? " step $step.stepnr of " : "") _ "build ${build.id} of job $build.project.name:$build.jobset.name:$build.job.name" %][% PROCESS common.tt %]<p>Below are the last 50 log lines. The <a href="[% c.uri_for('/build' build.id 'log') %]">full log</a> is also available.</p>[% IF reload %]<script>function scrollDown() {$("#contents").scrollTop($("#contents").get(0).scrollHeight);}function injectTail() {$.ajax({url: "[% url %]",dataType: "text",success: function (tail) {$("#contents").text(tail);}});}$(document).ready(function() {injectTail();setInterval(injectTail, 5000);});</script>[% END %]<pre class="taillog" id="contents">[% HTML.escape(contents) %]</pre>[% END %]scrollDown();scrollDown();[% project = build.project %][% jobset = build.jobset %][% job = build.job %] - replacement in src/root/build.tt at line 10
FOR step IN steps; IF step.busy; busy = 1; END; END;building = 0;FOR step IN steps;IF step.busy;busy = 1;IF step.drvpath == build.drvpath; building = 1; END;END;END; - replacement in src/root/build.tt at line 216
[% IF (!isAggregate || !build.ischannel) && build.finished; actualBuild = build.iscachedbuild ? cachedBuild : build %][% actualBuild = build.iscachedbuild ? cachedBuild : build %][% IF (!isAggregate || !build.ischannel) && build.finished; %] - replacement in src/root/build.tt at line 229
[% IF (!isAggregate || !build.ischannel) && buildLogExists(build) %][% IF (!build.finished && building) || (build.finished && (!isAggregate || !build.ischannel) && buildLogExists(build)) %] - replacement in src/root/build.tt at line 233
<a class="btn btn-mini" href="[% c.uri_for('/build' build.id 'log') %]">pretty</a><a class="btn btn-mini" href="[% c.uri_for('/build' build.id 'log' 'raw') %]">raw</a><a class="btn btn-mini" href="[% c.uri_for('/build' build.id 'log' 'tail-reload') %]">tail</a><a class="btn btn-mini" href="[% c.uri_for('/build' actualBuild.id 'log') %]">pretty</a><a class="btn btn-mini" href="[% c.uri_for('/build' actualBuild.id 'log' 'raw') %]">raw</a><a class="btn btn-mini" href="[% c.uri_for('/build' actualBuild.id 'log' 'tail') %]">tail</a> - replacement in src/root/common.tt at line 468
(<a [% IF inRow %]class="row-link"[% END %] href="[% url %]">log</a>, <a href="[% "$url/raw" %]">raw</a>, <a href="[% "$url/tail-reload" %]">tail</a>)(<a [% IF inRow %]class="row-link"[% END %] href="[% url %]">log</a>, <a href="[% "$url/raw" %]">raw</a>, <a href="[% "$url/tail" %]">tail</a>) - replacement in src/root/log.tt at line 5
This is the build log of derivation <tt>[% IF step; step.drvpath; ELSE; build.drvpath; END %]</tt>.Below[% IF tail %]are the last lines of[% ELSE %]is[% END %]the build log of derivation <tt>[% IF step; step.drvpath; ELSE; build.drvpath; END %]</tt>. - edit in src/root/log.tt at line 14
[% END %][% IF tail %]The <a href="[% step ? c.uri_for('/build' build.id 'nixlog' step.stepnr): c.uri_for('/build' build.id 'log') %]">full log</a> is also available. - replacement in src/root/log.tt at line 21
<pre class="taillog" id="contents">[% HTML.escape(logtext) %]<pre class="log" id="contents"><em>Loading...</em> - edit in src/root/log.tt at line 24
<script type="text/javascript">$(document).ready(function() {requestPlainFile({url: "[% HTML.escape(log_uri) %]",dataType: "text",type: 'GET',success: function (log_data) {[% IF tail %]/* The server may give us a full log (e.g. if the log is inS3). So extract the last lines. */log_data = log_data.split("\n").slice(-[%tail%]).join("\n");[% END %]$("#contents").text(log_data);},error: function () {bootbox.alert("The log file is not available.");$("#contents").text("(Unavailable)");}});});</script> - replacement in src/root/machine-status.tt at line 45
<td><a class="row-link" href="[% c.uri_for('/build' step.build 'nixlog' step.stepnr 'tail-reload') %]">[% step.stepnr %]</a></td><td><a class="row-link" href="[% c.uri_for('/build' step.build 'nixlog' step.stepnr 'tail') %]">[% step.stepnr %]</a></td> - replacement in src/root/static/css/hydra.css at line 122
pre.log, pre.taillog {pre.log { - edit in src/root/static/js/common.js at line 121
};function requestFile(args) {if (!"error" in args) {args.error = function(data) {json = {};try {if (data.responseText)json = $.parseJSON(data.responseText);} catch (err) {}if (json.error)bootbox.alert(escapeHTML(json.error));else if (data.responseText)bootbox.alert("Server error: " + escapeHTML(data.responseText));elsebootbox.alert("Unknown server error!");if (args.postError) args.postError(data);};}return $.ajax(args); - replacement in src/root/static/js/common.js at line 146
args.error = function(data) {json = {};try {if (data.responseText)json = $.parseJSON(data.responseText);} catch (err) {requestFile(args);};function requestPlainFile(args) {args.dataType = 'text';/* Remove the X-Requested-With header, which would turn triggerCORS checks for this request.http://stackoverflow.com/a/24719409/6747243*/args.xhr = function() {var xhr = jQuery.ajaxSettings.xhr();var setRequestHeader = xhr.setRequestHeader;xhr.setRequestHeader = function(name, value) {if (name == 'X-Requested-With') return;setRequestHeader.call(this, name, value); - replacement in src/root/static/js/common.js at line 162[10.2551]→[10.2551:2575](∅→∅),[10.2575]→[10.3733:3784](∅→∅),[10.3784]→[10.2614:2650](∅→∅),[10.2614]→[10.2614:2650](∅→∅),[10.2650]→[10.3785:3862](∅→∅),[10.3862]→[10.2715:2780](∅→∅),[10.2715]→[10.2715:2780](∅→∅),[10.2780]→[10.565:615](∅→∅)
if (json.error)bootbox.alert(escapeHTML(json.error));else if (data.responseText)bootbox.alert("Server error: " + escapeHTML(data.responseText));elsebootbox.alert("Unknown server error!");if (args.postError) args.postError(data);return xhr; - replacement in src/root/static/js/common.js at line 164
return $.ajax(args);requestFile(args); - replacement in src/root/steps.tt at line 28
<td><a class="row-link" href="[% c.uri_for('/build' step.build.id 'nixlog' step.stepnr 'tail-reload') %]">[% step.stepnr %]</a></td><td><a class="row-link" href="[% c.uri_for('/build' step.build.id 'nixlog' step.stepnr 'tail') %]">[% step.stepnr %]</a></td>