[% USE date; USE String; USE HTML; USE Math; USE mibs=format("%.2f"); BLOCK renderDateTime; date.format(timestamp, '%Y-%m-%d %H:%M:%S'); END; BLOCK renderRelativeDate; ago = date.now - timestamp; IF ago >= 0 && ago < 60; THEN; ago _ 's ago'; ELSIF ago >= 0 && ago < 60 * 60; THEN; Math.int(ago / 60) _ 'm ago'; ELSIF ago >= 0 && ago < 24 * 60 * 60; THEN; Math.int(ago / (60 * 60)) _ 'h ago'; ELSIF ago >= 0 && ago < 7 * 24 * 60 * 60; THEN; Math.int(ago / (24 * 60 * 60)) _ 'd ago'; ELSE; date.format(timestamp, '%Y-%m-%d'); END; END; BLOCK renderProjectName %] [% project %] [% END; BLOCK renderJobsetName %] [% jobset %] [% END; BLOCK renderJobName %] [% job %] [% END; BLOCK renderFullJobsetName %] [% INCLUDE renderProjectName inRow=0 %]:[% INCLUDE renderJobsetName %] [% END; BLOCK renderFullJobName %] [% IF !hideProjectName; INCLUDE renderProjectName inRow=0 %]:[% END; IF !hideJobsetName; INCLUDE renderJobsetName inRow=0 %]:[% END; INCLUDE renderJobName %] [% 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 renderBuildListHeader %] [% IF !hideResultInfo %] [% END %] [% IF showSchedulingInfo %] [% END %] [% IF !hideJobName %] [% END %] [% IF showDescription %] [% END %] [% END; BLOCK renderBuildListBody; FOREACH build IN builds; link = c.uri_for('/build' build.id) %] [% IF !hideResultInfo %] [% END %] [% IF showSchedulingInfo %] [% END %] [% IF !hideJobName %] [% END %] [% IF showDescription %] [% END %] [% END; IF linkToAll %] [% END; END; BLOCK renderBuildListFooter %]
#Job[% IF showSchedulingInfo %]Queued at[% ELSE %]Finished at[% END %] Package/release name SystemDescription
[% INCLUDE renderBuildStatusIcon size=16 busy=(showSchedulingInfo ? 1 : 0) buildstatus=build.buildstatus %] [% IF build.busy %]Started[% ELSE %]Queued[% END %][% build.id %][% IF !hideJobsetName %][%build.get_column("project")%]:[%build.get_column("jobset")%]:[% END %][%build.get_column("job")%][% t = showSchedulingInfo ? build.timestamp : build.stoptime; IF t; INCLUDE renderRelativeDate timestamp=(showSchedulingInfo ? build.timestamp : build.stoptime); ELSE; "-"; END %] [% !showSchedulingInfo and build.get_column('releasename') ? build.get_column('releasename') : build.nixname %] [% build.system %][% build.description %]
More...
[% END; BLOCK renderBuildList; INCLUDE renderBuildListHeader; INCLUDE renderBuildListBody; INCLUDE renderBuildListFooter; END; BLOCK renderLink %][% title %][% END; BLOCK maybeLink; IF uri %] uri, class => class); IF confirmmsg +%] onclick="javascript:return confirm('[% confirmmsg %]')"[% END %]>[% content %][% ELSE; content; END; END; BLOCK renderSelection; IF edit; IF radiobuttons; %]
[% FOREACH name IN options.keys.sort %] [% END %]
[% ELSE %] [% END; ELSE; options.$curValue; END; END; BLOCK editString; %] param, name => param, value => value) %] /> [% END; BLOCK renderFullBuildLink; INCLUDE renderFullJobNameOfBuild build=build %] build [% build.id %][% END; BLOCK renderBuildIdLink; %] build [% id %] [% END; BLOCK renderBuildLink; INCLUDE renderBuildIdLink id=build.id; 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 %] Succeeded [% ELSIF buildstatus == 1 %] Failed [% ELSIF buildstatus == 2 || buildstatus == 5 %] Dependency failed [% ELSIF buildstatus == 3 || buildstatus == 9 %] Aborted [% ELSIF buildstatus == 4 %] Cancelled [% ELSIF buildstatus == 6 %] Failed with output [% ELSIF buildstatus == 7 %] Timed out [% ELSIF buildstatus == 10 %] Log limit exceeded [% ELSE %] Failed [% END; ELSIF busy %] Busy [% ELSE %] Scheduled [% END; END; BLOCK renderStatus; IF build.finished; buildstatus = build.buildstatus; IF icon; INCLUDE renderBuildStatusIcon size=16; END; IF buildstatus == 0 %] Success [% ELSIF buildstatus == 1 %] Build returned a non-zero exit code [% ELSIF buildstatus == 2 || buildstatus == 5 %] A dependency of the build failed [% ELSIF buildstatus == 4 %] Cancelled by user [% ELSIF buildstatus == 6 %] Build failed with output [% ELSIF buildstatus == 7 %] Timed out [% ELSIF buildstatus == 9 %] Unsupported system type [% ELSIF buildstatus == 10 %] Log limit exceeded [% ELSE %] Aborted (Hydra failure; see below) [% END; ELSIF build.busy %] Build in progress since [% INCLUDE renderDateTime timestamp = build.starttime; ELSE %] Scheduled to be built [% END; END; BLOCK renderShortInputValue; IF input.type == "build" || input.type == "sysbuild" %] [% input.dependency.id %] [% ELSIF input.type == "string" %] "[% HTML.escape(input.value) %]" [% ELSIF input.type == "nix" || input.type == "boolean" %] [% HTML.escape(input.value) %] [% ELSE %] [% HTML.escape(input.uri) %][% IF input.revision %] (r[% HTML.escape(input.revision) %])[% END %] [% END %] [% END; BLOCK renderDiffUri; nouri = 1; FOREACH m IN mappers; base = m.baseuri; url = bi1.uri; path = url.replace(base, ''); IF url.match(base) %] [% contents %] [% nouri = 0; END; END; IF nouri; res = bi1.uri.split(' '); url = res.0; branch = res.1; IF bi1.type == "hg" || bi1.type == "git" %] [% contents %] [% ELSE; contents; END; END; END; BLOCK renderInputs; %] [% FOREACH input IN inputs %] [% END %]
NameTypeValueRevisionStore path
[% input.name %] [% type = input.type; inputTypes.$type %] [% IF input.type == "build" || input.type == "sysbuild" %] [% INCLUDE renderFullBuildLink build=input.dependency %] [% ELSIF input.type == "string" %] "[% HTML.escape(input.value) %]" [% ELSIF input.type == "nix" || input.type == "boolean" %] [% HTML.escape(input.value) %] [% ELSE %] [% HTML.escape(input.uri) %] [% END %] [% IF input.revision %][% HTML.escape(input.revision) %][% END %] [% input.path %]
[% END; BLOCK renderInputDiff; %] [% IF !nestedDiff %] [% END; IF !nestLevel; nestLevel = 0; END; IF nestLevel <= 3; FOREACH bi1 IN inputs1; deletedInput = 1; FOREACH bi2 IN inputs2; IF bi1.name == bi2.name; IF bi1.type == bi2.type; IF bi1.value != bi2.value || bi1.uri != bi2.uri %] [% ELSIF bi1.uri == bi2.uri && bi1.revision != bi2.revision %] [% IF bi1.type == "git" %] [% ELSE %] [% END %] [% ELSIF bi1.dependency.id != bi2.dependency.id || bi1.path != bi2.path %] [% END %] [% ELSE %] [% END; deletedInput = 0; END; END; IF deletedInput == 1 %] [% END; END; END %]
InputChanges
[% bi1.name %][% INCLUDE renderShortInputValue input=bi1 %] to [% INCLUDE renderShortInputValue input=bi2 %]
[% bi1.name %][% INCLUDE renderDiffUri contents=(bi1.revision.substr(0, 6) _ ' to ' _ bi2.revision.substr(0, 6)) %]
[% bi1.name %][% INCLUDE renderDiffUri contents=(bi1.revision _ ' to ' _ bi2.revision) %]
[% bi1.name %][% INCLUDE renderShortInputValue input=bi1 %] to [% INCLUDE renderShortInputValue input=bi2 %]

