Split viewing and editing a jobset
[?]
Feb 21, 2013, 1:33 AM
OX6NYJDVCDX2UCJ4QQMTRJVZ535NOMCJGYCHDLCADJPQI7RMCXPQCDependencies
- [2]
A6XVP6FEMake the hide/unhide actions a checkbox in the project settings - [3]
ELABMHJI* hydra: layout changes - [4]
4WZQW2N6Fix indentation and get rid of some unnecessary whitespace in the output - [5]
OEPUOUNBUsing twitter bootstrap for more consistent looks for Hydra - [6]
ZI535LI6* hydra: 'new' UI for project/jobset/job/build - [7]
JY7BXXOPSplit viewing and editing a project - [8]
2PKJFUTHremove unintentional committed line - [9]
G4X5IUYJRemove default logo, replaced by text for now. Hide template in jobset edit. - [10]
RWFCW6ZNIn the jobset evals lists, show what inputs changed between consecutive evals - [11]
6UESWI2QEnsure that the first tab is selected - [12]
IE3SRMWZ* Show global and per-project statistics. - [13]
ADP54EI4Fix the spacing around some <h3> headers - [14]
JARRBLZDBootstrapify the Hydra forms (except the project and jobset edit pages) - [15]
6KIJX24RGet rid of unnecessary [%- and -%] tags - [16]
QL55ECJ6- adapted ui for hydra, more in line with nixos.org website - [17]
ZWCTAZGLadded newsitems, added some admin options to clear various caches. - [18]
UMFB2767Hydra/64: Leaving number of builds empty gives DBIx error - [19]
MHX5I2GCremove delete jobset button until we actually have implemented the action properly - [20]
3U3CXCDWNicer link to the rest of the jobset evals - [21]
RO7REZL3Remove unnecessary Javascript code - [22]
ODNCGFQ5* Improved the navigation bar: don't include all projects (since that - [23]
Q4VDOA76Replace last 5 builds on jobset page with last 5 evaluations. Moved hide/unhide and evaluate options to jobset topmenu. - [24]
3PNG7NIBRemove trailing whitespace - [25]
6QRHXIM3* Speed up the jobset index page. Especially the query to get the - [26]
CVWQXYKMuse newer icons consistently - [27]
TJPIS3UPhydra: minor improvements in hydra ui - [28]
KG5AMUMGCleanup - [29]
C6ENW2KXAdd time to evaluation error tab. Fixes #21. - [30]
PMNWRTGJAdd multiple output support - [31]
PZL3SZM3Give every page a consistent title - [32]
OOQ2D3KC* Refactoring: move fetchInput out of hydra_scheduler into a separate - [33]
VS3OUK7Dif no emailoverride specified, use empty string - [34]
FGQPXZIXhydra: make nr of build to keep configurable per jobset - [35]
FYO6NECEhydra - [36]
4D4U5IPY* Allow jobsets to be disabled. - [*]
3HZY24CX* Make jobsets viewable under - [*]
FPK5LF53* Put the project-related actions in a separate controller. Put the - [*]
IK53RV4V - [*]
D5QIOJGP* Move everything up one directory.
Change contents
- replacement in src/lib/Hydra/Controller/Jobset.pm at line 118
$c->stash->{template} = 'jobset.tt';$c->stash->{template} = 'edit-jobset.tt'; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 238
, enabled => trim($c->request->params->{enabled}) eq "1" ? 1 : 0, enableemail => trim($c->request->params->{enableemail}) eq "1" ? 1 : 0, enabled => defined $c->request->params->{enabled} ? 1 : 0, enableemail => defined $c->request->params->{enableemail} ? 1 : 0 - replacement in src/lib/Hydra/Controller/Project.pm at line 113
$c->stash->{template} = 'jobset.tt';$c->stash->{template} = 'edit-jobset.tt'; - edit in src/root/common.tt at line 196[3.3799]→[3.3799:3804](∅→∅),[3.3804]→[3.6948:6949](∅→∅),[3.6948]→[3.6948:6949](∅→∅),[3.3350]→[3.7078:7079](∅→∅),[3.7078]→[3.7078:7079](∅→∅),[3.7079]→[3.3805:4008](∅→∅)
END;BLOCK maybeButton;IF uri %]<a class="btn btn-mini" [% HTML.attributes(href => uri); IF confirmmsg %]onclick="javascript:return confirm('[% confirmmsg %]')"[% END; content %]</a>[% ELSE; content; END; - edit in src/root/common.tt at line 221[3.4117]→[3.4117:4129](∅→∅),[3.4129]→[3.7462:7464](∅→∅),[3.7462]→[3.7462:7464](∅→∅),[3.7464]→[3.4130:4153](∅→∅),[3.4153]→[3.3584:3597](∅→∅),[3.7490]→[3.3584:3597](∅→∅),[3.3597]→[3.7504:7663](∅→∅),[3.7504]→[3.7504:7663](∅→∅)
END;END;BLOCK maybeEditString;IF edit %]<input type="text" class="string [% extraClass %]" [% HTML.attributes(id => param, name => param, value => value) %] />[% ELSE;HTML.escape(value); - replacement in src/root/common.tt at line 225
BLOCK editString;IF edit %]<input type="text" class="string" [% HTML.attributes(id => param, name => param, value => value) %] />[% ELSE;HTML.escape(value);END;BLOCK editString; %]<input type="text" class="string" [% HTML.attributes(id => param, name => param, value => value) %] /> - file addition: edit-jobset.tt[41.1486]
[% WRAPPER layout.tt title=(create ? "Create jobset in project $project.name" : "Editing jobset $project.name:$jobset.name") %][% PROCESS common.tt %][% BLOCK renderInputAlt %]<button type="button" class="btn btn-warning" onclick='$(this).parents(".inputalt").remove()'><i class="icon-trash icon-white"></i></button><input type="text" [% HTML.attributes(value => alt.value, name => name) %]></input><br />[% END %][% BLOCK renderInput %]<tr class="input [% extraClass %]" [% IF id %]id="[% id %]"[% END %]><td><button type="button" class="btn btn-warning" onclick='$(this).parents(".input").remove()'><i class="icon-trash icon-white"></i></button><tt><input type="text" name="[% baseName %]-name" [% HTML.attributes(value => input.name) %]></input></td><td>[% INCLUDE renderSelection curValue=input.type param="$baseName-type" options=inputTypes %]</td><td class="inputalts" id="[% baseName %]">[% FOREACH alt IN input.jobsetinputalts %]<span class="inputalt">[% INCLUDE renderInputAlt alt=alt name="$baseName-values" %]</span>[% END %][% IF edit %]<button type="button" class="add-inputalt btn btn-success" onclick='return false'><i class="icon-plus icon-white"></i></button>[% END %]</td></tr>[% END %][% BLOCK renderInputs %]<table class="table table-striped table-condensed"><thead><tr><th>Input name</th><th>Type</th><th>Values</th></tr></thead><tbody class="inputs">[% FOREACH input IN jobset.jobsetinputs %][% INCLUDE renderInput input=input baseName="input-$input.name" %][% END %]<tr><td colspan="3" style="text-align: center;"><button type="button" class="add-input btn btn-success"><i class="icon-plus icon-white"></i> Add a new input</button></td</tr></tbody></table>[% END %]<form class="form-horizontal" action="[% IF create %][% c.uri_for('/project' project.name 'create-jobset/submit') %][% ELSE %][% c.uri_for('/jobset' project.name jobset.name 'submit') %][% END %]" method="post"><fieldset><div class="control-group"><div class="controls"><label class="checkbox"><input type="checkbox" name="enabled" [% IF jobset.enabled; 'checked="checked"'; END %]></input>Enabled</label></div></div><div class="control-group"><label class="control-label">Identifier</label><div class="controls"><input type="text" class="span3" name="name" [% HTML.attributes(value => jobset.name) %]></input></div></div><div class="control-group"><label class="control-label">Description</label><div class="controls"><input type="text" class="span3" name="description" [% HTML.attributes(value => jobset.description) %]></input></div></div><div class="control-group"><label class="control-label">Nix expression</label><div class="controls"><input type="text" class="span3" name="nixexprpath" [% HTML.attributes(value => jobset.nixexprpath) %]></input>in<input type="text" class="span3" name="nixexprinput" [% HTML.attributes(value => jobset.nixexprinput) %]></input></div></div><div class="control-group"><div class="controls"><label class="checkbox"><input type="checkbox" name="enableemail" [% IF jobset.enableemail; 'checked="checked"'; END %]></input>Email notification</label></div></div><div class="control-group"><label class="control-label">Email override</label><div class="controls"><input type="text" class="span3" name="emailoverride" [% HTML.attributes(value => jobset.emailoverride) %]></input></div></div><div class="control-group"><label class="control-label">Number of builds to keep</label><div class="controls"><input type="number" class="span3" name="keepnr" [% HTML.attributes(value => jobset.keepnr) %]></input></div></div>[% INCLUDE renderInputs %]<div class="form-actions"><button type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> [%IF create %]Create[% ELSE %]Apply changes[% END %]</button></div></fieldset><table class="hidden">[% INCLUDE renderInput input="" extraClass="template" id="input-template" baseName="input-template" %]</table><tt class="inputalt hidden" id="inputalt-template">[% INCLUDE renderInputAlt alt=alt %]</tt><script type="text/javascript">$(document).ready(function() {var id = 0;$(".add-input").click(function() {var newid = "input-" + id++;var x = $("#input-template").clone(true).attr("id", "").insertBefore($(this).parents("tr")).show();$("#input-template-name", x).attr("name", newid + "-name");$("#input-template-type", x).attr("name", newid + "-type");$("#input-template", x).attr("id", newid);return false;});$(".add-inputalt").click(function() {var x = $("#inputalt-template").clone(true).insertBefore($(this)).attr("id", "").show();$("input", x).attr("name", x.parents(".inputalts").attr("id") + "-values");});});</script></form>[% END %] - replacement in src/root/edit-project.tt at line 11
<input type="checkbox" name="enabled" value="enabled" [% IF project.enabled; 'checked="checked"'; END %]></input>Enabled<input type="checkbox" name="enabled" [% IF project.enabled; 'checked="checked"'; END %]></input>Enabled - replacement in src/root/edit-project.tt at line 16
<input type="checkbox" name="visible" value="visible" [% IF !project.hidden; 'checked="checked"'; END %]></input>Visible in the list of projects<input type="checkbox" name="visible" [% IF !project.hidden; 'checked="checked"'; END %]></input>Visible in the list of projects - replacement in src/root/jobset.tt at line 1
[% WRAPPER layout.tt title=(edit ? (create ? "Create jobset in project $project.name" : "Editing jobset $project.name:$jobset.name") : "Jobset $project.name:$jobset.name") %][% WRAPPER layout.tt title="Jobset $project.name:$jobset.name" %] - edit in src/root/jobset.tt at line 3[3.8625]→[3.8625:8640](∅→∅),[3.8640]→[3.7497:7711](∅→∅),[3.7711]→[3.8830:8840](∅→∅),[3.8830]→[3.8830:8840](∅→∅)
[% IF edit %]<form class="form-horizontal" action="[% IF create %][% c.uri_for('/project' project.name 'create-jobset/submit') %][% ELSE %][% c.uri_for('/jobset' project.name jobset.name 'submit') %][% END %]" method="post">[% END %] - edit in src/root/jobset.tt at line 5[3.9006]→[3.9006:9049](∅→∅),[3.9049]→[3.7712:7857](∅→∅),[3.7857]→[3.9192:9254](∅→∅),[3.9192]→[3.9192:9254](∅→∅),[3.9254]→[3.23917:23928](∅→∅),[3.23928]→[3.9267:9366](∅→∅),[3.9267]→[3.9267:9366](∅→∅)
[% BLOCK renderInputAlt %][% IF edit %]<button type="button" class="btn btn-warning" onclick='$(this).parents(".inputalt").remove()'><i class="icon-trash icon-white"></i></button>[% INCLUDE maybeEditString param=param value=alt.value %]<br />[% ELSE %][% INCLUDE maybeEditString param=param value=alt.value %][% END %][% END %] - edit in src/root/jobset.tt at line 6
- replacement in src/root/jobset.tt at line 8
[% IF edit %]<button type="button" class="btn btn-warning" onclick='$(this).parents(".input").remove()'><i class="icon-trash icon-white"></i></button>[% END %]<tt>[% INCLUDE maybeEditString param="$baseName-name" value=input.name %]</tt><tt>[% HTML.escape(input.name) %]</tt> - replacement in src/root/jobset.tt at line 16
[% IF input.type == "string" && !edit %][% IF input.type == "string" %] - replacement in src/root/jobset.tt at line 19
[% INCLUDE renderInputAlt alt=alt param="$baseName-values" %][% HTML.escape(alt.value) %] - edit in src/root/jobset.tt at line 23
[% IF edit %]<button type="button" class="add-inputalt btn btn-success" onclick='return false'><i class="icon-plus icon-white"></i></button>[% END %] - edit in src/root/jobset.tt at line 25
- replacement in src/root/jobset.tt at line 29[3.19568]→[3.23929:24213](∅→∅),[3.24213]→[3.5593:5656](∅→∅),[3.5656]→[3.24277:24758](∅→∅),[3.24277]→[3.24277:24758](∅→∅),[3.20058]→[3.10518:10519](∅→∅),[3.24758]→[3.10518:10519](∅→∅),[3.10518]→[3.10518:10519](∅→∅)
<h3>Inputs</h3><table class="tablesorter table table-striped table-condensed"><thead><tr><th>Input name</th><th>Type</th><th>Values</th></tr></thead><tbody class="inputs">[% FOREACH input IN jobset.jobsetinputs %][% INCLUDE renderInput input=input baseName="input-$input.name" %][% END %][% IF edit %]<tr><td colspan="3" style="text-align: center;"><button type="button" class="add-input btn btn-success"><i class="icon-plus icon-white"></i> Add a new input</button></td></tr>[% END %]</tbody></table><h3>Inputs</h3><table class="tablesorter table table-striped table-condensed"><thead><tr><th>Input name</th><th>Type</th><th>Values</th></tr></thead><tbody class="inputs">[% FOREACH input IN jobset.jobsetinputs %][% INCLUDE renderInput input=input baseName="input-$input.name" %][% END %]</tbody></table> - replacement in src/root/jobset.tt at line 43[3.11583]→[3.256:290](∅→∅),[3.290]→[3.5657:5688](∅→∅),[3.24802]→[3.5657:5688](∅→∅),[3.5688]→[3.291:396](∅→∅),[3.396]→[3.5689:5852](∅→∅),[3.24924]→[3.5689:5852](∅→∅),[3.5852]→[3.25088:25308](∅→∅),[3.25088]→[3.25088:25308](∅→∅)
<ul class="nav nav-tabs">[% IF !edit %]<li class="active"><a href="#tabs-information" data-toggle="tab">Jobset</a></li>[% IF jobset.errormsg %]<li><a href="#tabs-errors" data-toggle="tab"><img src="/static/images/error_16.png" /> Evaluation errors</a></li>[% END %]<li><a href="#tabs-jobs" data-toggle="tab">Jobs ([% activeJobs.size %])</a></li>[% END %]<li><a href="#tabs-setup" data-toggle="tab">Setup</a></li></ul><ul class="nav nav-tabs"><li class="active"><a href="#tabs-information" data-toggle="tab">Jobset</a></li>[% IF jobset.errormsg %]<li><a href="#tabs-errors" data-toggle="tab"><img src="/static/images/error_16.png" /> Evaluation errors</a></li>[% END %]<li><a href="#tabs-jobs" data-toggle="tab">Jobs ([% activeJobs.size %])</a></li><li><a href="#tabs-setup" data-toggle="tab">Configuration</a></li></ul> - edit in src/root/jobset.tt at line 53[3.5282]→[3.25310:25370](∅→∅),[3.25370]→[3.5853:5904](∅→∅),[3.1104]→[3.105:158](∅→∅),[3.5904]→[3.105:158](∅→∅),[3.25422]→[3.105:158](∅→∅),[3.105]→[3.105:158](∅→∅),[3.158]→[3.25423:25562](∅→∅),[3.300]→[3.413:439](∅→∅),[3.1262]→[3.413:439](∅→∅),[3.2937]→[3.413:439](∅→∅),[3.25562]→[3.413:439](∅→∅),[3.413]→[3.413:439](∅→∅),[3.439]→[3.5905:5956](∅→∅),[3.5956]→[3.25615:25870](∅→∅),[3.25615]→[3.25615:25870](∅→∅),[3.25870]→[3.20895:20925](∅→∅),[3.20895]→[3.20895:20925](∅→∅),[3.20925]→[3.25871:25931](∅→∅),[3.25931]→[3.5957:6035](∅→∅),[3.6035]→[3.26010:26200](∅→∅),[3.26010]→[3.26010:26200](∅→∅),[3.26200]→[3.21196:21308](∅→∅),[3.21196]→[3.21196:21308](∅→∅),[3.21308]→[3.26201:26426](∅→∅),[3.26426]→[3.1485:1591](∅→∅),[3.21471]→[3.1485:1591](∅→∅),[3.1591]→[3.26427:26734](∅→∅),[3.26734]→[3.6036:6088](∅→∅),[3.6088]→[3.26787:27044](∅→∅),[3.26787]→[3.26787:27044](∅→∅)
<div id="tabs-information" class="tab-pane active">[% IF !edit && evals.size() > 0 %]<h2>Most recent evaluations</h2>[% INCLUDE renderEvals linkToAll=c.uri_for(c.controller('Jobset').action_for('evals'), [project.name, jobset.name]) %][% END %][% IF !edit && activeJobsStatus %]<h2>Status</h2><table class="table table-striped table-condensed"><thead><tr><th>Job</th>[% FOREACH s IN systems %]<th>[% s.system %]</th>[% END %]</tr></thead><tbody>[% odd = 0 %][% FOREACH j IN activeJobsStatus %]<tr class="[% IF odd %] odd [% END; odd = !odd %]"><td>[% INCLUDE renderJobName project=project.name jobset = jobset.name job = j.get_column('job') %]</td>[% FOREACH s IN systems %][% system = s.system %][% systemStatus = j.get_column(system) %]<td class="centered">[% IF systemStatus != undef %]<a href="[% c.uri_for('/build' j.get_column(system _ '-build') ) %]">[% INCLUDE renderBuildStatusIcon buildstatus=systemStatus size=16 %]</a>[% END %]</td>[% END %]</tr>[% END %]</tbody></table>[% END %][% IF !edit && !activeJobsStatus %]<h2>Status</h2><p>[ <a href="[% c.uri_for('/jobset' project.name jobset.name 'with-status' ) %]">Show status overview</a> ]</p>[% END %] - replacement in src/root/jobset.tt at line 54
</div>[% IF !edit %]<div id="tabs-information" class="tab-pane active"> - replacement in src/root/jobset.tt at line 56[3.27085]→[3.6113:6154](∅→∅),[3.6154]→[3.27127:27228](∅→∅),[3.27127]→[3.27127:27228](∅→∅),[3.27228]→[3.0:148](∅→∅),[3.89]→[3.0:148](∅→∅),[3.148]→[3.27229:27516](∅→∅)
[% IF jobset.errormsg %]<div id="tabs-errors" class="tab-pane"><h2>Evaluation errors</h2><p>Errors occurred at <tt>[% INCLUDE renderDateTime timestamp=jobset.errortime %]</tt>.</p><pre class="multiLineMsg error">[% HTML.escape(jobset.errormsg) %]</pre></div>[% END %][% END %]<div id="tabs-setup" class="tab-pane [% IF edit %]active[% END %]"><h2>Information</h2>[% IF evals.size() > 0 %]<h2>Most recent evaluations</h2>[% INCLUDE renderEvals linkToAll=c.uri_for(c.controller('Jobset').action_for('evals'), [project.name, jobset.name]) %][% END %] - replacement in src/root/jobset.tt at line 61[3.27517]→[3.27517:28197](∅→∅),[3.28197]→[3.2245:2484](∅→∅),[3.2484]→[3.28486:29228](∅→∅),[3.28486]→[3.28486:29228](∅→∅),[3.29228]→[3.528:706](∅→∅),[3.23395]→[3.528:706](∅→∅)
<table class="layoutTable">[% IF edit %]<tr><th>Identifier:</th><td>[% INCLUDE maybeEditString param="name" value=jobset.name %]</td></tr>[% END %]<tr><th>Description:</th><td>[% INCLUDE maybeEditString param="description" value=jobset.description %]</td></tr><tr><th>Nix expression:</th><td><tt>[% INCLUDE maybeEditString param="nixexprpath" value=jobset.nixexprpath %]</tt> in input<tt>[% INCLUDE maybeEditString param="nixexprinput" value=jobset.nixexprinput %]</tt></td></tr><tr><th>Enabled:</th><td>[% INCLUDE renderSelection param="enabled" curValue=jobset.enabled radiobuttons=1 options={"1" = "Yes", "0" = "No"} %]</td></tr><tr><th>Enable email notification:</th><td>[% INCLUDE renderSelection param="enableemail" curValue=jobset.enableemail radiobuttons=1 options={"1" = "Yes", "0" = "No"} %]</td></tr><tr><th>Email override:</th><td>[% INCLUDE maybeEditString param="emailoverride" value=jobset.emailoverride %][% IF activeJobsStatus %]<h2>Status</h2><table class="table table-striped table-condensed"><thead><tr><th>Job</th>[% FOREACH s IN systems %]<th>[% s.system %]</th>[% END %]</tr></thead><tbody>[% odd = 0 %][% FOREACH j IN activeJobsStatus %]<tr class="[% IF odd %] odd [% END; odd = !odd %]"><td>[% INCLUDE renderJobName project=project.name jobset = jobset.name job = j.get_column('job') %]</td>[% FOREACH s IN systems %][% system = s.system %][% systemStatus = j.get_column(system) %]<td class="centered">[% IF systemStatus != undef %]<a href="[% c.uri_for('/build' j.get_column(system _ '-build') ) %]">[% INCLUDE renderBuildStatusIcon buildstatus=systemStatus size=16 %]</a>[% END %] - replacement in src/root/jobset.tt at line 80[3.728]→[3.728:964](∅→∅),[3.964]→[3.29229:29447](∅→∅),[3.29447]→[3.6155:6298](∅→∅),[3.6298]→[3.29592:29960](∅→∅),[3.29592]→[3.29592:29960](∅→∅)
</tr><tr><th>Number of builds to keep:</th><td>[% INCLUDE maybeEditString param="keepnr" value=jobset.keepnr %]</td></tr>[% IF !edit %]<tr><th>Last checked:</th><td>[% IF jobset.lastcheckedtime %][% INCLUDE renderDateTime timestamp = jobset.lastcheckedtime %][% IF jobset.errormsg %]<em>, with errors!</em>[% ELSE %], <em>no errors</em>[% END %][% ELSE %]<em>never</em>[% END %]</td></tr>[% END %]</table>[% END %]</tr>[% END %]</tbody></table>[% ELSE %]<h2>Status</h2><p>[ <a href="[% c.uri_for('/jobset' project.name jobset.name 'with-status' ) %]">Show status overview</a> ]</p>[% END %] - edit in src/root/jobset.tt at line 92
</div> - replacement in src/root/jobset.tt at line 94[3.1988]→[3.29961:30035](∅→∅),[3.30035]→[3.6299:6322](∅→∅),[3.6322]→[3.30059:30113](∅→∅),[3.30059]→[3.30059:30113](∅→∅)
[% INCLUDE renderInputs %]</div>[% IF !edit %]<div id="tabs-jobs" class="tab-pane">[% IF jobset.errormsg %]<div id="tabs-errors" class="tab-pane"><h2>Evaluation errors</h2><p>Errors occurred at <tt>[% INCLUDE renderDateTime timestamp=jobset.errortime %]</tt>.</p><pre class="multiLineMsg error">[% HTML.escape(jobset.errormsg) %]</pre></div>[% END %] - replacement in src/root/jobset.tt at line 104
<h2>Jobs</h2><div id="tabs-setup" class="tab-pane"><h2>Information</h2> - replacement in src/root/jobset.tt at line 107
<p>This jobset currently contains the following [% activeJobs.size %] jobs:<table class="layoutTable"><tr><th>Description:</th><td>[% HTML.escape(jobset.description) %]</td></tr><tr><th>Nix expression:</th><td><tt>[% HTML.escape(jobset.nixexprpath) %]</tt> in input<tt>[% HTML.escape(jobset.nixexprinput) %]</tt></td></tr><tr><th>Enabled:</th><td>[% jobset.enabled ? "Yes" : "No" %]</td></tr><tr><th>Enable email notification:</th><td>[% jobset.enableemail ? "Yes" : "No" %]</td></tr><tr><th>Email override:</th><td>[% HTML.escape(jobset.emailoverride) %]</td></tr><tr><th>Number of builds to keep:</th><td>[% jobset.keepnr %]</td></tr><tr><th>Last checked:</th><td>[% IF jobset.lastcheckedtime %][% INCLUDE renderDateTime timestamp = jobset.lastcheckedtime %][% IF jobset.errormsg %]<em>, with errors!</em>[% ELSE %], <em>no errors</em>[% END %][% ELSE %]<em>never</em>[% END %]</td></tr></table> - replacement in src/root/jobset.tt at line 147[3.30254]→[3.30254:30375](∅→∅),[3.30375]→[3.15023:15168](∅→∅),[3.15168]→[3.30517:30586](∅→∅),[3.30517]→[3.30517:30586](∅→∅)
<blockquote>[% IF activeJobs.size == 0 %]<em>(none)</em>[% END %][% FOREACH j IN activeJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]</blockquote></p>[% INCLUDE renderInputs %]</div> - replacement in src/root/jobset.tt at line 150
<p>This jobset used to contain the following [% inactiveJobs.size %] jobs:<div id="tabs-jobs" class="tab-pane"> - replacement in src/root/jobset.tt at line 152[3.30687]→[3.30687:30810](∅→∅),[3.30810]→[3.15169:15316](∅→∅),[3.15316]→[3.30954:30994](∅→∅),[3.30954]→[3.30954:30994](∅→∅)
<blockquote>[% IF inactiveJobs.size == 0 %]<em>(none)</em>[% END %][% FOREACH j IN inactiveJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]</blockquote><p>This jobset currently contains the following [% activeJobs.size %] jobs: - replacement in src/root/jobset.tt at line 154
</p><blockquote>[% IF activeJobs.size == 0 %]<em>(none)</em>[% END %][% FOREACH j IN activeJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]</blockquote></p> - replacement in src/root/jobset.tt at line 160
</div>[% END %]<p>This jobset used to contain the following [% inactiveJobs.size %] jobs: - replacement in src/root/jobset.tt at line 162[3.31067]→[3.25464:25471](∅→∅),[3.13218]→[3.25464:25471](∅→∅),[3.25542]→[3.13229:13244](∅→∅),[3.13229]→[3.13229:13244](∅→∅)
</div>[% IF edit %]<blockquote>[% IF inactiveJobs.size == 0 %]<em>(none)</em>[% END %][% FOREACH j IN inactiveJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]</blockquote></p> - edit in src/root/jobset.tt at line 168[3.13245]→[3.13245:13464](∅→∅),[3.13464]→[3.31115:31116](∅→∅),[3.31116]→[3.13469:14324](∅→∅),[3.13469]→[3.13469:14324](∅→∅),[3.14324]→[3.31117:31118](∅→∅),[3.31118]→[3.2413:2589](∅→∅)
<table class="template"> <!-- dummy wrapper needed because “hidden” trs are visible anyway -->[% INCLUDE renderInput input="" extraClass="template" id="input-template" baseName="input-template" %]</table><tt class="inputalt template" id="inputalt-template">[% INCLUDE renderInputAlt alt=alt %]</tt><script type="text/javascript">$(document).ready(function() {var id = 0;$(".add-input").click(function() {var newid = "input-" + id++;var x = $("#input-template").clone(true).attr("id", "").insertBefore($(this).parents("tr")).show();$("#input-template-name", x).attr("name", newid + "-name");$("#input-template-type", x).attr("name", newid + "-type");$("#input-template", x).attr("id", newid);return false;});$(".add-inputalt").click(function() {var x = $("#inputalt-template").clone(true).insertBefore($(this)).attr("id", "").show();$("input", x).attr("name", x.parents(".inputalts").attr("id") + "-values");});});</script><div class="form-actions"><button type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> [%IF create %]Create[% ELSE %]Apply changes[% END %]</button> - replacement in src/root/jobset.tt at line 170
</form></div> - edit in src/root/jobset.tt at line 173
[% END %]