[%- 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.busy %]runningBuild[% ELSIF build.disabled == 1 || build.get_column('enabled') == 0 %]disabledBuild[% END -%] [%- ELSE -%] [%- IF odd %] odd [% END; odd = !odd -%] [%- END %]" onclick="if(event.which == 2) return true; window.location = '[% c.uri_for('/build' build.id) %]'"> [%- IF !hideResultInfo -%] <td> [%- INCLUDE renderBuildStatusIcon size=16 busy=(showSchedulingInfo ? 1 : 0) buildstatus=build.buildstatus -%] </td> [%- END -%] <td><a href="[% c.uri_for('/build' build.id) %]">[% build.id %]</a></td> [%- IF showSchedulingInfo -%] <td>[% IF build.busy %]<img src="/static/images/running.gif" alt="Running" />[% ELSIF build.disabled == 1 || build.get_column('enabled') == 0 %]Disabled[% END %]</td> <td>[% build.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/checkmark_16.png" alt="Succeeded" /> Succeeded builds:</th> <td>[% succeededBuilds %]</td> </tr> <tr> <th><img src="/static/images/error_16.png" 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 -%] [%- finished = build != undef ? build.finished : 1 -%] [%- busy = busy != undef ? busy : build.busy -%] [%- buildstatus = buildstatus != undef ? buildstatus : build.buildstatus -%] [%- IF finished -%] [%- IF buildstatus == 0 -%] <img src="/static/images/checkmark_[% size %].png" alt="Succeeded" /> [%- ELSIF buildstatus == 1 -%] <img src="/static/images/error_[% size %].png" alt="Failed" /> [%- ELSIF buildstatus == 2 -%] <img src="/static/images/dependency_[% size %].png" alt="Dependency failed" /> [%- ELSIF buildstatus == 4 -%] <img src="/static/images/error_[% size %].png" alt="Failed" /> [%- ELSIF buildstatus == 5 -%] <img src="/static/images/error_[% size %].png" alt="Failed" /> [%- ELSIF 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 busy -%] <img src="/static/images/help_[% size %].png" alt="Busy" /> [%- ELSE -%] <img src="/static/images/help_[% size %].png" alt="Scheduled" /> [%- END -%] [%- END -%] [% BLOCK renderStatus %] [% IF build.finished %] [% buildstatus = build.buildstatus %] [% INCLUDE renderBuildStatusIcon size=16 %] [% IF buildstatus == 0 %] <strong>Success</strong> [% ELSIF buildstatus == 1 %] <span class="error">Build returned a non-zero exit code</span> [% ELSIF buildstatus == 2 %] <span class="error">A dependency of the build failed</span> [% ELSIF buildstatus == 4 %] <span class="error">Cancelled by user</span> [% ELSIF buildstatus == 5 %] <span class="error">Build inhibited because a dependency previously failed to build</span> [% ELSIF buildstatus == 6 %] <span class="error">Build failed (with result)</span> [% ELSE %] <span class="error">Build failed</span> (see <a href="#nix-error">below</a>) [% END %] [% IF c.user_exists && (buildstatus == 3 || 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.busy %] <strong>Build in progress</strong> since [% INCLUDE renderDateTime timestamp = build.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' input.dependency.id) %]">[% input.dependency.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 %]