[% INCLUDE renderInputDiff inputs1=bi1.dependency.inputs inputs2=bi2.dependency.inputs nestedDiff=1 nestLevel=nestLevel+1 %]
[% bi1.name %]Changed input type from '[% type = bi1.type; inputTypes.$type %]' to '[% type = bi2.type; inputTypes.$type %]'
[% bi1.name %]Input not present in this build.
[% END; BLOCK renderPager %] [% END; BLOCK renderShortEvalInput; IF input.type == "svn" || input.type == "svn-checkout" || input.type == "bzr" || input.type == "bzr-checkout" %] r[% input.revision %] [% ELSIF input.type == "git" %] [% input.revision.substr(0, 7) %] [% ELSIF input.type == "hg" %] [% input.revision.substr(0, 12) %] [% ELSIF input.type == "build" || input.type == "sysbuild" %] [% input.get_column('dependency') %] [% ELSE %] [% input.revision %] [% END; END; BLOCK renderEvals %] [% IF !jobset && !build %] [% END %] [% FOREACH e IN evals; eval = e.eval; link = c.uri_for(c.controller('JobsetEval').action_for('view'), [eval.id]) %] [% IF !jobset && !build %] [% END %] [% END; IF linkToAll %] [% END %]
#JobsetDate Input changes Success
[% eval.id %][% INCLUDE renderFullJobsetName project=eval.get_column('project') jobset=eval.get_column('jobset') %][% INCLUDE renderRelativeDate timestamp = eval.timestamp %] [% IF e.changedInputs.size > 0; sep=''; FOREACH input IN e.changedInputs; sep; %] [% input.name %] → [% INCLUDE renderShortEvalInput input=input; sep=', '; END; ELSE %] - [% END %] [% e.nrSucceeded %] [% IF e.nrFailed > 0 %] [% e.nrFailed %] [% END %] [% IF e.nrScheduled > 0 %] [% e.nrScheduled %] [% END %] [% IF e.diff > 0 %] +[% e.diff %] [% ELSIF e.diff < 0 && e.nrScheduled == 0 %] [% e.diff %] [% END %]
More...
[% END; BLOCK renderLogLinks %] (log, raw, tail) [% END; BLOCK makeLazyTab %]
Loading...
[% END; BLOCK makePopover %]
content, 'data-placement' => placement || 'bottom') %]> [% title %]
[% END; BLOCK menuItem %]
  • uri) %] [%+ IF modal %]data-toggle="modal"[% END %]> [% IF icon %] [%+ END %] [% title %]
  • [% END; BLOCK makeStar %] [% IF starred; "★"; ELSE; "☆"; END %] [% END; BLOCK renderJobsetOverview %] [% FOREACH j IN jobsets %] [% successrate = 0 %] [% IF j.get_column('nrtotal') > 0 %] [% successrate = ( j.get_column('nrsucceeded') / j.get_column('nrtotal') )*100 %] [% IF j.get_column('nrscheduled') > 0 %] [% class = 'label' %] [% ELSIF successrate < 25 %] [% class = 'label label-important' %] [% ELSIF successrate < 75 %] [% class = 'label label-warning' %] [% ELSIF successrate <= 100 %] [% class = 'label label-success' %] [% END %] [% END %] [% END %]
    Name Description Last evaluated Success
    [% IF j.get_column('nrscheduled') > 0 %] Scheduled [% ELSIF j.get_column('nrfailed') == 0 %] Succeeded [% ELSIF j.get_column('nrfailed') > 0 && j.get_column('nrsucceeded') > 0 %] Some Failed [% ELSE %] All Failed [% END %] [% IF showProject; INCLUDE renderFullJobsetName project=j.get_column('project') jobset=j.name inRow=1; ELSE; INCLUDE renderJobsetName project=j.get_column('project') jobset=j.name inRow=1; END %] [% HTML.escape(j.description) %] [% IF j.lastcheckedtime; INCLUDE renderDateTime timestamp = j.lastcheckedtime; ELSE; "-"; END %][% successrate FILTER format('%d') %]% [% IF j.get_column('nrsucceeded') > 0 %] [% j.get_column('nrsucceeded') %] [% END %] [% IF j.get_column('nrfailed') > 0 %] [% j.get_column('nrfailed') %] [% END %] [% IF j.get_column('nrscheduled') > 0 %] [% j.get_column('nrscheduled') %] [% END %]
    [% END; BLOCK includeFlot %] [% END; BLOCK createChart %]
    [% END; BLOCK renderMachineName; machine ? stripSSHUser(machine).match('^(([^\.]|\.[0-9])*)').0 : "localhost"; END; %]