[% USE date %] [% USE String %] [% USE HTML %] [% inputTypes = { "svn" = "Subversion export" , "svn-checkout" = "Subversion checkout" , "bzr" = "Bazaar export" , "bzr-checkout" = "Bazaar checkout" , "git" = "Git checkout" , "tarball" = "Download of a tarball" , "hg" = "Mercurial checkout" , "string" = "String value" , "boolean" = "Boolean" , "path" = "Local path" , "build" = "Build output" , "sysbuild" = "Build output (same system)" } %] [% BLOCK renderDateTime %] [% date.format(timestamp, '%Y-%m-%d %H:%M:%S') -%] [% END %] [% BLOCK renderProjectName -%] <a href="[% c.uri_for('/project' project) %]"><tt>[% project %]</tt></a>[% END -%] [% BLOCK renderJobsetName -%] <a href="[% c.uri_for('/jobset' project jobset) %]"><tt>[% jobset %]</tt></a>[% END -%] [% BLOCK renderJobName -%] <a href="[% c.uri_for('/job' project jobset job) %]"><tt>[% job %]</tt></a>[% END -%] [% BLOCK renderFullJobsetName %] <tt> [% INCLUDE renderProjectName %]:[% INCLUDE renderJobsetName %] </tt> [% END %] [% BLOCK renderFullJobName %] <tt> [% INCLUDE renderProjectName %]:[% INCLUDE renderJobsetName %]:[% INCLUDE renderJobName %] </tt> [% END %] [% BLOCK renderFullJobNameOfBuild %] [% INCLUDE renderFullJobName project=build.get_column("project") jobset = build.get_column("jobset") job = build.get_column("job") %] [% END %] [% BLOCK renderDuration -%] [% IF duration >= 24 * 60 * 60 %][% duration div (24 * 60 * 60) %]d[% END %] [% IF duration >= 60 * 60 %][% duration div (60 * 60) % 24 %]h[% END %] [% IF duration >= 60 %][% duration div 60 % 60 %]m[% END %] [% duration % 60 %]s [% END %] [% BLOCK renderBuildList %] <table class="buildList tablesorter[% IF !showSchedulingInfo %] clean[% END %]"> <thead> <tr> [% IF !hideResultInfo %] <th></th> [% END %] <th>#</th> [% IF showSchedulingInfo %] <th></th> <th>P</th> [% END %] <th>Job</th> <th>Release Name</th> <th>System</th> <th>Timestamp</th> [% IF showStatusChange %] <th class="headerSortUp">Last status change</th> [% END %] [% IF showDescription %] <th>Description</th> [% END %] </tr> </thead> <tbody> [% odd = 0 %] [% FOREACH build IN builds -%] <tr class="clickable [% IF showSchedulingInfo -%] [% IF build.get_column('busy') %]runningBuild[% ELSIF build.get_column('disabled') == 1 || build.get_column('enabled') == 0 %]disabledBuild[% END %] [% ELSE -%] [% IF odd %] odd [% END; odd = !odd -%] [% END %]" onclick="window.location = '[% c.uri_for('/build' build.id) %]'"> [% IF !hideResultInfo %] <td> [% IF build.get_column('buildstatus') == 0 %] <img src="/static/images/success.gif" alt="Succeeded" /> [% ELSE %] <img src="/static/images/failure.gif" alt="Failed" /> [% END %] </td> [% END %] <td><a href="[% c.uri_for('/build' build.id) %]">[% build.id %]</a></td> [% IF showSchedulingInfo %] <td>[% IF build.get_column('busy') %]<img src="/static/images/running.gif" alt="Running" />[% ELSIF build.get_column('disabled') == 1 || build.get_column('enabled') == 0 %]Disabled[% END %]</td> <td>[% build.get_column('priority') %]</td> [% END %] <td> [% INCLUDE renderFullJobNameOfBuild %] </td> <td>[% !showSchedulingInfo and build.get_column('releasename') ? build.get_column('releasename') : build.nixname %]</td> <td><tt>[% build.system %]</tt></td> <td>[% date.format(build.timestamp, '%Y-%m-%d %H:%M:%S') %]</td> [% IF showStatusChange %] <td> [% IF build.get_column('statusChangeTime') %] <a href="[% c.uri_for('/build' build.get_column('statusChangeId')) %]"> [% date.format(build.get_column('statusChangeTime'), '%Y-%m-%d %H:%M:%S') %] </a> [% ELSE %] <em>never</em> [% END %] </td> [% END %] [% IF showDescription %] <td>[% build.description %]</td> [% END -%] </tr> [% END -%] </tbody> </table> [% END %] [% BLOCK renderLink %]<a href="[% uri %]">[% title %]</a>[% END %] [% BLOCK showBuildStats %] <table class="layoutTable"> <tr> <th>Finished builds:</th> <td>[% finishedBuilds %]</td> </tr> <tr> <th><img src="/static/images/success.gif" alt="Succeeded" /> Succeeded builds:</th> <td>[% succeededBuilds %]</td> </tr> <tr> <th><img src="/static/images/failure.gif" alt="Failed" /> Failed builds:</th> <td>[% finishedBuilds - succeededBuilds %]</td> </tr> <tr> <th>Total build time:</th> <td>[% INCLUDE renderDuration duration = totalBuildTime %]</td> </tr> <tr> <th>Scheduled builds:</th> <td>[% scheduledBuilds %]</td> </tr> <tr> <th>Currently executing builds:</th> <td>[% busyBuilds %]</td> </tr> </table> [% END %] [% BLOCK renderViewJobName -%] [% IF job.description; HTML.escape(job.description); ELSE %]<tt>[% job.job %]</tt> ([% job.attrs %])[% END -%] [% END -%] [% BLOCK maybeLink -%] [% IF uri %]<a [% HTML.attributes(href => uri) %][% IF confirmmsg %]onclick="javascript:return confirm('[% confirmmsg %]')"[% END %]>[% content %]</a>[% ELSE; content; END -%] [% END -%] [% BLOCK renderSelection %] [% IF edit %] <select [% HTML.attributes(id => param, name => param) %]> [% FOREACH name IN options.keys.sort %] <option [% HTML.attributes(value => name) %] [% IF name == curValue; "selected='selected'"; END %]>[% options.$name %]</option> [% END %] </select> [% ELSE %] [% options.$curValue %] [% END %] [% END %] [% BLOCK maybeEditString; IF edit -%] <input type="text" class="string [% extraClass %]" [% HTML.attributes(id => param, name => param, value => value) %] /> [% ELSE; HTML.escape(value); END -%] [% END -%] [% BLOCK renderFullBuildLink %] [% INCLUDE renderFullJobNameOfBuild build=build %] <a href="[% c.uri_for('/build' build.id) %]">build [% build.id %]</a>[% -%] [% END %] [% BLOCK renderBuildStatusIcon; %] [% IF build.finished %] [% IF build.resultInfo.buildstatus == 0 %] <img src="/static/images/checkmark_[% size %].png" alt="Succeeded" /> [% ELSIF build.resultInfo.buildstatus == 1 %] <img src="/static/images/error_[% size %].png" alt="Failed" /> [% ELSIF build.resultInfo.buildstatus == 2 %] <img src="/static/images/error_[% size %].png" alt="Failed" /> [% ELSIF build.resultInfo.buildstatus == 4 %] <img src="/static/images/error_[% size %].png" alt="Failed" /> [% ELSIF build.resultInfo.buildstatus == 5 %] <img src="/static/images/error_[% size %].png" alt="Failed" /> [% ELSIF build.resultInfo.buildstatus == 6 %] <img src="/static/images/error_[% size %].png" alt="Failed (with result)" /> [% ELSE %] <img src="/static/images/error_[% size %].png" alt="Failed" /> [% END %] [% ELSIF build.schedulingInfo.busy %] <img src="/static/images/help_[% size %].png" alt="Budy" /> [% ELSE %] <img src="/static/images/help_[% size %].png" alt="Scheduled" /> [% END %] [% END %] [% BLOCK renderStatus; %] [% IF build.finished %] [% IF build.resultInfo.buildstatus == 0 %] <img src="/static/images/success.gif" alt="Succeeded" /> <strong>Success</strong> [% ELSIF build.resultInfo.buildstatus == 1 %] <img src="/static/images/failure.gif" alt="Failed" /> <span class="error">Build returned a non-zero exit code</span> [% ELSIF build.resultInfo.buildstatus == 2 %] <img src="/static/images/failure.gif" alt="Failed" /> <span class="error">A dependency of the build failed</span> [% ELSIF build.resultInfo.buildstatus == 4 %] <img src="/static/images/failure.gif" alt="Failed" /> <span class="error">Cancelled by user</span> [% ELSIF build.resultInfo.buildstatus == 5 %] <img src="/static/images/failure.gif" alt="Failed" /> <span class="error">Build inhibited because a dependency previously failed to build</span> [% failedDep = build.resultInfo.failedDep %] (namely, <a href="[% c.uri_for('/build' failedDep.build.id 'nixlog' failedDep.stepnr) %]"><tt>[% failedDep.outpath %]</tt></a>) [% ELSIF build.resultInfo.buildstatus == 6 %] <img src="/static/images/failure.gif" alt="Failed (with result)" /> <span class="error">Build failed (with result)</span> [% ELSE %] <img src="/static/images/failure.gif" alt="Failed" /> <span class="error">Build failed</span> (see <a href="#nix-error">below</a>) [% END %] [% IF c.user_exists && (build.resultInfo.buildstatus == 3 || build.resultInfo.buildstatus == 4) %] <form action="[% c.uri_for('/build' build.id 'restart') %]" method="post" class="inline"> <button id="restart" type="submit">Restart</button> </form> [% END %] [% ELSIF build.schedulingInfo.busy %] <strong>Build in progress</strong> since [% INCLUDE renderDateTime timestamp = build.schedulingInfo.starttime %] [% ELSE %] <strong>Scheduled to be built</strong> [% IF c.user_exists %] <form action="[% c.uri_for('/build' build.id 'cancel') %]" method="post" class="inline"> <button id="cancel" type="submit">Cancel</button> </form> [% END %] [% END %] [% END -%] [% BLOCK renderInputValue %] [% IF input.type == "build" || input.type == "sysbuild" %] [% INCLUDE renderFullBuildLink build=input.dependency %]</a> [% ELSIF input.type == "string" || input.type == "boolean" %] <tt>"[% input.value %]"</tt> [% ELSE %] <tt>[% input.uri %][% IF input.revision %] (r. [% input.revision %])[% END %]</tt> [% END %] [% END %] [% BLOCK renderShortInputValue %] [% IF input.type == "build" || input.type == "sysbuild" %] <a href="[% c.uri_for('/build' build.id) %]">[% build.id %]</a> [% ELSIF input.type == "string" || input.type == "boolean" %] <tt>"[% input.value %]"</tt> [% ELSE %] <tt>[% input.uri %][% IF input.revision %] (r. [% input.revision %])[% END %]</tt> [% END %] [% END %] [% BLOCK renderDiffUri; %] [% nouri = 1 %] [% FOREACH m IN mappers %] [% base = m.baseuri %] [% url = bi1.uri %] [% path = url.replace(base, '') %] [% IF url.match(base) %] <a target="_new" href="[% m.uri.replace('_path_', path).replace('_1_', bi1.revision).replace('_2_', bi2.revision) %]">[% contents %]</a> [% nouri = 0 %] [% END %] [% END %] [% IF nouri %] [% res = bi1.uri.split(' ') %] [% url = res.0 %] [% branch = res.1 %] [% IF bi1.type == "hg" || bi1.type == "git" %] <a target="_new" href="/api/scmdiff?uri=[% url %]&rev1=[% bi1.revision %]&rev2=[% bi2.revision %]&type=[% bi1.type %]&branch=[% branch %]">[% contents %]</a> [% ELSE %] [% contents %] [% END %] [% END %] [% END %] [% BLOCK renderInputDiff; %] <table class="tablesorter clean"> [% IF !nestedDiff %] <tr><th>Input</th><th>Changes</th></tr> [% END %] [% FOREACH bi1 IN build1.inputs %] [% deletedInput = 1 %] [% FOREACH bi2 IN build2.inputs %] [% IF bi1.name == bi2.name %] [% IF bi1.type == bi2.type %] [% IF bi1.value != bi2.value || bi1.uri != bi2.uri %] <tr><td><b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %] to [% INCLUDE renderShortInputValue input=bi2 %]</tt></td></tr> [% ELSIF bi1.uri == bi2.uri && bi1.revision != bi2.revision %] [% IF bi1.type == "git" %] <tr><td> <b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderDiffUri contents=(bi1.revision.substr(0, 6) _ ' to ' _ bi2.revision.substr(0, 6)) %]</tt> </td></tr> [% ELSE %] <tr><td> <b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderDiffUri contents=(bi1.revision _ ' to ' _ bi2.revision) %]</tt> </td></tr> [% END %] [% ELSIF bi1.dependency.id != bi2.dependency.id || bi1.path != bi2.path %] <tr><td> <b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %] to [% INCLUDE renderShortInputValue input=bi2 %]</tt> <br/> <br/> [% INCLUDE renderInputDiff build1=bi1.dependency, build2=bi2.dependency, nestedDiff=1 %] </td></tr> [% END %] [% ELSE %] <tr><td><b>[% bi1.name %]</b></td><td>Changed input type from '[% type = bi1.type; inputTypes.$type %]' to '[% type = bi2.type; inputTypes.$type %]'</td></tr> [% END %] [% deletedInput = 0 %] [% END %] [% END %] [% IF deletedInput == 1 %] <tr><td><b>[% bi1.name %]</b></td><td>Input not present in this build.</td></tr> [% END %] [% END %] </table> [% END %] [% BLOCK hydraStatus %] <table class="tablesorter"> <thead> <tr><th>Machine</th><th>Job</th><th>Type</th><th>Build</th><th>Step</th><th>What</th><th>Since</th></tr> </thead> <tbody> [% FOREACH step IN steps %] <tr> <td><tt>[% IF step.machine; step.machine.match('@(.*)').0; ELSE; 'localhost'; END %]</tt></td> <td><tt>[% INCLUDE renderFullJobName project = step.build.project.name jobset = step.build.jobset.name job = step.build.job.name %]</tt></td> <td><tt>[% step.system %]</tt></td> <td><a href="[% c.uri_for('/build' step.build.id) %]">[% step.build.id %]</a></td> <td><a href="[% c.uri_for('/build' step.build.id 'nixlog' step.stepnr 'tail-reload') %]">[% step.stepnr %]</a></td> <td><tt>[% step.outpath.match('-(.*)').0 %]</tt></td> <td class='right'>[% INCLUDE renderDuration duration = curTime - step.starttime %] </td> </tr> [% END %] </tbody> </table> [% END %] [% BLOCK buildsGraph %] [% END %]