summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuha Sippola <juhasippola@outlook.com>2015-07-10 15:26:43 +0300
committerTony Sarajärvi <tony.sarajarvi@theqtcompany.com>2015-09-16 07:33:16 +0000
commitdf7883117aa258b151c1306d72d66e9ff27044f1 (patch)
treedd9fb1eec834493d5193c7edc1c952e9dcbfaca5
parentda4eb7097114910476102b48d5586b02fabc02ea (diff)
Qt Metrics 2 (v0.12.2): HTML minification
Manually minified the template html files by removing the leading spaces on rows. New lines and Twig script indent still kept for readability. Light minification to the css file. Change-Id: Ia9ea85bff90b5606935822df3a64ff3775d47d55 Reviewed-by: Tony Sarajärvi <tony.sarajarvi@theqtcompany.com>
-rw-r--r--non-puppet/qtmetrics2/styles/qtmetrics.css106
-rw-r--r--non-puppet/qtmetrics2/templates/about.html6
-rw-r--r--non-puppet/qtmetrics2/templates/build_project.html620
-rw-r--r--non-puppet/qtmetrics2/templates/footer.html42
-rw-r--r--non-puppet/qtmetrics2/templates/header.html181
-rw-r--r--non-puppet/qtmetrics2/templates/home.html184
-rw-r--r--non-puppet/qtmetrics2/templates/overview.html357
-rw-r--r--non-puppet/qtmetrics2/templates/testset.html604
-rw-r--r--non-puppet/qtmetrics2/templates/testset_project.html568
-rw-r--r--non-puppet/qtmetrics2/templates/testsets_flaky.html188
-rw-r--r--non-puppet/qtmetrics2/templates/testsets_top.html226
11 files changed, 1511 insertions, 1571 deletions
diff --git a/non-puppet/qtmetrics2/styles/qtmetrics.css b/non-puppet/qtmetrics2/styles/qtmetrics.css
index 18986ca..97a3ad6 100644
--- a/non-puppet/qtmetrics2/styles/qtmetrics.css
+++ b/non-puppet/qtmetrics2/styles/qtmetrics.css
@@ -35,171 +35,149 @@
/**
* Qt Metrics style sheet
- * @version 0.3
- * @since 08-07-2015
+ * @version 0.4
+ * @since 10-07-2015
* @author Juha Sippola
*/
/*
* Brand logo and text alignment
*/
-
.navbar-brand img {
- height: 30px;
- width: auto;
+ height: 30px;
+ width: auto;
}
/*
* Load home page image (from www.qt.io) with text color adjustments in tablets and bigger devices only (typically using faster connection)
*/
-
@media screen and (min-width: 768px) {
- .jumbotron {
- background-image: url("https://d3hp9ud7yvwzy0.cloudfront.net/wp-content/uploads/2014/06/Qt-in-nutshell-hero2.jpg");
- background-size: cover;
- }
- .jumbotron h1 {
- color: black;
- text-shadow: 0 0 8px white;
- }
+ .jumbotron {
+ background-image: url("https://d3hp9ud7yvwzy0.cloudfront.net/wp-content/uploads/2014/06/Qt-in-nutshell-hero2.jpg");
+ background-size: cover;
+ }
+ .jumbotron h1 {
+ color: black;
+ text-shadow: 0 0 8px white;
+ }
}
/*
* The master version on home page
*/
-
.masterVersion {
- color: forestgreen;
- text-shadow: 0 0 8px black;
+ color: forestgreen;
+ text-shadow: 0 0 8px black;
}
/*
* Include UI elements and behavior in tablets and bigger devices only (typically using faster connection)
*/
-
@media screen and (max-width: 768px) {
- .showInLargeDisplay {
- display: none;
- }
+ .showInLargeDisplay {
+ display: none;
+ }
}
/*
* Make space between buttons next to and above each others
*/
-
.btn {
- margin: 0 3px 3px 0;
+ margin: 0 3px 3px 0;
}
/*
* Make the tooltip align left, respect new lines and prevent text from wrapping
*/
.tooltip-inner {
- text-align: left;
- white-space: pre;
- max-width: none;
- background-color: #12293E;
+ text-align: left;
+ white-space: pre;
+ max-width: none;
+ background-color: #12293E;
}
/*
* Make space horizontally outside an element
*/
-
.spaceHorizontal {
- margin: 0 5px 0 5px;
+ margin: 0 5px 0 5px;
}
/*
* Animation shown while loading a page from a link
*/
-
#link_loading {
- position: relative;
- left: 10px;
- top: 18px;
- width: 60px;
+ position: relative;
+ left: 10px;
+ top: 18px;
+ width: 60px;
}
-
#link_loading .progress-bar {
- width: 100%;
+ width: 100%;
}
/*
* Animation shown while loading data in autocomplete input field
*/
-
.ui-autocomplete-loading {
- background: white url("../images/ui-anim_basic_16x16.gif") right center no-repeat;
+ background: white url("../images/ui-anim_basic_16x16.gif") right center no-repeat;
}
/*
* Autocomplete input field
*/
-
.ui-autocomplete.ui-menu {
- font-size: 12px;
+ font-size: 12px;
}
/*
* Metrics page description well
*/
-
.infoWell{
- background: lightblue;
+ background: lightblue;
}
/*
* Table formatting
*/
-
.leftBorder {
- border-left: 2px solid lightgrey;
+ border-left: 2px solid lightgrey;
}
-
.rightBorder {
- border-right: 2px solid lightgrey;
+ border-right: 2px solid lightgrey;
}
-
.center {
- text-align: center
+ text-align: center
}
/*
* Coloring
*/
-
.green {
- color: green;
+ color: green;
}
-
.red {
- color: red;
+ color: red;
}
-
.gray {
- color: gray;
+ color: gray;
}
-
.greenBackground {
- background-color: lightgreen;
+ background-color: lightgreen;
}
-
.redBackground {
- background-color: indianred;
+ background-color: indianred;
}
/*
* Placing and sizing
*/
-
.floatLeft {
- float: left;
+ float: left;
}
-
.textSmall {
- font-size: small;
+ font-size: small;
}
-
.bold {
- font-weight: bold;
+ font-weight: bold;
}
diff --git a/non-puppet/qtmetrics2/templates/about.html b/non-puppet/qtmetrics2/templates/about.html
index 6eb59c8..245bf8f 100644
--- a/non-puppet/qtmetrics2/templates/about.html
+++ b/non-puppet/qtmetrics2/templates/about.html
@@ -34,8 +34,8 @@
/**
* About window content
- * @version 0.12.1
- * @since 09-07-2015
+ * @version 0.12.2
+ * @since 10-07-2015
* @author Juha Sippola
*/
@@ -44,4 +44,4 @@
<p>This is Qt Metrics revision 2 with redesigned UI and database.</p>
<p>These pages are still <strong>under construction</strong> and therefore the views and functionality is limited.</p>
<p>See the <a href="https://wiki.qt.io/Qt_Metrics_2_Backlog" target="_blank">backlog</a> for development items currently identified or in progress.</p>
-<p><small>Version 0.12.1 (09-Jul-2015)</small></p>
+<p><small>Version 0.12.2 (10-Jul-2015)</small></p>
diff --git a/non-puppet/qtmetrics2/templates/build_project.html b/non-puppet/qtmetrics2/templates/build_project.html
index e264493..c2fe11c 100644
--- a/non-puppet/qtmetrics2/templates/build_project.html
+++ b/non-puppet/qtmetrics2/templates/build_project.html
@@ -34,8 +34,8 @@
/**
* Build project page
- * @version 0.2
- * @since 01-07-2015
+ * @version 0.3
+ * @since 10-07-2015
* @author Juha Sippola
*/
@@ -59,326 +59,308 @@
#}
<ol class="breadcrumb">
- {% for link in breadcrumb %}
- <li><a href="{{ link.link }}">{{ link.name }}</a></li>
- {% endfor %}
- {% if targetOs == '' and conf == '' %}
- <li class="active">{{ project.getName }}</li>
- {% elseif targetOs != '' %}
- <li class="active">{{ targetOs }}</li>
- {% elseif conf != '' %}
- <li class="active">{{ conf }}</li>
- {% endif %}
+{% for link in breadcrumb %}
+<li><a href="{{ link.link }}">{{ link.name }}</a></li>
+{% endfor %}
+{% if targetOs == '' and conf == '' %}
+<li class="active">{{ project.getName }}</li>
+{% elseif targetOs != '' %}
+<li class="active">{{ targetOs }}</li>
+{% elseif conf != '' %}
+<li class="active">{{ conf }}</li>
+{% endif %}
</ol>
<div class="container-fluid">
- <div class="row">
-
- <div class="col-sm-12 col-md-12 main">
-
- {# Check if any runs available #}
- {% set runsAvailable = 0 %}
- {% for run in latestProjectRuns %}
- {% set runsAvailable = 1 %}
- {% endfor %}
-
- {##### Title #####}
-
- <h1 class="page-header">
- {{ project.getName }}
- <button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
- <span class="glyphicon glyphicon-info-sign"></span>
- </button>
- <small>{{ refreshed }}</small>
- </h1>
-
- {##### Platform buttons #####}
-
- <div>
- {% for platform in platforms %}
- {% if platform.os == targetOs %}
- {% set buttonStyle = 'btn-primary' %}
- {% else %}
- {% set buttonStyle = 'btn-default' %}
- {% endif %}
- <div class="btn-group">
- <a class="btn {{ buttonStyle }} btn-xs" href="{{ platformRoute }}/{{ platform.os }}" role="button">{{ platform.os }}</a>
- </div>
- {% endfor %}
- {% if conf != '' %}
- {% set link = confRoute ~ '/' ~ conf|url_encode %}
- <div class="btn-group">
- <a class="btn btn-info btn-xs" href="{{ link }}" role="button">{{ conf }}</a>
- </div>
- {% endif %}
- </div>
- <hr>
-
- {##### Info well #####}
-
- <div class="collapse" id="info">
- <div class="well infoWell">
- <span class="glyphicon glyphicon-info-sign"></span> <strong>Build Project</strong><br>
- <ul>
- <li>In <strong>Latest Status</strong>, the <strong>latest result</strong> shows the overall project status based on the
- latest <strong>{{ masterProject }} {{ masterState }}</strong> builds across all branches,
- and the <strong>branch</strong> results across all configurations (both show failed if failed
- in one or in several builds).</li>
- <li><strong>Results in Branches</strong> shows the {{ project.getName }} run results by branch
- and their configuration on <strong>{{ masterProject }} {{ masterState }}</strong> builds
- (<span class="glyphicon glyphicon-ok green"></span> = {{ constant('ConfRun::RESULT_SUCCESS') }},
- <span class="glyphicon glyphicon-ok-sign green"></span> = {{ constant('ConfRun::RESULT_SUCCESS') }} as forcesuccess,
- <span class="glyphicon glyphicon-remove red"></span> = {{ constant('ConfRun::RESULT_FAILURE') }},
- <span class="glyphicon glyphicon-ban-circle gray"></span> = {{ constant('ConfRun::RESULT_UNDEF') }});
- details on the runs are available as tooltip on result icon.</li>
- </ul>
- </div>
- </div>
-
- {% if runsAvailable %}
-
- {##### Latest Status #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Latest Status</h4>
- </div>
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th>project</th>
- <th class="rightBorder">latest result</th>
- {% for branch in latestProjectRuns %}
- <th class="center">{{ branch.name }}</th>
- {% endfor %}
- </tr>
- </thead>
- <tbody>
- <tr>
- {# Project name #}
- <td>{{ project.getName }}</td>
-
- {# Testset status according to the latest build results #}
- {% if project.getStatus == constant('ConfRun::RESULT_SUCCESS') %}
- {% set resultIcon = 'glyphicon glyphicon-ok green' %}
- {% elseif project.getStatus == constant('ConfRun::RESULT_FAILURE') %}
- {% set resultIcon = 'glyphicon glyphicon-remove red' %}
- {% else %}
- {% set resultIcon = '' %}
- {% endif %}
- <td class="rightBorder"><span class="spaceHorizontal {{ resultIcon }}"></span>{{ project.getStatus }}</td>
-
- {# Result (by branch) #}
- {% for run in latestProjectRuns %}
- {% if run.result == constant('ConfRun::RESULT_SUCCESS') %}
- {% set resultIcon = 'glyphicon glyphicon-ok green' %}
- {% elseif run.result == constant('ConfRun::RESULT_FAILURE') %}
- {% set resultIcon = 'glyphicon glyphicon-remove red' %}
- {% else %}
- {% set resultIcon = 'glyphicon glyphicon-ban-circle gray' %}
- {% endif %}
- <td class="center">
- <span class="spaceHorizontal {{ resultIcon }} clickOnTouch"
- data-toggle="tooltip" data-placement="top" data-html="true"
- title="<table>
- <tr><th>Branch: </td><td>{{ run.name }}</td></tr>
- <tr><th>Build key: </td><td>{{ run.buildKey }}</td></tr>
- <tr><th>Timestamp: </td><td>{{ run.timestamp }}</td></tr>
- <tr><th>Result: </td><td>{{ run.result }}</td></tr>
- <tr><th>Duration: </td><td>{{ run.duration}}</td></tr>
- </table>">
- </span>
- </td>
- {% endfor %}
- </tr>
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
-
- {##### Results in Branches #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Results in Branches</h4>
- </div>
- </div>
-
- {# Get branches #}
- {% set branches = [] %}
- {% for run in projectBuilds %}
- {% if run.branch not in branches %}
- {% set branches = branches|merge([run.branch]) %}
- {% endif %}
- {% endfor %}
-
- {# Loop all the branches #}
- {% for branch in branches %}
-
- {# Get all build keys #}
- {% set buildKey = '' %}
- {% set buildKeys = [] %}
- {% set dates = [] %}
- {% for run in projectBuilds %}
- {% if run.branch == branch %}
- {% if buildKey != run.buildKey %}
- {% set buildKey = run.buildKey %}
- {% set buildKeys = buildKeys|merge([run.buildKey]) %}
- {% set dates = dates|merge([run.timestamp]) %}
- {% endif %}
- {% endif %}
- {% endfor %}
-
- {# Check if conf run for this branch #}
- {% set confBranch = 0 %}
- {% for run in confRuns if run.getBranchName == branch %}
- {% set confBranch = 1 %}
- {% endfor %}
-
- {# Show branch if conf run for it #}
- {% if confBranch %}
- <div class="panel panel-info">
- <div class="panel-heading">
- <h4 class="panel-title bold">{{ branch }}</h4>
- </div>
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th class="bold rightBorder">{{ project.getName }}</th>
- {% for key, buildKey in buildKeys %}
- <th class="center">
- {% if buildKey|length > 6 %}
- <span class="clickOnTouch" data-toggle="tooltip" data-placement="top"
- title="{{ buildKey }}">{{ buildKey|slice(0, 4) }}...
- </span>
- {% else %}
- {{ buildKey }}
- {% endif %}
- <br>
- <span class="gray"><small>{{ dates[key]|date("m-d") }}</small></span>
- </th>
- {% endfor %}
- </tr>
- </thead>
- <tbody>
- {% set confPrev = '' %}
- {% set buildKeyIndexPrinted = -1 %}
- {% set buildKeyFound = 0 %}
- {% for run in confRuns if run.getBranchName == branch %}
-
- {# New row for each conf #}
- {% if confPrev != run.getName %}
- {# Close previous row #}
- {% if confPrev != '' %}
- {# Fill empty cells at the end of the row #}
- {% for key, buildKey in buildKeys %}
- {% if key > buildKeyIndexPrinted %}
- <td></td>
- {% endif %}
- {% endfor %}
- </tr>
- {% endif %}
- <tr>
- {% if conf == '' %}
- {% set link = confRoute ~ '/' ~ run.getName|url_encode %}
- {% set tooltip = 'click to filter this configuration' %}
- <td class="rightBorder">
- <a href="{{ link }}">
- <small>
- <span data-toggle="tooltip" data-placement="top" title="{{ tooltip }}">
- {{ run.getName }}
- </span>
- </small>
- </a>
- </td>
- {% else %}
- <td class="rightBorder">
- <small>
- {{ run.getName }}
- </small>
- </td>
- {% endif %}
- {% set buildKeyIndexPrinted = -1 %}
- {% endif %}
-
- {# Result per build key #}
- {% set buildKeyFound = 0 %}
- {% for key, buildKey in buildKeys %}
- {# Print each column only once (checked based on column index key and buildKeyFound flag) #}
- {% if key > buildKeyIndexPrinted and not buildKeyFound %}
- {% if buildKey == run.getBuildKey %}
- {# Print result #}
- {% set forcesuccess = '' %}
- {% if run.getResult == constant('ConfRun::RESULT_SUCCESS') %}
- {% if run.getForcesuccess == 0 %}
- {% set resultIcon = 'glyphicon glyphicon-ok green' %}
- {% else %}
- {# Forcesuccess #}
- {% set resultIcon = 'glyphicon glyphicon-ok-sign green' %}
- {% set forcesuccess = ' (as forcesuccess)' %}
- {% endif %}
- {% elseif run.getResult == constant('ConfRun::RESULT_FAILURE') %}
- {% set resultIcon = 'glyphicon glyphicon-remove red' %}
- {% elseif run.getResult == constant('ConfRun::RESULT_UNDEF') %}
- {% set resultIcon = 'glyphicon glyphicon-ban-circle gray' %}
- {% else %}
- {% set resultIcon = '' %}
- {% endif %}
- <td class="center">
- <span class="spaceHorizontal {{ resultIcon }} clickOnTouch"
- data-toggle="tooltip" data-placement="top" data-html="true"
- title="<table>
- <tr><th>Build key: </th><td>{{ buildKey }}</td></tr>
- <tr><th>Configuration: </th><td>{{ run.getName }}</td></tr>
- <tr><th>Timestamp: </th><td>{{ run.getTimestamp }}</td></tr>
- <tr><th>Result: </th><td>{{ run.getResult }} {{ forcesuccess }}</td></tr>
- <tr><th>Duration: </th><td>{{ run.getDuration }}</td></tr>
- <tr><th>Forcesuccess: </th><td>{% if run.getForcesuccess %}yes{% else %}no{% endif %}</td></tr>
- <tr><th>Insignificant: </th><td>{% if run.getInsignificant %}yes{% else %}no{% endif %}</td></tr>
- </table>">
- </span>
- </td>
- {% set buildKeyFound = 1 %}
- {% else %}
- {# Print empty cell #}
- <td></td>
- {% endif %}
- {% set buildKeyIndexPrinted = key %}
- {% endif %}
- {% endfor %}
- {% set confPrev = run.getName %}
- {% endfor %}
-
- {# Close last row (also fill empty cells at the end of the row) #}
- {% for key, buildKey in buildKeys %}
- {% if key > buildKeyIndexPrinted %}
- <td></td>
- {% endif %}
- {% endfor %}
- </tr>
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
- {% endif %} {# testsetBranch #}
- {% endfor %}
-
- {% else %} {# runsAvailable #}
- <div class="alert alert-danger" role="alert">
- No build data available for project {{ project.getName }}!
- </div>
- {% endif %}
-
- </div> {# /col... #}
- </div> {# /row #}
-
-</div> {# /container-fluid #}
+<div class="row">
+
+<div class="col-sm-12 col-md-12 main">
+
+{# Check if any runs available #}
+{% set runsAvailable = 0 %}
+{% for run in latestProjectRuns %}
+{% set runsAvailable = 1 %}
+{% endfor %}
+
+{##### Title #####}
+
+<h1 class="page-header">
+{{ project.getName }}
+<button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
+<span class="glyphicon glyphicon-info-sign"></span>
+</button>
+<small>{{ refreshed }}</small>
+</h1>
+
+{##### Platform buttons #####}
+
+<div>
+{% for platform in platforms %}
+{% if platform.os == targetOs %}
+{% set buttonStyle = 'btn-primary' %}
+{% else %}
+{% set buttonStyle = 'btn-default' %}
+{% endif %}
+<div class="btn-group">
+<a class="btn {{ buttonStyle }} btn-xs" href="{{ platformRoute }}/{{ platform.os }}" role="button">{{ platform.os }}</a>
+</div>
+{% endfor %}
+{% if conf != '' %}
+{% set link = confRoute ~ '/' ~ conf|url_encode %}
+<div class="btn-group">
+<a class="btn btn-info btn-xs" href="{{ link }}" role="button">{{ conf }}</a>
+</div>
+{% endif %}
+</div>
+<hr>
+
+{##### Info well #####}
+
+<div class="collapse" id="info">
+<div class="well infoWell">
+<span class="glyphicon glyphicon-info-sign"></span> <strong>Build Project</strong><br>
+<ul>
+<li>In <strong>Latest Status</strong>, the <strong>latest result</strong> shows the overall project status based on the
+latest <strong>{{ masterProject }} {{ masterState }}</strong> builds across all branches,
+and the <strong>branch</strong> results across all configurations (both show failed if failed
+in one or in several builds).</li>
+<li><strong>Results in Branches</strong> shows the {{ project.getName }} run results by branch
+and their configuration on <strong>{{ masterProject }} {{ masterState }}</strong> builds
+(<span class="glyphicon glyphicon-ok green"></span> = {{ constant('ConfRun::RESULT_SUCCESS') }},
+<span class="glyphicon glyphicon-ok-sign green"></span> = {{ constant('ConfRun::RESULT_SUCCESS') }} as forcesuccess,
+<span class="glyphicon glyphicon-remove red"></span> = {{ constant('ConfRun::RESULT_FAILURE') }},
+<span class="glyphicon glyphicon-ban-circle gray"></span> = {{ constant('ConfRun::RESULT_UNDEF') }});
+details on the runs are available as tooltip on result icon.</li>
+</ul>
+</div>
+</div>
+
+{% if runsAvailable %}
+
+{##### Latest Status #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Latest Status</h4>
+</div>
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th>project</th>
+<th class="rightBorder">latest result</th>
+{% for branch in latestProjectRuns %}
+<th class="center">{{ branch.name }}</th>
+{% endfor %}
+</tr>
+</thead>
+<tbody>
+<tr>
+{# Project name #}
+<td>{{ project.getName }}</td>
+
+{# Testset status according to the latest build results #}
+{% if project.getStatus == constant('ConfRun::RESULT_SUCCESS') %}
+{% set resultIcon = 'glyphicon glyphicon-ok green' %}
+{% elseif project.getStatus == constant('ConfRun::RESULT_FAILURE') %}
+{% set resultIcon = 'glyphicon glyphicon-remove red' %}
+{% else %}
+{% set resultIcon = '' %}
+{% endif %}
+<td class="rightBorder"><span class="spaceHorizontal {{ resultIcon }}"></span>{{ project.getStatus }}</td>
+
+{# Result (by branch) #}
+{% for run in latestProjectRuns %}
+{% if run.result == constant('ConfRun::RESULT_SUCCESS') %}
+{% set resultIcon = 'glyphicon glyphicon-ok green' %}
+{% elseif run.result == constant('ConfRun::RESULT_FAILURE') %}
+{% set resultIcon = 'glyphicon glyphicon-remove red' %}
+{% else %}
+{% set resultIcon = 'glyphicon glyphicon-ban-circle gray' %}
+{% endif %}
+<td class="center">
+<span class="spaceHorizontal {{ resultIcon }} clickOnTouch" data-toggle="tooltip" data-placement="top" data-html="true"
+title="<table>
+<tr><th>Branch: </td><td>{{ run.name }}</td></tr>
+<tr><th>Build key: </td><td>{{ run.buildKey }}</td></tr>
+<tr><th>Timestamp: </td><td>{{ run.timestamp }}</td></tr>
+<tr><th>Result: </td><td>{{ run.result }}</td></tr>
+<tr><th>Duration: </td><td>{{ run.duration}}</td></tr></table>">
+</span></td>
+{% endfor %}{# run #}
+</tr>
+</tbody>
+</table>
+</div> {# .table-responsive #}
+</div> {# .panel-body #}
+</div> {# .panel... #}
+
+{##### Results in Branches #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Results in Branches</h4>
+</div>
+</div>
+
+{# Get branches #}
+{% set branches = [] %}
+{% for run in projectBuilds %}
+{% if run.branch not in branches %}
+{% set branches = branches|merge([run.branch]) %}
+{% endif %}
+{% endfor %}
+
+{# Loop all the branches #}
+{% for branch in branches %}
+
+{# Get all build keys #}
+{% set buildKey = '' %}
+{% set buildKeys = [] %}
+{% set dates = [] %}
+{% for run in projectBuilds %}
+{% if run.branch == branch %}
+{% if buildKey != run.buildKey %}
+{% set buildKey = run.buildKey %}
+{% set buildKeys = buildKeys|merge([run.buildKey]) %}
+{% set dates = dates|merge([run.timestamp]) %}
+{% endif %}
+{% endif %}
+{% endfor %}
+
+{# Check if conf run for this branch #}
+{% set confBranch = 0 %}
+{% for run in confRuns if run.getBranchName == branch %}
+{% set confBranch = 1 %}
+{% endfor %}
+
+{# Show branch if conf run for it #}
+{% if confBranch %}
+<div class="panel panel-info">
+<div class="panel-heading">
+<h4 class="panel-title bold">{{ branch }}</h4>
+</div>
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th class="bold rightBorder">{{ project.getName }}</th>
+{% for key, buildKey in buildKeys %}
+<th class="center">
+{% if buildKey|length > 6 %}
+<span class="clickOnTouch" data-toggle="tooltip" data-placement="top" title="{{ buildKey }}">{{ buildKey|slice(0, 4) }}...</span><br>
+{% else %}
+{{ buildKey }}<br>
+{% endif %}
+<span class="gray"><small>{{ dates[key]|date("m-d") }}</small></span>
+</th>
+{% endfor %}
+</tr>
+</thead>
+<tbody>
+{% set confPrev = '' %}
+{% set buildKeyIndexPrinted = -1 %}
+{% set buildKeyFound = 0 %}
+{% for run in confRuns if run.getBranchName == branch %}
+
+{# New row for each conf #}
+{% if confPrev != run.getName %}
+{# Close previous row #}
+{% if confPrev != '' %}
+{# Fill empty cells at the end of the row #}
+{% for key, buildKey in buildKeys %}
+{% if key > buildKeyIndexPrinted %}
+<td></td>
+{% endif %}
+{% endfor %}
+</tr>
+{% endif %}
+<tr>
+{% if conf == '' %}
+{% set link = confRoute ~ '/' ~ run.getName|url_encode %}
+{% set tooltip = 'click to filter this configuration' %}
+<td class="rightBorder">
+<a href="{{ link }}"><small><span data-toggle="tooltip" data-placement="top" title="{{ tooltip }}">{{ run.getName }}</span></small></a>
+</td>
+{% else %}
+<td class="rightBorder">
+<small>{{ run.getName }}</small>
+</td>
+{% endif %}
+{% set buildKeyIndexPrinted = -1 %}
+{% endif %}
+
+{# Result per build key #}
+{% set buildKeyFound = 0 %}
+{% for key, buildKey in buildKeys %}
+{# Print each column only once (checked based on column index key and buildKeyFound flag) #}
+{% if key > buildKeyIndexPrinted and not buildKeyFound %}
+{% if buildKey == run.getBuildKey %}
+{# Print result #}
+{% set forcesuccess = '' %}
+{% if run.getResult == constant('ConfRun::RESULT_SUCCESS') %}
+{% if run.getForcesuccess == 0 %}
+{% set resultIcon = 'glyphicon glyphicon-ok green' %}
+{% else %}
+{# Forcesuccess #}
+{% set resultIcon = 'glyphicon glyphicon-ok-sign green' %}
+{% set forcesuccess = ' (as forcesuccess)' %}
+{% endif %}
+{% elseif run.getResult == constant('ConfRun::RESULT_FAILURE') %}
+{% set resultIcon = 'glyphicon glyphicon-remove red' %}
+{% elseif run.getResult == constant('ConfRun::RESULT_UNDEF') %}
+{% set resultIcon = 'glyphicon glyphicon-ban-circle gray' %}
+{% else %}
+{% set resultIcon = '' %}
+{% endif %}
+<td class="center">
+<span class="spaceHorizontal {{ resultIcon }} clickOnTouch" data-toggle="tooltip" data-placement="top" data-html="true"
+title="<table>
+<tr><th>Build key: </th><td>{{ buildKey }}</td></tr>
+<tr><th>Configuration: </th><td>{{ run.getName }}</td></tr>
+<tr><th>Timestamp: </th><td>{{ run.getTimestamp }}</td></tr>
+<tr><th>Result: </th><td>{{ run.getResult }} {{ forcesuccess }}</td></tr>
+<tr><th>Duration: </th><td>{{ run.getDuration }}</td></tr>
+<tr><th>Forcesuccess: </th><td>{% if run.getForcesuccess %}yes{% else %}no{% endif %}</td></tr>
+<tr><th>Insignificant: </th><td>{% if run.getInsignificant %}yes{% else %}no{% endif %}</td></tr></table>">
+</span></td>
+{% set buildKeyFound = 1 %}
+{% else %}{# buildKey #}
+{# Print empty cell #}
+<td></td>
+{% endif %}{# buildKey #}
+{% set buildKeyIndexPrinted = key %}
+{% endif %}{# key #}
+{% endfor %}{# key #}
+{% set confPrev = run.getName %}
+{% endfor %}{# run #}
+
+{# Close last row (also fill empty cells at the end of the row) #}
+{% for key, buildKey in buildKeys %}
+{% if key > buildKeyIndexPrinted %}
+<td></td>
+{% endif %}
+{% endfor %}
+</tr>
+</tbody>
+</table>
+</div> {# .table-responsive #}
+</div> {# .panel-body #}
+</div> {# .panel... #}
+{% endif %}{# confBranch #}
+{% endfor %}{# branch #}
+
+{% else %}{# runsAvailable #}
+<div class="alert alert-danger" role="alert">
+No build data available for project {{ project.getName }}!
+</div>
+{% endif %}{# runsAvailable #}
+
+</div> {# .col... #}
+</div> {# .row #}
+</div> {# .container-fluid #}
{% include "footer.html" %}
diff --git a/non-puppet/qtmetrics2/templates/footer.html b/non-puppet/qtmetrics2/templates/footer.html
index 767a980..a99aa49 100644
--- a/non-puppet/qtmetrics2/templates/footer.html
+++ b/non-puppet/qtmetrics2/templates/footer.html
@@ -34,36 +34,36 @@
/**
* Footer section of html page including the scripts
- * @version 0.4
- * @since 08-07-2015
+ * @version 0.5
+ * @since 10-07-2015
* @author Juha Sippola
*/
#}
- <hr>
+<hr>
- <div class='text-center'>
- <footer>
- <p>&copy; The Qt Company 2015</p>
- </footer>
- </div>
+<div class='text-center'>
+<footer>
+<p>&copy; The Qt Company 2015</p>
+</footer>
+</div>
- </div> {# /container #}
+</div> {# /container #}
- {# Scripts placed at the end of the document so the pages load faster
- ======================================================================= #}
+{# Scripts placed at the end of the document so the pages load faster
+======================================================================= #}
- {# jQuery and Bootstrap #}
- <script src="lib/jQuery/jquery-1.11.3.min.js"></script>
- <script src="lib/jQuery-UI/jquery-ui.min.js"></script>
- <script src="lib/Bootstrap/js/bootstrap.min.js"></script>
+{# jQuery and Bootstrap #}
+<script src="lib/jQuery/jquery-1.11.3.min.js"></script>
+<script src="lib/jQuery-UI/jquery-ui.min.js"></script>
+<script src="lib/Bootstrap/js/bootstrap.min.js"></script>
- {# IE10 viewport hack for Surface/desktop Windows 8 bug #}
- <script src="scripts/ie10-viewport-bug-workaround.js"></script>
+{# IE10 viewport hack for Surface/desktop Windows 8 bug #}
+<script src="scripts/ie10-viewport-bug-workaround.js"></script>
- {# About window #}
- <script src="scripts/about.js"></script>
+{# About window #}
+<script src="scripts/about.js"></script>
- {# Loading progress bar #}
- <script src="scripts/loading.js"></script>
+{# Loading progress bar #}
+<script src="scripts/loading.js"></script>
diff --git a/non-puppet/qtmetrics2/templates/header.html b/non-puppet/qtmetrics2/templates/header.html
index 7a953e2..61a52b0 100644
--- a/non-puppet/qtmetrics2/templates/header.html
+++ b/non-puppet/qtmetrics2/templates/header.html
@@ -34,8 +34,8 @@
/**
* Header section of html page including the meta data and style sheets
- * @version 0.4
- * @since 08-07-2015
+ * @version 0.5
+ * @since 10-07-2015
* @author Juha Sippola
*/
@@ -44,101 +44,102 @@
<!DOCTYPE html>
<html lang="en">
<head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- {# The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags #}
- <meta name="description" content="Qt Metrics">
- <meta name="author" content="jusippol">
- <link rel="icon" href="images/favicon.ico">
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+{# The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags #}
+<meta name="description" content="Qt Metrics">
+<meta name="author" content="jusippol">
+<link rel="icon" href="images/favicon.ico">
- <title>Qt Metrics</title>
+<title>Qt Metrics</title>
- {# base directory for inclusions #}
- <base href={{ root }} />
+{# base directory for inclusions #}
+<base href={{ root }} />
- {# jQuery UI CSS #}
- <link rel="stylesheet" href="lib/jQuery-UI-themes/themes/smoothness/jquery-ui.css">
+{# jQuery UI CSS #}
+<link rel="stylesheet" href="lib/jQuery-UI-themes/themes/smoothness/jquery-ui.min.css">
- {# Bootstrap core CSS #}
- <link rel="stylesheet" href="lib/Bootstrap/css/bootstrap.min.css">
+{# Bootstrap core CSS #}
+<link rel="stylesheet" href="lib/Bootstrap/css/bootstrap.min.css">
- {# Custom styles for the Bootstrap templates used #}
- <link rel="stylesheet" href="styles/bootstrap_custom.css">
+{# Custom styles for the Bootstrap templates used #}
+<link rel="stylesheet" href="styles/bootstrap_custom.css">
- {# Own styles #}
- <link rel="stylesheet" href="styles/qtmetrics.css">
+{# Own styles #}
+<link rel="stylesheet" href="styles/qtmetrics.css">
- {# HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries #}
- {#[if lt IE 9]>
- <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
- <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
- <![endif]#}
+{# HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries #}
+{#[if lt IE 9]>
+<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+<![endif]#}
</head>
<body>
- <nav class="navbar navbar-inverse navbar-fixed-top">
- <div class="container">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
- <span class="sr-only">Toggle navigation</span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
-
- <div>
- <a class="navbar-brand" href="">
- <span>
- <img src="images/Qt-logo-small.png" alt="Qt"> &nbsp; Qt Metrics
- </span>
- </a>
- <div id="link_loading" class="progress">
- <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
- </div>
- </div>
- </div>
- </div>
-
- <div id="navbar" class="navbar-collapse collapse">
- <nav>
- <ul class="nav nav-pills pull-right">
- <li role="presentation" class=" navbar-btn dropdown">
- <a id="doc-drop" href="#" class="dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" role="button" aria-expanded="false">
- Documentation
- <span class="caret"></span>
- </a>
- <ul id="menu1" class="dropdown-menu" role="menu" aria-labelledby="doc-drop">
- <li role="presentation"><a role="menuitem" tabindex="-1" href="doc/db_design.png" target="_blank">Database design</a></li>
- <li role="presentation"><a role="menuitem" tabindex="-1" href="doc/apigen" target="_blank">Class definitions</a></li>
- </ul>
- </li>
- <li role="presentation" class="navbar-btn"><a href="https://wiki.qt.io/User:Juha" target="_blank">Contact</a></li>
- <li role="presentation" class="navbar-btn"><a href="" data-toggle="modal" data-target="#aboutModal">About</a></li>
- <li role="presentation" class="navbar-btn"><a href="http://www.qt.io/" target="_blank">qt.io</a></li>
- </ul>
- </nav>
- </div>
- </div>
- </nav>
-
- {# Modal for About #}
- <div class="modal fade" id="aboutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
- <h4 class="modal-title" id="myModalLabel">About</h4>
- </div>
- <div class="modal-body">
- <div id="about"></div>
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
- </div>
- </div>
- </div>
- </div>
-
- {# Open the content (closed in close.html) #}
- <div class="container">
+<nav class="navbar navbar-inverse navbar-fixed-top">
+<div class="container">
+<div class="navbar-header">
+<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
+<span class="sr-only">Toggle navigation</span>
+<span class="icon-bar"></span>
+<span class="icon-bar"></span>
+<span class="icon-bar"></span>
+</button>
+
+<div>
+<a class="navbar-brand" href="">
+<span>
+<img src="images/Qt-logo-small.png" alt="Qt"> &nbsp; Qt Metrics
+</span>
+</a>
+<div id="link_loading" class="progress">
+<div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
+</div>
+</div>
+</div>
+</div> {# .navbar-header #}
+
+<div id="navbar" class="navbar-collapse collapse">
+<nav>
+<ul class="nav nav-pills pull-right">
+<li role="presentation" class=" navbar-btn dropdown">
+<a id="doc-drop" href="#" class="dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" role="button" aria-expanded="false">
+Documentation
+<span class="caret"></span>
+</a>
+<ul id="menu1" class="dropdown-menu" role="menu" aria-labelledby="doc-drop">
+<li role="presentation"><a role="menuitem" tabindex="-1" href="doc/db_design.png" target="_blank">Database design</a></li>
+<li role="presentation"><a role="menuitem" tabindex="-1" href="doc/apigen" target="_blank">Class definitions</a></li>
+</ul>
+</li>
+<li role="presentation" class="navbar-btn"><a href="https://wiki.qt.io/User:Juha" target="_blank">Contact</a></li>
+<li role="presentation" class="navbar-btn"><a href="" data-toggle="modal" data-target="#aboutModal">About</a></li>
+<li role="presentation" class="navbar-btn"><a href="http://www.qt.io/" target="_blank">qt.io</a></li>
+</ul>
+</nav>
+</div> {# navbar #}
+
+</div> {# .container #}
+</nav>
+
+{# Modal for About #}
+<div class="modal fade" id="aboutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+<div class="modal-dialog">
+<div class="modal-content">
+<div class="modal-header">
+<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+<h4 class="modal-title" id="myModalLabel">About</h4>
+</div>
+<div class="modal-body">
+<div id="about"></div>
+</div>
+<div class="modal-footer">
+<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+</div>
+</div>
+</div>
+</div> {# .modal #}
+
+{# Open the content (closed in close.html) #}
+<div class="container">
diff --git a/non-puppet/qtmetrics2/templates/home.html b/non-puppet/qtmetrics2/templates/home.html
index 2896242..3ece3b6 100644
--- a/non-puppet/qtmetrics2/templates/home.html
+++ b/non-puppet/qtmetrics2/templates/home.html
@@ -34,8 +34,8 @@
/**
* Home page
- * @version 0.5
- * @since 01-07-2015
+ * @version 0.6
+ * @since 10-07-2015
* @author Juha Sippola
*/
@@ -44,117 +44,117 @@
{% include "header.html" %}
<div class="jumbotron">
- <div class="container">
- <div class="col-md-9">
- <h1>Qt Metrics <sup class="masterVersion">2</sup></h1>
- </div>
- <div class="col-md-3">
- <div class="well well-sm">
- <p>Data updated:</p>
- {{ refreshed }}
- </div>
- </div>
- </div>
+<div class="container">
+<div class="col-md-9">
+<h1>Qt Metrics <sup class="masterVersion">2</sup></h1>
+</div>
+<div class="col-md-3">
+<div class="well well-sm">
+<p>Data updated:</p>
+{{ refreshed }}
+</div>
+</div>
+</div>
</div>
<div class="row">
- <div class="col-md-1">
- </div>
-
- <div class="col-md-4">
- <hr>
- <h2>Overview</h2>
- <p>See the latest build status across the branches:</p>
- <div>
- <a class="btn btn-primary btn-xs" href="{{ overviewRoute }}" role="button">{{ masterProject }} {{ masterState }}</a>
- </div>
- </div>
+<div class="col-md-1">
+</div>
- <div class="col-md-1">
- </div>
+<div class="col-md-4">
+<hr>
+<h2>Overview</h2>
+<p>See the latest build status across the branches:</p>
+<div>
+<a class="btn btn-primary btn-xs" href="{{ overviewRoute }}" role="button">{{ masterProject }} {{ masterState }}</a>
+</div>
+</div>
- <div class="col-md-4">
- <hr>
- <h2>Platforms</h2>
- <p>See target platform status:</p>
- <div>
- {% for platform in platforms %}
- <div class="btn-group">
- <a class="btn btn-primary btn-xs" href="{{ platformRoute }}/{{ platform.os }}" role="button">{{ platform.os }}</a>
- </div>
- {% endfor %}
- </div>
- </div>
+<div class="col-md-1">
+</div>
+<div class="col-md-4">
+<hr>
+<h2>Platforms</h2>
+<p>See target platform status:</p>
+<div>
+{% for platform in platforms %}
+<div class="btn-group">
+<a class="btn btn-primary btn-xs" href="{{ platformRoute }}/{{ platform.os }}" role="button">{{ platform.os }}</a>
+</div>
+{% endfor %}
</div>
+</div> {# .col-md... #}
+
+</div> {# .row #}
<div class="row">
- <div class="col-md-1">
- </div>
-
- <div class="col-md-4">
- <hr>
- <h2>Projects</h2>
- <p>See testset status for a project:</p>
- <div>
- <form class="form-horizontal" role="form" method="post">
- <div class="input-group input-group-sm">
- <input id="projectInput" name="projectInputValue" type="text" class="form-control" placeholder="project name...">
- <span class="input-group-btn">
- <input id="projectInputSubmit" name="projectInputSubmit" type="submit" class="btn btn-primary" value="Show">
- </span>
- </div>
- </form>
- </div>
- </div>
-
- <div class="col-md-1">
- </div>
-
- <div class="col-md-4">
- <hr>
- <h2>Tests</h2>
- <p>See results for a testset:</p>
- <div>
- <form class="form-horizontal" role="form" method="post">
- <div class="input-group input-group-sm">
- <input id="testsetInput" name="testsetInputValue" type="text" class="form-control" placeholder="testset name...">
- <span class="input-group-btn">
- <input id="testsetInputSubmit" name="testsetInputSubmit" type="submit" class="btn btn-primary" value="Show">
- </span>
- </div>
- </form>
- </div>
- <br>
- <p>See testset lists:</p>
- <div>
- <a class="btn btn-primary btn-xs" href="{{ topRoute }}" role="button">top failures</a>
- <a class="btn btn-primary btn-xs" href="{{ flakyRoute }}" role="button">flaky testsets</a>
- </div>
- </div>
+<div class="col-md-1">
+</div>
+<div class="col-md-4">
+<hr>
+<h2>Projects</h2>
+<p>See testset status for a project:</p>
+<div>
+<form class="form-horizontal" role="form" method="post">
+<div class="input-group input-group-sm">
+<input id="projectInput" name="projectInputValue" type="text" class="form-control" placeholder="project name...">
+<span class="input-group-btn">
+<input id="projectInputSubmit" name="projectInputSubmit" type="submit" class="btn btn-primary" value="Show">
+</span>
+</div>
+</form>
</div>
+</div> {# .col-md... #}
-<div class="row">
+<div class="col-md-1">
+</div>
+
+<div class="col-md-4">
+<hr>
+<h2>Tests</h2>
+<p>See results for a testset:</p>
+<div>
+<form class="form-horizontal" role="form" method="post">
+<div class="input-group input-group-sm">
+<input id="testsetInput" name="testsetInputValue" type="text" class="form-control" placeholder="testset name...">
+<span class="input-group-btn">
+<input id="testsetInputSubmit" name="testsetInputSubmit" type="submit" class="btn btn-primary" value="Show">
+</span>
+</div>
+</form>
+</div>
+<br>
+<p>See testset lists:</p>
+<div>
+<a class="btn btn-primary btn-xs" href="{{ topRoute }}" role="button">top failures</a>
+<a class="btn btn-primary btn-xs" href="{{ flakyRoute }}" role="button">flaky testsets</a>
+</div>
+</div> {# .col-md... #}
- <div class="col-md-1">
- </div>
+</div> {# .row #}
- <div class="col-md-4">
- <hr>
- </div>
+<div class="row">
+
+<div class="col-md-1">
+</div>
- <div class="col-md-1">
- </div>
+<div class="col-md-4">
+<hr>
+</div>
- <div class="col-md-4">
- <hr>
- </div>
+<div class="col-md-1">
+</div>
+<div class="col-md-4">
+<hr>
</div>
+</div> {# .row #}
+
{% include "footer.html" %}
{# Local scripts for this page #}
diff --git a/non-puppet/qtmetrics2/templates/overview.html b/non-puppet/qtmetrics2/templates/overview.html
index 6b45757..9473b58 100644
--- a/non-puppet/qtmetrics2/templates/overview.html
+++ b/non-puppet/qtmetrics2/templates/overview.html
@@ -34,8 +34,8 @@
/**
* Overview page
- * @version 0.2
- * @since 01-07-2015
+ * @version 0.3
+ * @since 10-07-2015
* @author Juha Sippola
*/
@@ -47,187 +47,184 @@
{% set BAR_AREA = 60 %}
<ol class="breadcrumb">
- {% for link in breadcrumb %}
- <li><a href="{{ link.link }}">{{ link.name }}</a></li>
- {% endfor %}
- <li class="active">overview</li>
+{% for link in breadcrumb %}
+<li><a href="{{ link.link }}">{{ link.name }}</a></li>
+{% endfor %}
+<li class="active">overview</li>
</ol>
<div class="container-fluid">
- <div class="row">
-
- <div class="col-sm-12 col-md-12 main">
-
- {##### Title #####}
-
- <h1 class="page-header">
- Overview
- <button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
- <span class="glyphicon glyphicon-info-sign"></span>
- </button>
- <small>{{ refreshed }}</small>
- </h1>
-
- {##### Info well #####}
-
- <div class="collapse" id="info">
- <div class="well infoWell">
- <span class="glyphicon glyphicon-info-sign"></span> <strong>Overview</strong><br>
- <ul>
- <li><strong>Latest {{ masterProject }} {{ masterState }} Build Status</strong> shows
- the overall result of the latest <strong>{{ masterProject }} {{ masterState }}</strong>
- builds themselves by branch; details on the runs are available as tooltip on result icon.</li>
- <li><strong>Latest {{ masterProject }} {{ masterState }} Testing Status</strong> shows
- the status based on testset results in the latest <strong>{{ masterProject }}
- {{ masterState }}</strong> builds in any configuration by testset project across all branches.</li>
- </ul>
- </div>
- </div>
-
- {##### Latest Build Status #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Latest {{ masterProject }} {{ masterState }} Build Status</h4>
- </div>
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th class="rightBorder">project</th>
- {% for branch in latestProjectRuns %}
- <th class="center">{{ branch.name }}</th>
- {% endfor %}
- </tr>
- </thead>
- <tbody>
- <tr>
- {# Project name #}
- <td class="rightBorder"><a href="{{ buildProjectRoute }}">{{ masterProject }}</a></td>
-
- {# Result (by branch) #}
- {% for run in latestProjectRuns %}
- {% if run.result == constant('projectRun::RESULT_SUCCESS') %}
- {% set resultIcon = 'glyphicon glyphicon-ok green' %}
- {% elseif run.result == constant('projectRun::RESULT_FAILURE') %}
- {% set resultIcon = 'glyphicon glyphicon-remove red' %}
- {% else %}
- {% set resultIcon = 'glyphicon glyphicon-ban-circle gray' %}
- {% endif %}
- <td class="center">
- <span class="spaceHorizontal {{ resultIcon }} clickOnTouch"
- data-toggle="tooltip" data-placement="top" data-html="true"
- title="<table>
- <tr><th>Branch: </td><td>{{ run.name }}</td></tr>
- <tr><th>Build key: </td><td>{{ run.buildKey }}</td></tr>
- <tr><th>Timestamp: </td><td>{{ run.timestamp }}</td></tr>
- <tr><th>Result: </td><td>{{ run.result }}</td></tr>
- <tr><th>Duration: </td><td>{{ run.duration}}</td></tr>
- </table>">
- </span>
- </td>
- {% endfor %}
- </tr>
-
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
-
- {##### Latest Testing Status #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Latest {{ masterProject }} {{ masterState }} Testing Status</h4>
- </div>
-
- {# Get branches and projects #}
- {% set branches = [] %}
- {% set projects = [] %}
- {% for run in latestTestsetRuns %}
- {% if run.branch not in branches %}
- {% set branches = branches|merge([run.branch]) %}
- {% endif %}
- {% if run.project not in projects %}
- {% set projects = projects|merge([run.project]) %}
- {% endif %}
- {% endfor %}
-
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th class="rightBorder">testset project</th>
- {% for branch in branches %}
- <th class="center">{{ branch }}<br>
- <small>failed <span class ="gray">(total)</span></small>
- </th>
- <th class="showInLargeDisplay"></th>
- {% endfor %}
- </tr>
- </thead>
- <tbody>
- {# Calculate max failed result count for the bar #}
- {% set maxCount = 1 %}
- {% for run in latestTestsetRuns %}
- {% if run.failed > maxCount %}
- {% set maxCount = run.failed %}
- {% endif %}
- {% endfor %}
-
- {% for project in projects %}
- <tr>
- {# Project name #}
- <td class="rightBorder"><a href="{{ testsetProjectRoute }}/{{ project }}">{{ project }}</a></td>
-
- {# Result (by branch) #}
- {% for branch in branches %}
- {% for run in latestTestsetRuns if project == run.project and branch == run.branch %}
-
- {# Show results #}
- {% set failed = run.failed %}
- {% set passed = run.passed %}
- {% set total = passed + failed %}
- <td class="center">{{ failed }}<span class ="gray"> ({{ total }})</span></td>
-
- {# Show results as bars (scaled to BAR_AREA px) #}
- {% set failedBar = ((BAR_AREA/maxCount) * failed)|round(0, 'floor') %}
- {% if (failed > 0) and (failedBar == 0) %}
- {% set failedBar = 1 %}
- {% endif %}
- {% if failed == 0 %}
- {% set failed = '' %}
- {% endif %}
- {% if (passed > 0) and (failed == 0) %}
- {% set passedBar = maxCount %}
- {% else %}
- {% set passed = '' %}
- {% endif %}
- <td class="center showInLargeDisplay">
- <div>
- <div class="floatLeft redBackground" style="width: {{ failedBar }}px"><small>{{ failed }}</small></div>
- <div class="floatLeft greenBackground" style="width: {{ passedBar }}px"><small>{{ passed }}</small></div>
- </div>
- </td>
- {% else %}
- <td></td>
- {% endfor %}
- {% endfor %}
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
-
- </div> {# /col... #}
- </div> {# /row #}
-
-</div> {# /container-fluid #}
+<div class="row">
+
+<div class="col-sm-12 col-md-12 main">
+
+{##### Title #####}
+
+<h1 class="page-header">
+Overview
+<button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
+<span class="glyphicon glyphicon-info-sign"></span>
+</button>
+<small>{{ refreshed }}</small>
+</h1>
+
+{##### Info well #####}
+
+<div class="collapse" id="info">
+<div class="well infoWell">
+<span class="glyphicon glyphicon-info-sign"></span> <strong>Overview</strong><br>
+<ul>
+<li><strong>Latest {{ masterProject }} {{ masterState }} Build Status</strong> shows
+the overall result of the latest <strong>{{ masterProject }} {{ masterState }}</strong>
+builds themselves by branch; details on the runs are available as tooltip on result icon.</li>
+<li><strong>Latest {{ masterProject }} {{ masterState }} Testing Status</strong> shows
+the status based on testset results in the latest <strong>{{ masterProject }}
+{{ masterState }}</strong> builds in any configuration by testset project across all branches.</li>
+</ul>
+</div>
+</div>
+
+{##### Latest Build Status #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Latest {{ masterProject }} {{ masterState }} Build Status</h4>
+</div>
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th class="rightBorder">project</th>
+{% for branch in latestProjectRuns %}
+<th class="center">{{ branch.name }}</th>
+{% endfor %}
+</tr>
+</thead>
+<tbody>
+<tr>
+{# Project name #}
+<td class="rightBorder"><a href="{{ buildProjectRoute }}">{{ masterProject }}</a></td>
+
+{# Result (by branch) #}
+{% for run in latestProjectRuns %}
+{% if run.result == constant('projectRun::RESULT_SUCCESS') %}
+{% set resultIcon = 'glyphicon glyphicon-ok green' %}
+{% elseif run.result == constant('projectRun::RESULT_FAILURE') %}
+{% set resultIcon = 'glyphicon glyphicon-remove red' %}
+{% else %}
+{% set resultIcon = 'glyphicon glyphicon-ban-circle gray' %}
+{% endif %}
+<td class="center">
+<span class="spaceHorizontal {{ resultIcon }} clickOnTouch" data-toggle="tooltip" data-placement="top" data-html="true"
+title="<table>
+<tr><th>Branch: </td><td>{{ run.name }}</td></tr>
+<tr><th>Build key: </td><td>{{ run.buildKey }}</td></tr>
+<tr><th>Timestamp: </td><td>{{ run.timestamp }}</td></tr>
+<tr><th>Result: </td><td>{{ run.result }}</td></tr>
+<tr><th>Duration: </td><td>{{ run.duration}}</td></tr></table>">
+</span></td>
+{% endfor %}
+</tr>
+
+</tbody>
+</table>
+</div> {# .table-responsive #}
+</div> {# .panel-body #}
+</div> {# .panel... #}
+
+{##### Latest Testing Status #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Latest {{ masterProject }} {{ masterState }} Testing Status</h4>
+</div>
+
+{# Get branches and projects #}
+{% set branches = [] %}
+{% set projects = [] %}
+{% for run in latestTestsetRuns %}
+{% if run.branch not in branches %}
+{% set branches = branches|merge([run.branch]) %}
+{% endif %}
+{% if run.project not in projects %}
+{% set projects = projects|merge([run.project]) %}
+{% endif %}
+{% endfor %}
+
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th class="rightBorder">testset project</th>
+{% for branch in branches %}
+<th class="center">{{ branch }}<br>
+<small>failed <span class ="gray">(total)</span></small>
+</th>
+<th class="showInLargeDisplay"></th>
+{% endfor %}
+</tr>
+</thead>
+<tbody>
+{# Calculate max failed result count for the bar #}
+{% set maxCount = 1 %}
+{% for run in latestTestsetRuns %}
+{% if run.failed > maxCount %}
+{% set maxCount = run.failed %}
+{% endif %}
+{% endfor %}
+
+{% for project in projects %}
+<tr>
+{# Project name #}
+<td class="rightBorder"><a href="{{ testsetProjectRoute }}/{{ project }}">{{ project }}</a></td>
+
+{# Result (by branch) #}
+{% for branch in branches %}
+{% for run in latestTestsetRuns if project == run.project and branch == run.branch %}
+
+{# Show results #}
+{% set failed = run.failed %}
+{% set passed = run.passed %}
+{% set total = passed + failed %}
+<td class="center">{{ failed }}<span class ="gray"> ({{ total }})</span></td>
+
+{# Show results as bars (scaled to BAR_AREA px) #}
+{% set failedBar = ((BAR_AREA/maxCount) * failed)|round(0, 'floor') %}
+{% if (failed > 0) and (failedBar == 0) %}
+{% set failedBar = 1 %}
+{% endif %}
+{% if failed == 0 %}
+{% set failed = '' %}
+{% endif %}
+{% if (passed > 0) and (failed == 0) %}
+{% set passedBar = maxCount %}
+{% else %}
+{% set passed = '' %}
+{% endif %}
+<td class="center showInLargeDisplay">
+<div>
+<div class="floatLeft redBackground" style="width: {{ failedBar }}px"><small>{{ failed }}</small></div>
+<div class="floatLeft greenBackground" style="width: {{ passedBar }}px"><small>{{ passed }}</small></div>
+</div>
+</td>
+{% else %}{# run #}
+<td></td>
+<td></td>
+{% endfor %}{# run #}
+{% endfor %}{# branch #}
+</tr>
+{% endfor %}{# project #}
+</tbody>
+</table>
+</div> {# .table-responsive #}
+</div> {# .panel-body #}
+</div> {# .panel... #}
+
+</div> {# .col... #}
+</div> {# .row #}
+</div> {# .container-fluid #}
{% include "footer.html" %}
diff --git a/non-puppet/qtmetrics2/templates/testset.html b/non-puppet/qtmetrics2/templates/testset.html
index 2878c49..8dd02fa 100644
--- a/non-puppet/qtmetrics2/templates/testset.html
+++ b/non-puppet/qtmetrics2/templates/testset.html
@@ -34,8 +34,8 @@
/**
* Testset page
- * @version 0.6
- * @since 06-07-2015
+ * @version 0.7
+ * @since 10-07-2015
* @author Juha Sippola
*/
@@ -59,313 +59,305 @@
#}
<ol class="breadcrumb">
- {% for link in breadcrumb %}
- <li><a href="{{ link.link }}">{{ link.name }}</a></li>
- {% endfor %}
- <li class="active">{{ testset.getName }}</li>
+{% for link in breadcrumb %}
+<li><a href="{{ link.link }}">{{ link.name }}</a></li>
+{% endfor %}
+<li class="active">{{ testset.getName }}</li>
</ol>
<div class="container-fluid">
- <div class="row">
-
- <div class="col-sm-12 col-md-12 main">
-
- {# Check if any runs available #}
- {% set runsAvailable = 0 %}
- {% for run in testsetRuns %}
- {% set runsAvailable = 1 %}
- {% endfor %}
-
- {##### Title #####}
-
- <h1 class="page-header">
- {{ testset.getName }}
- <button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
- <span class="glyphicon glyphicon-info-sign"></span>
- </button>
- <small>{{ refreshed }}</small>
- </h1>
-
- {##### Info well #####}
-
- <div class="collapse" id="info">
- <div class="well infoWell">
- <span class="glyphicon glyphicon-info-sign"></span> <strong>Testset</strong><br>
- <ul>
- <li><strong>latest result</strong> shows the overall testset status based on the latest
- <strong>{{ masterProject }} {{ masterState }}</strong> builds across all branches
- (shows failed if failed in one or in several).</li>
- <li><strong>failed</strong> count shows the number of <strong>{{ masterProject }} {{ masterState }}</strong>
- builds where {{ testset.getName }} failed during the last {{ lastDaysFailures }} days
- (since {{ sinceDateFailures }}).</li>
- <li><strong>flaky</strong> count shows the number of <strong>all</strong> builds where
- {{ testset.getName }} failed on the first run but, when rerun, it passed
- (during the last {{ lastDaysFlaky }} days, since {{ sinceDateFlaky }}).</li>
- <li><strong>Results in Branches</strong> shows the {{ testset.getName }} run results by branch
- and their configuration on <strong>{{ masterProject }} {{ masterState }}</strong> builds
- (<span class="glyphicon glyphicon-ok green"></span> = {{ constant('TestsetRun::RESULT_SUCCESS') }},
- <span class="glyphicon glyphicon-ok-sign green"></span> = {{ constant('TestsetRun::RESULT_SUCCESS') }} as flaky,
- <span class="glyphicon glyphicon-remove red"></span> = {{ constant('TestsetRun::RESULT_FAILURE') }});
- details on the runs are available as tooltip on result icon.</li>
- </ul>
- </div>
- </div>
-
- {% if runsAvailable %}
-
- {##### Latest Status #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Latest Status</h4>
- </div>
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th>project</th>
- <th>latest result</th>
- <th class="leftBorder center"><span class="spaceHorizontal glyphicon glyphicon-remove red"></span>failed <span class ="gray">(total)</span></th>
- <th class="showInLargeDisplay"></th>
- <th class="leftBorder center"><span class="spaceHorizontal glyphicon glyphicon-ok-sign green"></span>flaky <span class ="gray">(total)</span></th>
- <th class="showInLargeDisplay"></th>
- </tr>
- </thead>
- <tbody>
- {# Calculate max result count for the bar #}
- {% set maxCount = 1 %}
- {% if (testset.getTestsetResultCounts.passed + testset.getTestsetResultCounts.failed) > maxCount %}
- {% set maxCount = testset.getTestsetResultCounts.passed + testset.getTestsetResultCounts.failed %}
- {% endif %}
- {% if testset.getTestsetFlakyCounts.flaky > maxCount %}
- {% set maxCount = testset.getTestsetFlakyCounts.flaky %}
- {% endif %}
-
- {# Print summary #}
- <tr>
- {# Project name #}
- <td>{{ testset.getProjectName }}</td>
-
- {# Testset status according to the latest build results #}
- {% if testset.getStatus == constant('TestsetRun::RESULT_SUCCESS') %}
- {% set resultIcon = 'glyphicon glyphicon-ok green' %}
- {% elseif testset.getStatus == constant('TestsetRun::RESULT_FAILURE') %}
- {% set resultIcon = 'glyphicon glyphicon-remove red' %}
- {% else %}
- {% set resultIcon = '' %}
- {% endif %}
- <td><span class="spaceHorizontal {{ resultIcon }}"></span>{{ testset.getStatus }}</td>
-
- {# Show failed #}
- {% set failed = testset.getTestsetResultCounts.failed %}
- {% set passed = testset.getTestsetResultCounts.passed %}
- {% set total = passed + failed %}
- <td class="leftBorder center">{{ failed }}<span class ="gray"> ({{ total }})</span></td>
- {# Show results as bars (scaled to BAR_AREA px) #}
- {% set passedBar = ((BAR_AREA/maxCount) * passed)|round(0, 'floor') %}
- {% if (passed > 0) and (passedBar == 0) %}
- {% set passedBar = 1 %}
- {% endif %}
- {% set failedBar = ((BAR_AREA/maxCount)*failed)|round(0, 'floor') %}
- {% if (failed > 0) and (failedBar == 0) %}
- {% set failedBar = 1 %}
- {% endif %}
- <td class="center showInLargeDisplay">
- <div>
- <div class="floatLeft redBackground" style="width: {{ failedBar }}px"><small>{{ failed }}</small></div>
- <div class="floatLeft greenBackground" style="width: {{ passedBar }}px"><small>{{ passed }}</small></div>
- </div>
- </td>
-
- {# Show flaky #}
- {% set flaky = testset.getTestsetFlakyCounts.flaky %}
- {% set total = testset.getTestsetFlakyCounts.total %}
- <td class="leftBorder center">{{ flaky }}<span class ="gray"> ({{ total }})</span></td>
- {# Show results as bars (scaled to BAR_AREA px) #}
- {% set flakyBar = ((BAR_AREA/maxCount)*flaky)|round(0, 'floor') %}
- {% if (flaky > 0) and (flakyBar == 0) %}
- {% set flakyBar = 1 %}
- {% endif %}
- <td class="center showInLargeDisplay">
- {% if flaky > 0 %}
- <div>
- <div class="floatLeft redBackground" style="width: {{ flakyBar }}px"><small>{{ flaky }}</small></div>
- </div>
- {% endif %}
- </td>
- </tr>
-
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
-
- {##### Results in Branches #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Results in Branches</h4>
- </div>
- </div>
-
- {# Get branches #}
- {% set branches = [] %}
- {% for run in projectBuilds %}
- {% if run.branch not in branches %}
- {% set branches = branches|merge([run.branch]) %}
- {% endif %}
- {% endfor %}
-
- {# Loop all the branches #}
- {% for branch in branches %}
-
- {# Get all build keys #}
- {% set buildKey = '' %}
- {% set buildKeys = [] %}
- {% set dates = [] %}
- {% for run in projectBuilds %}
- {% if run.branch == branch %}
- {% if buildKey != run.buildKey %}
- {% set buildKey = run.buildKey %}
- {% set buildKeys = buildKeys|merge([run.buildKey]) %}
- {% set dates = dates|merge([run.timestamp]) %}
- {% endif %}
- {% endif %}
- {% endfor %}
-
- {# Check if testset run for this branch #}
- {% set testsetBranch = 0 %}
- {% for run in testsetRuns if run.getBranchName == branch %}
- {% set testsetBranch = 1 %}
- {% endfor %}
-
- {# Show branch if testset run for it #}
- {% if testsetBranch %}
- <div class="panel panel-info">
- <div class="panel-heading">
- <h4 class="panel-title bold">{{ branch }}</h4>
- </div>
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th class="bold rightBorder">{{ testset.getName }}</th>
- {% for key, buildKey in buildKeys %}
- <th class="center">
- {% if buildKey|length > 6 %}
- <span class="clickOnTouch" data-toggle="tooltip" data-placement="top"
- title="{{ buildKey }}">{{ buildKey|slice(0, 4) }}...
- </span>
- {% else %}
- {{ buildKey }}
- {% endif %}
- <br>
- <span class="gray"><small>{{ dates[key]|date("m-d") }}</small></span>
- </th>
- {% endfor %}
- </tr>
- </thead>
- <tbody>
- {% set confPrev = '' %}
- {% set buildKeyIndexPrinted = -1 %}
- {% set buildKeyFound = 0 %}
- {% for run in testsetRuns if run.getBranchName == branch %}
-
- {# New row for each conf #}
- {% if confPrev != run.getConfName %}
- {# Close previous row #}
- {% if confPrev != '' %}
- {# Fill empty cells at the end of the row #}
- {% for key, buildKey in buildKeys %}
- {% if key > buildKeyIndexPrinted %}
- <td></td>
- {% endif %}
- {% endfor %}
- </tr>
- {% endif %}
- <tr>
- <td class="rightBorder"><small>{{ run.getConfName }}</small></td>
- {% set buildKeyIndexPrinted = -1 %}
- {% endif %}
-
- {# Result per build key #}
- {% set buildKeyFound = 0 %}
- {% for key, buildKey in buildKeys %}
- {# Print each column only once (checked based on column index key and buildKeyFound flag) #}
- {% if key > buildKeyIndexPrinted and not buildKeyFound %}
- {% if buildKey == run.getBuildKey %}
- {# Print result #}
- {% set flaky = '' %}
- {% if run.getResult == constant('TestsetRun::RESULT_SUCCESS') %}
- {% if run.getRun == 1 %}
- {% set resultIcon = 'glyphicon glyphicon-ok green' %}
- {% else %}
- {# Flaky #}
- {% set resultIcon = 'glyphicon glyphicon-ok-sign green' %}
- {% set flaky = ' (on run ' ~ run.getRun ~ ' as flaky)' %}
- {% endif %}
- {% elseif run.getResult == constant('TestsetRun::RESULT_FAILURE') %}
- {% set resultIcon = 'glyphicon glyphicon-remove red' %}
- {% else %}
- {% set resultIcon = '' %}
- {% endif %}
- {% if (run.getDuration / 10) > 60 %}
- {% set durationFormatted = ' (00:' ~ (run.getDuration/10)|date("i:s") ~ ')' %}
- {% else %}
- {% set durationFormatted = '' %}
- {% endif %}
- <td class="center">
- <span class="spaceHorizontal {{ resultIcon }} clickOnTouch"
- data-toggle="tooltip" data-placement="top" data-html="true"
- title="<table>
- <tr><th>Build key: </th><td>{{ buildKey }}</td></tr>
- <tr><th>Configuration: </th><td>{{ run.getConfName }}</td></tr>
- <tr><th>Timestamp: </th><td>{{ run.getTimestamp }}</td></tr>
- <tr><th>Result: </th><td>{{ run.getResult }} {{ flaky }}</td></tr>
- <tr><th>Duration: </th><td>{{ run.getDuration / 10 }} s {{ durationFormatted }}</td></tr>
- <tr><th>Run #: </th><td>{{ run.getRun }}</td></tr>
- <tr><th>Insignificant: </th><td>{% if run.getInsignificant %}yes{% else %}no{% endif %}</td></tr>
- </table>">
- </span>
- </td>
- {% set buildKeyFound = 1 %}
- {% else %}
- {# Print empty cell #}
- <td></td>
- {% endif %}
- {% set buildKeyIndexPrinted = key %}
- {% endif %}
- {% endfor %}
- {% set confPrev = run.getConfName %}
- {% endfor %}
-
- {# Close last row (also fill empty cells at the end of the row) #}
- {% for key, buildKey in buildKeys %}
- {% if key > buildKeyIndexPrinted %}
- <td></td>
- {% endif %}
- {% endfor %}
- </tr>
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
- {% endif %} {# testsetBranch #}
- {% endfor %}
-
- {% else %} {# runsAvailable #}
- <div class="alert alert-danger" role="alert">
- No test result data available for testset {{ testset.getName }} in project {{ testset.getProjectName }}!
- </div>
- {% endif %}
-
- </div> {# /col... #}
- </div> {# /row #}
-
+<div class="row">
+
+<div class="col-sm-12 col-md-12 main">
+
+{# Check if any runs available #}
+{% set runsAvailable = 0 %}
+{% for run in testsetRuns %}
+{% set runsAvailable = 1 %}
+{% endfor %}
+
+{##### Title #####}
+
+<h1 class="page-header">
+{{ testset.getName }}
+<button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
+<span class="glyphicon glyphicon-info-sign"></span>
+</button>
+<small>{{ refreshed }}</small>
+</h1>
+
+{##### Info well #####}
+
+<div class="collapse" id="info">
+<div class="well infoWell">
+<span class="glyphicon glyphicon-info-sign"></span> <strong>Testset</strong><br>
+<ul>
+<li><strong>latest result</strong> shows the overall testset status based on the latest
+<strong>{{ masterProject }} {{ masterState }}</strong> builds across all branches
+(shows failed if failed in one or in several).</li>
+<li><strong>failed</strong> count shows the number of <strong>{{ masterProject }} {{ masterState }}</strong>
+builds where {{ testset.getName }} failed during the last {{ lastDaysFailures }} days
+(since {{ sinceDateFailures }}).</li>
+<li><strong>flaky</strong> count shows the number of <strong>all</strong> builds where
+{{ testset.getName }} failed on the first run but, when rerun, it passed
+(during the last {{ lastDaysFlaky }} days, since {{ sinceDateFlaky }}).</li>
+<li><strong>Results in Branches</strong> shows the {{ testset.getName }} run results by branch
+and their configuration on <strong>{{ masterProject }} {{ masterState }}</strong> builds
+(<span class="glyphicon glyphicon-ok green"></span> = {{ constant('TestsetRun::RESULT_SUCCESS') }},
+<span class="glyphicon glyphicon-ok-sign green"></span> = {{ constant('TestsetRun::RESULT_SUCCESS') }} as flaky,
+<span class="glyphicon glyphicon-remove red"></span> = {{ constant('TestsetRun::RESULT_FAILURE') }});
+details on the runs are available as tooltip on result icon.</li>
+</ul>
+</div>
+</div>
+
+{% if runsAvailable %}
+
+{##### Latest Status #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Latest Status</h4>
+</div>
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th>project</th>
+<th>latest result</th>
+<th class="leftBorder center"><span class="spaceHorizontal glyphicon glyphicon-remove red"></span>failed <span class ="gray">(total)</span></th>
+<th class="showInLargeDisplay"></th>
+<th class="leftBorder center"><span class="spaceHorizontal glyphicon glyphicon-ok-sign green"></span>flaky <span class ="gray">(total)</span></th>
+<th class="showInLargeDisplay"></th>
+</tr>
+</thead>
+<tbody>
+{# Calculate max result count for the bar #}
+{% set maxCount = 1 %}
+{% if (testset.getTestsetResultCounts.passed + testset.getTestsetResultCounts.failed) > maxCount %}
+{% set maxCount = testset.getTestsetResultCounts.passed + testset.getTestsetResultCounts.failed %}
+{% endif %}
+{% if testset.getTestsetFlakyCounts.flaky > maxCount %}
+{% set maxCount = testset.getTestsetFlakyCounts.flaky %}
+{% endif %}
+
+{# Print summary #}
+<tr>
+{# Project name #}
+<td>{{ testset.getProjectName }}</td>
+
+{# Testset status according to the latest build results #}
+{% if testset.getStatus == constant('TestsetRun::RESULT_SUCCESS') %}
+{% set resultIcon = 'glyphicon glyphicon-ok green' %}
+{% elseif testset.getStatus == constant('TestsetRun::RESULT_FAILURE') %}
+{% set resultIcon = 'glyphicon glyphicon-remove red' %}
+{% else %}
+{% set resultIcon = '' %}
+{% endif %}
+<td><span class="spaceHorizontal {{ resultIcon }}"></span>{{ testset.getStatus }}</td>
+
+{# Show failed #}
+{% set failed = testset.getTestsetResultCounts.failed %}
+{% set passed = testset.getTestsetResultCounts.passed %}
+{% set total = passed + failed %}
+<td class="leftBorder center">{{ failed }}<span class ="gray"> ({{ total }})</span></td>
+{# Show results as bars (scaled to BAR_AREA px) #}
+{% set passedBar = ((BAR_AREA/maxCount) * passed)|round(0, 'floor') %}
+{% if (passed > 0) and (passedBar == 0) %}
+{% set passedBar = 1 %}
+{% endif %}
+{% set failedBar = ((BAR_AREA/maxCount)*failed)|round(0, 'floor') %}
+{% if (failed > 0) and (failedBar == 0) %}
+{% set failedBar = 1 %}
+{% endif %}
+<td class="center showInLargeDisplay">
+<div>
+<div class="floatLeft redBackground" style="width: {{ failedBar }}px"><small>{{ failed }}</small></div>
+<div class="floatLeft greenBackground" style="width: {{ passedBar }}px"><small>{{ passed }}</small></div>
+</div>
+</td>
+
+{# Show flaky #}
+{% set flaky = testset.getTestsetFlakyCounts.flaky %}
+{% set total = testset.getTestsetFlakyCounts.total %}
+<td class="leftBorder center">{{ flaky }}<span class ="gray"> ({{ total }})</span></td>
+{# Show results as bars (scaled to BAR_AREA px) #}
+{% set flakyBar = ((BAR_AREA/maxCount)*flaky)|round(0, 'floor') %}
+{% if (flaky > 0) and (flakyBar == 0) %}
+{% set flakyBar = 1 %}
+{% endif %}
+<td class="center showInLargeDisplay">
+{% if flaky > 0 %}
+<div>
+<div class="floatLeft redBackground" style="width: {{ flakyBar }}px"><small>{{ flaky }}</small></div>
+</div>
+{% endif %}
+</td>
+</tr>
+
+</tbody>
+</table>
+</div> {# /table-responsive #}
+</div> {# /panel-body #}
+</div> {# /panel... #}
+
+{##### Results in Branches #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Results in Branches</h4>
+</div>
+</div>
+
+{# Get branches #}
+{% set branches = [] %}
+{% for run in projectBuilds %}
+{% if run.branch not in branches %}
+{% set branches = branches|merge([run.branch]) %}
+{% endif %}
+{% endfor %}
+
+{# Loop all the branches #}
+{% for branch in branches %}
+
+{# Get all build keys #}
+{% set buildKey = '' %}
+{% set buildKeys = [] %}
+{% set dates = [] %}
+{% for run in projectBuilds %}
+{% if run.branch == branch %}
+{% if buildKey != run.buildKey %}
+{% set buildKey = run.buildKey %}
+{% set buildKeys = buildKeys|merge([run.buildKey]) %}
+{% set dates = dates|merge([run.timestamp]) %}
+{% endif %}
+{% endif %}
+{% endfor %}
+
+{# Check if testset run for this branch #}
+{% set testsetBranch = 0 %}
+{% for run in testsetRuns if run.getBranchName == branch %}
+{% set testsetBranch = 1 %}
+{% endfor %}
+
+{# Show branch if testset run for it #}
+{% if testsetBranch %}
+<div class="panel panel-info">
+<div class="panel-heading">
+<h4 class="panel-title bold">{{ branch }}</h4>
+</div>
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th class="bold rightBorder">{{ testset.getName }}</th>
+{% for key, buildKey in buildKeys %}
+<th class="center">
+{% if buildKey|length > 6 %}
+<span class="clickOnTouch" data-toggle="tooltip" data-placement="top" title="{{ buildKey }}">{{ buildKey|slice(0, 4) }}...</span><br>
+{% else %}
+{{ buildKey }}<br>
+{% endif %}
+<span class="gray"><small>{{ dates[key]|date("m-d") }}</small></span>
+</th>
+{% endfor %}
+</tr>
+</thead>
+<tbody>
+{% set confPrev = '' %}
+{% set buildKeyIndexPrinted = -1 %}
+{% set buildKeyFound = 0 %}
+{% for run in testsetRuns if run.getBranchName == branch %}
+
+{# New row for each conf #}
+{% if confPrev != run.getConfName %}
+{# Close previous row #}
+{% if confPrev != '' %}
+{# Fill empty cells at the end of the row #}
+{% for key, buildKey in buildKeys %}
+{% if key > buildKeyIndexPrinted %}
+<td></td>
+{% endif %}
+{% endfor %}
+</tr>
+{% endif %}
+<tr>
+<td class="rightBorder"><small>{{ run.getConfName }}</small></td>
+{% set buildKeyIndexPrinted = -1 %}
+{% endif %}
+
+{# Result per build key #}
+{% set buildKeyFound = 0 %}
+{% for key, buildKey in buildKeys %}
+{# Print each column only once (checked based on column index key and buildKeyFound flag) #}
+{% if key > buildKeyIndexPrinted and not buildKeyFound %}
+{% if buildKey == run.getBuildKey %}
+{# Print result #}
+{% set flaky = '' %}
+{% if run.getResult == constant('TestsetRun::RESULT_SUCCESS') %}
+{% if run.getRun == 1 %}
+{% set resultIcon = 'glyphicon glyphicon-ok green' %}
+{% else %}
+{# Flaky #}
+{% set resultIcon = 'glyphicon glyphicon-ok-sign green' %}
+{% set flaky = ' (on run ' ~ run.getRun ~ ' as flaky)' %}
+{% endif %}
+{% elseif run.getResult == constant('TestsetRun::RESULT_FAILURE') %}
+{% set resultIcon = 'glyphicon glyphicon-remove red' %}
+{% else %}
+{% set resultIcon = '' %}
+{% endif %}
+{% if (run.getDuration / 10) > 60 %}
+{% set durationFormatted = ' (00:' ~ (run.getDuration/10)|date("i:s") ~ ')' %}
+{% else %}
+{% set durationFormatted = '' %}
+{% endif %}
+<td class="center">
+<span class="spaceHorizontal {{ resultIcon }} clickOnTouch" data-toggle="tooltip" data-placement="top" data-html="true"
+title="<table>
+<tr><th>Build key: </th><td>{{ buildKey }}</td></tr>
+<tr><th>Configuration: </th><td>{{ run.getConfName }}</td></tr>
+<tr><th>Timestamp: </th><td>{{ run.getTimestamp }}</td></tr>
+<tr><th>Result: </th><td>{{ run.getResult }} {{ flaky }}</td></tr>
+<tr><th>Duration: </th><td>{{ run.getDuration / 10 }} s {{ durationFormatted }}</td></tr>
+<tr><th>Run #: </th><td>{{ run.getRun }}</td></tr>
+<tr><th>Insignificant: </th><td>{% if run.getInsignificant %}yes{% else %}no{% endif %}</td></tr></table>">
+</span></td>
+{% set buildKeyFound = 1 %}
+{% else %}
+{# Print empty cell #}
+<td></td>
+{% endif %}
+{% set buildKeyIndexPrinted = key %}
+{% endif %}{# key #}
+{% endfor %}{# key #}
+{% set confPrev = run.getConfName %}
+{% endfor %}{# run #}
+
+{# Close last row (also fill empty cells at the end of the row) #}
+{% for key, buildKey in buildKeys %}
+{% if key > buildKeyIndexPrinted %}
+<td></td>
+{% endif %}
+{% endfor %}{# key #}
+</tr>
+</tbody>
+</table>
+</div> {# .table-responsive #}
+</div> {# .panel-body #}
+</div> {# .panel... #}
+{% endif %}{# testsetBranch #}
+{% endfor %}{# branch #}
+
+{% else %}{# runsAvailable #}
+<div class="alert alert-danger" role="alert">
+No test result data available for testset {{ testset.getName }} in project {{ testset.getProjectName }}!
+</div>
+{% endif %}{# runsAvailable #}
+</div> {# .col... #}
+</div> {# .row #}
</div> {# /container-fluid #}
{% include "footer.html" %}
diff --git a/non-puppet/qtmetrics2/templates/testset_project.html b/non-puppet/qtmetrics2/templates/testset_project.html
index a4cf0fb..485985d 100644
--- a/non-puppet/qtmetrics2/templates/testset_project.html
+++ b/non-puppet/qtmetrics2/templates/testset_project.html
@@ -34,8 +34,8 @@
/**
* Testset project page
- * @version 0.1
- * @since 30-06-2015
+ * @version 0.2
+ * @since 10-07-2015
* @author Juha Sippola
*/
@@ -47,296 +47,286 @@
{% set BAR_AREA = 60 %}
<ol class="breadcrumb">
- {% for link in breadcrumb %}
- <li><a href="{{ link.link }}">{{ link.name }}</a></li>
- {% endfor %}
- <li class="active">{{ project }}</li>
+{% for link in breadcrumb %}
+<li><a href="{{ link.link }}">{{ link.name }}</a></li>
+{% endfor %}
+<li class="active">{{ project }}</li>
</ol>
<div class="container-fluid">
- <div class="row">
-
- <div class="col-sm-12 col-md-12 main">
-
- {# Check if any runs available #}
- {% set runsAvailable = 0 %}
- {% for run in confBuilds %}
- {% set runsAvailable = 1 %}
- {% endfor %}
-
- {##### Title #####}
-
- <h1 class="page-header">
- {{ project }}
- <button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
- <span class="glyphicon glyphicon-info-sign"></span>
- </button>
- <small>{{ refreshed }}</small>
- </h1>
-
- {##### Info well #####}
-
- <div class="collapse" id="info">
- <div class="well infoWell">
- <span class="glyphicon glyphicon-info-sign"></span> <strong>Testset project</strong><br>
- <ul>
- <li><strong>Latest Status</strong> shows the status based on the results of {{ project }}
- testsets in the latest <strong>{{ masterProject }} {{ masterState }}</strong> builds
- in any configuration across all branches.</li>
- <li><strong>Results in Branches</strong> shows the results of {{ project }} testsets by branch
- and their configuration in <strong>{{ masterProject }} {{ masterState }}</strong> builds
- ( <button type="button" class="btn btn-xs btn-success"><span class="badge">n</span></button> = all n testsets passed,
- <button type="button" class="btn btn-xs btn-danger"><span class="badge">n</span></button> = n testsets failed);
- details are available as tooltip on result icon.</li>
- </ul>
- </div>
- </div>
-
- {% if runsAvailable %}
-
- {##### Latest Status #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Latest Status</h4>
- </div>
-
- {# Get branches #}
- {% set branches = [] %}
- {% for run in latestTestsetRuns %}
- {% if run.branch not in branches %}
- {% set branches = branches|merge([run.branch]) %}
- {% endif %}
- {% endfor %}
-
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th class="rightBorder">testset project</th>
- {% for branch in branches %}
- <th class="center">{{ branch }}<br>
- <small>failed <span class ="gray">(total)</span></small>
- </th>
- <th class="showInLargeDisplay"></th>
- {% endfor %}
- </tr>
- </thead>
- <tbody>
- {# Calculate max failed result count for the bar #}
- {% set maxCount = 1 %}
- {% for run in latestTestsetRuns %}
- {% if run.failed > maxCount %}
- {% set maxCount = run.failed %}
- {% endif %}
- {% endfor %}
-
- <tr>
- {# Project name #}
- <td class="rightBorder">{{ project }}</td>
-
- {# Result (by branch) #}
- {% for branch in branches %}
- {% for run in latestTestsetRuns if project == run.project and branch == run.branch %}
-
- {# Show results #}
- {% set failed = run.failed %}
- {% set passed = run.passed %}
- {% set total = passed + failed %}
- <td class="center">{{ failed }}<span class ="gray"> ({{ total }})</span></td>
-
- {# Show results as bars (scaled to BAR_AREA px) #}
- {% set failedBar = ((BAR_AREA/maxCount) * failed)|round(0, 'floor') %}
- {% if (failed > 0) and (failedBar == 0) %}
- {% set failedBar = 1 %}
- {% endif %}
- {% if failed == 0 %}
- {% set failed = '' %}
- {% endif %}
- {% if (passed > 0) and (failed == 0) %}
- {% set passedBar = BAR_AREA %}
- {% else %}
- {% set passed = '' %}
- {% endif %}
- <td class="center showInLargeDisplay">
- <div>
- <div class="floatLeft redBackground" style="width: {{ failedBar }}px">{{ failed }}</div>
- <div class="floatLeft greenBackground" style="width: {{ passedBar }}px">{{ passed }}</div>
- </div>
- </td>
- {% else %}
- <td></td>
- {% endfor %}
- {% endfor %}
- </tr>
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
-
- {##### Results in Branches #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Results in Branches</h4>
- </div>
- </div>
-
- {# Get branches #}
- {% set branches = [] %}
- {% for run in projectBuilds %}
- {% if run.branch not in branches %}
- {% set branches = branches|merge([run.branch]) %}
- {% endif %}
- {% endfor %}
-
- {# Loop all the branches #}
- {% for branch in branches %}
-
- {# Get all build keys #}
- {% set buildKey = '' %}
- {% set buildKeys = [] %}
- {% set dates = [] %}
- {% for run in projectBuilds %}
- {% if run.branch == branch %}
- {% if buildKey != run.buildKey %}
- {% set buildKey = run.buildKey %}
- {% set buildKeys = buildKeys|merge([run.buildKey]) %}
- {% set dates = dates|merge([run.timestamp]) %}
- {% endif %}
- {% endif %}
- {% endfor %}
-
- {# Check if testsets run for this branch #}
- {% set testsetBranch = 0 %}
- {% for run in confBuilds if run.branch == branch %}
- {% set testsetBranch = 1 %}
- {% endfor %}
-
- {# Show branch if testsets run for it #}
- {% if testsetBranch %}
- <div class="panel panel-info">
- <div class="panel-heading">
- <h4 class="panel-title bold">{{ branch }}</h4>
- </div>
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th class="bold rightBorder">{{ project }}</th>
- {% for key, buildKey in buildKeys %}
- <th class="center">
- {% if buildKey|length > 6 %}
- <span class="clickOnTouch" data-toggle="tooltip" data-placement="top"
- title="{{ buildKey }}">{{ buildKey|slice(0, 4) }}...
- </span>
- {% else %}
- {{ buildKey }}
- {% endif %}
- <br>
- <span class="gray"><small>{{ dates[key]|date("m-d") }}</small></span>
- </th>
- {% endfor %}
- </tr>
- </thead>
- <tbody>
- {% set confPrev = '' %}
- {% set buildKeyIndexPrinted = -1 %}
- {% set buildKeyFound = 0 %}
- {% for run in confBuilds if run.branch == branch %}
-
- {# New row for each conf #}
- {% if confPrev != run.conf %}
- {# Close previous row #}
- {% if confPrev != '' %}
- {# Fill empty cells at the end of the row #}
- {% for key, buildKey in buildKeys %}
- {% if key > buildKeyIndexPrinted %}
- <td></td>
- {% endif %}
- {% endfor %}
- </tr>
- {% endif %}
- <tr>
- <td class="rightBorder"><small>{{ run.conf }}</small></td>
- {% set buildKeyIndexPrinted = -1 %}
- {% endif %}
-
- {# Result per build key #}
- {% set buildKeyFound = 0 %}
- {% for key, buildKey in buildKeys %}
- {# Print each column only once (checked based on column index key and buildKeyFound flag) #}
- {% if key > buildKeyIndexPrinted and not buildKeyFound %}
- {% if buildKey == run.buildKey %}
- {# Print results #}
- <td class="center">
- {% if (run.failed + run.ifailed) > 0 %}
- <button type="button" class="btn btn-xs btn-danger clickOnTouch"
- data-toggle="tooltip" data-placement="top" data-html="true"
- title="<table>
- <tr><th>Build key: </th><td>{{ buildKey }}</td></tr>
- <tr><th>Configuration: </th><td>{{ run.conf }}</td></tr>
- <tr><th>Testsets passed: </th><td>{{ run.passed }}</td></tr>
- <tr><th>Testsets passed (insignificant): </th><td>{{ run.ipassed }}</td></tr>
- <tr><th>Testsets failed: </th><td>{{ run.failed }}</td></tr>
- <tr><th>Testsets failed (insignificant): </th><td>{{ run.ifailed }}</td></tr>
- </table>">
- <span class="badge">{{ run.failed + run.ifailed }}</span>
- </button>
- {% elseif (run.passed + run.ipassed) > 0 %}
- <button type="button" class="btn btn-xs btn-success clickOnTouch"
- data-toggle="tooltip" data-placement="top" data-html="true"
- title="<table>
- <tr><th>Build key: </th><td>{{ buildKey }}</td></tr>
- <tr><th>Configuration: </th><td>{{ run.conf }}</td></tr>
- <tr><th>Testsets passed: </th><td>{{ run.passed }}</td></tr>
- <tr><th>Testsets passed (insignificant): </th><td>{{ run.ipassed }}</td></tr>
- <tr><th>Testsets failed: </th><td>{{ run.failed }}</td></tr>
- <tr><th>Testsets failed (insignificant): </th><td>{{ run.ifailed }}</td></tr>
- </table>">
- <span class="badge"><small>{{ run.passed + run.ipassed }}</small></span>
- </button>
- {% endif %}
- </td>
- {% set buildKeyFound = 1 %}
- {% else %}
- {# Print empty cell #}
- <td></td>
- {% endif %}
- {% set buildKeyIndexPrinted = key %}
- {% endif %}
- {% endfor %}
- {% set confPrev = run.conf %}
- {% endfor %}
-
- {# Close last row (also fill empty cells at the end of the row) #}
- {% for key, buildKey in buildKeys %}
- {% if key > buildKeyIndexPrinted %}
- <td></td>
- {% endif %}
- {% endfor %}
- </tr>
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
- {% endif %} {# testsetBranch #}
- {% endfor %}
-
- {% else %} {# runsAvailable #}
- <div class="alert alert-danger" role="alert">
- No test result data available for project {{ project }}!
- </div>
- {% endif %}
-
- </div> {# /col... #}
- </div> {# /row #}
-
-</div> {# /container-fluid #}
+<div class="row">
+
+<div class="col-sm-12 col-md-12 main">
+
+{# Check if any runs available #}
+{% set runsAvailable = 0 %}
+{% for run in confBuilds %}
+{% set runsAvailable = 1 %}
+{% endfor %}
+
+{##### Title #####}
+
+<h1 class="page-header">
+{{ project }}
+<button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
+<span class="glyphicon glyphicon-info-sign"></span>
+</button>
+<small>{{ refreshed }}</small>
+</h1>
+
+{##### Info well #####}
+
+<div class="collapse" id="info">
+<div class="well infoWell">
+<span class="glyphicon glyphicon-info-sign"></span> <strong>Testset project</strong><br>
+<ul>
+<li><strong>Latest Status</strong> shows the status based on the results of {{ project }}
+testsets in the latest <strong>{{ masterProject }} {{ masterState }}</strong> builds
+in any configuration across all branches.</li>
+<li><strong>Results in Branches</strong> shows the results of {{ project }} testsets by branch
+and their configuration in <strong>{{ masterProject }} {{ masterState }}</strong> builds
+( <button type="button" class="btn btn-xs btn-success"><span class="badge">n</span></button> = all n testsets passed,
+<button type="button" class="btn btn-xs btn-danger"><span class="badge">n</span></button> = n testsets failed);
+details are available as tooltip on result icon.</li>
+</ul>
+</div>
+</div>
+
+{% if runsAvailable %}
+
+{##### Latest Status #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Latest Status</h4>
+</div>
+
+{# Get branches #}
+{% set branches = [] %}
+{% for run in latestTestsetRuns %}
+{% if run.branch not in branches %}
+{% set branches = branches|merge([run.branch]) %}
+{% endif %}
+{% endfor %}
+
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th class="rightBorder">testset project</th>
+{% for branch in branches %}
+<th class="center">{{ branch }}<br>
+<small>failed <span class ="gray">(total)</span></small>
+</th>
+<th class="showInLargeDisplay"></th>
+{% endfor %}
+</tr>
+</thead>
+<tbody>
+{# Calculate max failed result count for the bar #}
+{% set maxCount = 1 %}
+{% for run in latestTestsetRuns %}
+{% if run.failed > maxCount %}
+{% set maxCount = run.failed %}
+{% endif %}
+{% endfor %}
+
+<tr>
+{# Project name #}
+<td class="rightBorder">{{ project }}</td>
+
+{# Result (by branch) #}
+{% for branch in branches %}
+{% for run in latestTestsetRuns if project == run.project and branch == run.branch %}
+
+{# Show results #}
+{% set failed = run.failed %}
+{% set passed = run.passed %}
+{% set total = passed + failed %}
+<td class="center">{{ failed }}<span class ="gray"> ({{ total }})</span></td>
+
+{# Show results as bars (scaled to BAR_AREA px) #}
+{% set failedBar = ((BAR_AREA/maxCount) * failed)|round(0, 'floor') %}
+{% if (failed > 0) and (failedBar == 0) %}
+{% set failedBar = 1 %}
+{% endif %}
+{% if failed == 0 %}
+{% set failed = '' %}
+{% endif %}
+{% if (passed > 0) and (failed == 0) %}
+{% set passedBar = BAR_AREA %}
+{% else %}
+{% set passed = '' %}
+{% endif %}
+<td class="center showInLargeDisplay">
+<div>
+<div class="floatLeft redBackground" style="width: {{ failedBar }}px">{{ failed }}</div>
+<div class="floatLeft greenBackground" style="width: {{ passedBar }}px">{{ passed }}</div>
+</div>
+</td>
+{% else %}{# for #}
+<td></td>
+{% endfor %}
+{% endfor %}
+</tr>
+</tbody>
+</table>
+</div> {# .table-responsive #}
+</div> {# .panel-body #}
+</div> {# .panel... #}
+
+{##### Results in Branches #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Results in Branches</h4>
+</div>
+</div>
+
+{# Get branches #}
+{% set branches = [] %}
+{% for run in projectBuilds %}
+{% if run.branch not in branches %}
+{% set branches = branches|merge([run.branch]) %}
+{% endif %}
+{% endfor %}
+
+{# Loop all the branches #}
+{% for branch in branches %}
+
+{# Get all build keys #}
+{% set buildKey = '' %}
+{% set buildKeys = [] %}
+{% set dates = [] %}
+{% for run in projectBuilds %}
+{% if run.branch == branch %}
+{% if buildKey != run.buildKey %}
+{% set buildKey = run.buildKey %}
+{% set buildKeys = buildKeys|merge([run.buildKey]) %}
+{% set dates = dates|merge([run.timestamp]) %}
+{% endif %}
+{% endif %}
+{% endfor %}
+
+{# Check if testsets run for this branch #}
+{% set testsetBranch = 0 %}
+{% for run in confBuilds if run.branch == branch %}
+{% set testsetBranch = 1 %}
+{% endfor %}
+
+{# Show branch if testsets run for it #}
+{% if testsetBranch %}
+<div class="panel panel-info">
+<div class="panel-heading">
+<h4 class="panel-title bold">{{ branch }}</h4>
+</div>
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th class="bold rightBorder">{{ project }}</th>
+{% for key, buildKey in buildKeys %}
+<th class="center">
+{% if buildKey|length > 6 %}
+<span class="clickOnTouch" data-toggle="tooltip" data-placement="top" title="{{ buildKey }}">{{ buildKey|slice(0, 4) }}...</span><br>
+{% else %}
+{{ buildKey }}<br>
+{% endif %}
+<span class="gray"><small>{{ dates[key]|date("m-d") }}</small></span>
+</th>
+{% endfor %}
+</tr>
+</thead>
+<tbody>
+{% set confPrev = '' %}
+{% set buildKeyIndexPrinted = -1 %}
+{% set buildKeyFound = 0 %}
+{% for run in confBuilds if run.branch == branch %}
+
+{# New row for each conf #}
+{% if confPrev != run.conf %}
+{# Close previous row #}
+{% if confPrev != '' %}
+{# Fill empty cells at the end of the row #}
+{% for key, buildKey in buildKeys %}
+{% if key > buildKeyIndexPrinted %}
+<td></td>
+{% endif %}
+{% endfor %}
+</tr>
+{% endif %}
+<tr>
+<td class="rightBorder"><small>{{ run.conf }}</small></td>
+{% set buildKeyIndexPrinted = -1 %}
+{% endif %}
+
+{# Result per build key #}
+{% set buildKeyFound = 0 %}
+{% for key, buildKey in buildKeys %}
+{# Print each column only once (checked based on column index key and buildKeyFound flag) #}
+{% if key > buildKeyIndexPrinted and not buildKeyFound %}
+{% if buildKey == run.buildKey %}
+{# Print results #}
+<td class="center">
+{% if (run.failed + run.ifailed) > 0 %}
+<button type="button" class="btn btn-xs btn-danger clickOnTouch" data-toggle="tooltip" data-placement="top" data-html="true"
+title="<table>
+<tr><th>Build key: </th><td>{{ buildKey }}</td></tr>
+<tr><th>Configuration: </th><td>{{ run.conf }}</td></tr>
+<tr><th>Testsets passed: </th><td>{{ run.passed }}</td></tr>
+<tr><th>Testsets passed (insignificant): </th><td>{{ run.ipassed }}</td></tr>
+<tr><th>Testsets failed: </th><td>{{ run.failed }}</td></tr>
+<tr><th>Testsets failed (insignificant): </th><td>{{ run.ifailed }}</td></tr></table>">
+<span class="badge">{{ run.failed + run.ifailed }}</span></button>
+{% elseif (run.passed + run.ipassed) > 0 %}
+<button type="button" class="btn btn-xs btn-success clickOnTouch" data-toggle="tooltip" data-placement="top" data-html="true"
+title="<table>
+<tr><th>Build key: </th><td>{{ buildKey }}</td></tr>
+<tr><th>Configuration: </th><td>{{ run.conf }}</td></tr>
+<tr><th>Testsets passed: </th><td>{{ run.passed }}</td></tr>
+<tr><th>Testsets passed (insignificant): </th><td>{{ run.ipassed }}</td></tr>
+<tr><th>Testsets failed: </th><td>{{ run.failed }}</td></tr>
+<tr><th>Testsets failed (insignificant): </th><td>{{ run.ifailed }}</td></tr></table>">
+<span class="badge"><small>{{ run.passed + run.ipassed }}</small></span></button>
+{% endif %}
+</td>
+{% set buildKeyFound = 1 %}
+{% else %}
+{# Print empty cell #}
+<td></td>
+{% endif %}
+{% set buildKeyIndexPrinted = key %}
+{% endif %}
+{% endfor %}
+{% set confPrev = run.conf %}
+{% endfor %}
+
+{# Close last row (also fill empty cells at the end of the row) #}
+{% for key, buildKey in buildKeys %}
+{% if key > buildKeyIndexPrinted %}
+<td></td>
+{% endif %}
+{% endfor %}
+</tr>
+</tbody>
+</table>
+</div> {# .table-responsive #}
+</div> {# .panel-body #}
+</div> {# .panel... #}
+{% endif %}{# testsetBranch #}
+{% endfor %}{# branch #}
+
+{% else %}{# runsAvailable #}
+<div class="alert alert-danger" role="alert">
+No test result data available for project {{ project }}!
+</div>
+{% endif %}{# runsAvailable #}
+
+</div> {# .col... #}
+</div> {# .row #}
+</div> {# .container-fluid #}
{% include "footer.html" %}
diff --git a/non-puppet/qtmetrics2/templates/testsets_flaky.html b/non-puppet/qtmetrics2/templates/testsets_flaky.html
index 018881f..d54c9eb 100644
--- a/non-puppet/qtmetrics2/templates/testsets_flaky.html
+++ b/non-puppet/qtmetrics2/templates/testsets_flaky.html
@@ -34,8 +34,8 @@
/**
* Flaky testsets page
- * @version 0.3
- * @since 24-06-2015
+ * @version 0.4
+ * @since 10-07-2015
* @author Juha Sippola
*/
@@ -53,101 +53,101 @@
#}
<ol class="breadcrumb">
- {% for link in breadcrumb %}
- <li><a href="{{ link.link }}">{{ link.name }}</a></li>
- {% endfor %}
- <li class="active">flaky testsets</li>
+{% for link in breadcrumb %}
+<li><a href="{{ link.link }}">{{ link.name }}</a></li>
+{% endfor %}
+<li class="active">flaky testsets</li>
</ol>
<div class="container-fluid">
- <div class="row">
-
- <div class="col-sm-12 col-md-12 main">
-
- {##### Title #####}
-
- <h1 class="page-header">
- Top {{ topN }} Flaky Testsets
- <button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
- <span class="glyphicon glyphicon-info-sign"></span>
- </button>
- <small>{{ refreshed }}</small>
- </h1>
-
- {##### Info well #####}
-
- <div class="collapse" id="info">
- <div class="well infoWell">
- <span class="glyphicon glyphicon-info-sign"></span> <strong>Flaky testsets</strong><br>
- <ul>
- <li>Flaky testsets are those that fail on the first run but, when rerun, they pass.</li>
- <li><strong>flaky</strong> count shows the number of <strong>all</strong> builds where
- the testset is flaky (during the last {{ lastDays }} days).</li>
- </ul>
- </div>
- </div>
-
- {##### Flaky list #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Last {{ lastDays }} days <small>(since {{ sinceDate }})</small></h4>
- </div>
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th>testset</th>
- <th>project</th>
- <th class="leftBorder center">flaky <span class ="gray">(total)</span></th>
- <th class="showInLargeDisplay">flaky</th>
- </tr>
- </thead>
- <tbody>
- {# Calculate max result count for the bar #}
- {% set maxCount = 1 %}
- {% for testset in testsets %}
- {% if testset.getTestsetFlakyCounts.flaky > maxCount %}
- {% set maxCount = testset.getTestsetFlakyCounts.flaky %}
- {% endif %}
- {% endfor %}
-
- {# Print testsets #}
- {% for testset in testsets %}
- <tr>
- {# Testset name #}
- <td><a href="{{ testsetRoute }}/{{ testset.getName }}/{{ testset.getProjectName }}">{{ testset.getName }}</a></td>
-
- {# Project name #}
- <td>{{ testset.getProjectName }}</td>
-
- {# Show results as numbers #}
- {% set flaky = testset.getTestsetFlakyCounts.flaky %}
- {% set total = testset.getTestsetFlakyCounts.total %}
- <td class="leftBorder center">{{ flaky }}<span class ="gray"> ({{ total }})</span></td>
-
- {# Show results as bars (scaled to BAR_AREA px) #}
- {% set flakyBar = ((BAR_AREA/maxCount)*flaky)|round(0, 'floor') %}
- {% if (flaky > 0) and (flakyBar == 0) %}
- {% set flakyBar = 1 %}
- {% endif %}
- <td class="center showInLargeDisplay">
- <div>
- <div class="floatLeft redBackground" style="width: {{ flakyBar }}px">&nbsp;</div>
- </div>
- </td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
-
- </div> {# /col... #}
- </div> {# /row #}
-</div> {# /container-fluid #}
+<div class="row">
+
+<div class="col-sm-12 col-md-12 main">
+
+{##### Title #####}
+
+<h1 class="page-header">
+Top {{ topN }} Flaky Testsets
+<button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
+<span class="glyphicon glyphicon-info-sign"></span>
+</button>
+<small>{{ refreshed }}</small>
+</h1>
+
+{##### Info well #####}
+
+<div class="collapse" id="info">
+<div class="well infoWell">
+<span class="glyphicon glyphicon-info-sign"></span> <strong>Flaky testsets</strong><br>
+<ul>
+<li>Flaky testsets are those that fail on the first run but, when rerun, they pass.</li>
+<li><strong>flaky</strong> count shows the number of <strong>all</strong> builds where
+the testset is flaky (during the last {{ lastDays }} days).</li>
+</ul>
+</div>
+</div>
+
+{##### Flaky list #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Last {{ lastDays }} days <small>(since {{ sinceDate }})</small></h4>
+</div>
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th>testset</th>
+<th>project</th>
+<th class="leftBorder center">flaky <span class ="gray">(total)</span></th>
+<th class="showInLargeDisplay">flaky</th>
+</tr>
+</thead>
+<tbody>
+{# Calculate max result count for the bar #}
+{% set maxCount = 1 %}
+{% for testset in testsets %}
+{% if testset.getTestsetFlakyCounts.flaky > maxCount %}
+{% set maxCount = testset.getTestsetFlakyCounts.flaky %}
+{% endif %}
+{% endfor %}
+
+{# Print testsets #}
+{% for testset in testsets %}
+<tr>
+{# Testset name #}
+<td><a href="{{ testsetRoute }}/{{ testset.getName }}/{{ testset.getProjectName }}">{{ testset.getName }}</a></td>
+
+{# Project name #}
+<td>{{ testset.getProjectName }}</td>
+
+{# Show results as numbers #}
+{% set flaky = testset.getTestsetFlakyCounts.flaky %}
+{% set total = testset.getTestsetFlakyCounts.total %}
+<td class="leftBorder center">{{ flaky }}<span class ="gray"> ({{ total }})</span></td>
+
+{# Show results as bars (scaled to BAR_AREA px) #}
+{% set flakyBar = ((BAR_AREA/maxCount)*flaky)|round(0, 'floor') %}
+{% if (flaky > 0) and (flakyBar == 0) %}
+{% set flakyBar = 1 %}
+{% endif %}
+<td class="center showInLargeDisplay">
+<div>
+<div class="floatLeft redBackground" style="width: {{ flakyBar }}px">&nbsp;</div>
+</div>
+</td>
+</tr>
+{% endfor %}{# testset #}
+</tbody>
+</table>
+</div> {# .table-responsive #}
+</div> {# .panel-body #}
+</div> {# .panel... #}
+
+</div> {# .col... #}
+</div> {# .row #}
+</div> {# .container-fluid #}
{% include "footer.html" %}
diff --git a/non-puppet/qtmetrics2/templates/testsets_top.html b/non-puppet/qtmetrics2/templates/testsets_top.html
index a9abec5..3b95a9b 100644
--- a/non-puppet/qtmetrics2/templates/testsets_top.html
+++ b/non-puppet/qtmetrics2/templates/testsets_top.html
@@ -34,8 +34,8 @@
/**
* Top failures (testsets) page
- * @version 0.4
- * @since 24-06-2015
+ * @version 0.5
+ * @since 10-07-2015
* @author Juha Sippola
*/
@@ -53,120 +53,120 @@
#}
<ol class="breadcrumb">
- {% for link in breadcrumb %}
- <li><a href="{{ link.link }}">{{ link.name }}</a></li>
- {% endfor %}
- <li class="active">top failures</li>
+{% for link in breadcrumb %}
+<li><a href="{{ link.link }}">{{ link.name }}</a></li>
+{% endfor %}
+<li class="active">top failures</li>
</ol>
<div class="container-fluid">
- <div class="row">
-
- <div class="col-sm-12 col-md-12 main">
-
- {##### Title #####}
-
- <h1 class="page-header">
- Top {{ topN }} Failures
- <button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
- <span class="glyphicon glyphicon-info-sign"></span>
- </button>
- <small>{{ refreshed }}</small>
- </h1>
-
- {##### Info well #####}
-
- <div class="collapse" id="info">
- <div class="well infoWell">
- <span class="glyphicon glyphicon-info-sign"></span> <strong>Top failures</strong><br>
- <ul>
- <li>Lists testsets by number of <strong>{{ masterProject }} {{ masterState }}</strong>
- builds where it failed during the last {{ lastDays }} days.</li>
- <li><strong>latest result</strong> shows the overall testset status based on the latest
- <strong>{{ masterProject }} {{ masterState }}</strong> builds across all branches
- (shows failed if failed in one or in several).</li>
- </ul>
- </div>
- </div>
-
- {##### Top list #####}
-
- <div class="panel panel-primary">
- <div class="panel-heading">
- <h4 class="panel-title bold">Last {{ lastDays }} days <small>(since {{ sinceDate }})</small></h4>
- </div>
- <div class="panel-body">
- <div class="table-responsive">
- <table class="table table-striped">
- <thead>
- <tr>
- <th>testset</th>
- <th class="showInLargeDisplay">project</th>
- <th>latest result</th>
- <th class="leftBorder center">failed <span class ="gray">(total)</span></th>
- <th class="showInLargeDisplay">failed + passed</th>
- </tr>
- </thead>
- <tbody>
- {# Calculate max result count for the bar #}
- {% set maxCount = 1 %}
- {% for testset in testsets %}
- {% if (testset.getTestsetResultCounts.passed + testset.getTestsetResultCounts.failed) > maxCount %}
- {% set maxCount = testset.getTestsetResultCounts.passed + testset.getTestsetResultCounts.failed %}
- {% endif %}
- {% endfor %}
-
- {# Print testsets #}
- {% for testset in testsets %}
- <tr>
- {# Testset name #}
- <td><a href="{{ testsetRoute }}/{{ testset.getName }}/{{ testset.getProjectName }}">{{ testset.getName }}</a></td>
-
- {# Project name #}
- <td class="showInLargeDisplay">{{ testset.getProjectName }}</td>
-
- {# Testset status according to the latest build results #}
- {% if testset.getStatus == constant('testsetRun::RESULT_SUCCESS') %}
- {% set resultIcon = 'glyphicon glyphicon-ok green' %}
- {% elseif testset.getStatus == constant('testsetRun::RESULT_FAILURE') %}
- {% set resultIcon = 'glyphicon glyphicon-remove red' %}
- {% else %}
- {% set resultIcon = '' %}
- {% endif %}
- <td><span class="spaceHorizontal {{ resultIcon }}"></span>{{ testset.getStatus }}</td>
-
- {# Show results as numbers #}
- {% set failed = testset.getTestsetResultCounts.failed %}
- {% set passed = testset.getTestsetResultCounts.passed %}
- {% set total = passed + failed %}
- <td class="leftBorder center">{{ failed }}<span class ="gray"> ({{ total }})</span></td>
-
- {# Show results as bars (scaled to BAR_AREA px) #}
- {% set passedBar = ((BAR_AREA/maxCount) * passed)|round(0, 'floor') %}
- {% if (passed > 0) and (passedBar == 0) %}
- {% set passedBar = 1 %}
- {% endif %}
- {% set failedBar = ((BAR_AREA/maxCount)*failed)|round(0, 'floor') %}
- {% if (failed > 0) and (failedBar == 0) %}
- {% set failedBar = 1 %}
- {% endif %}
- <td class="center showInLargeDisplay">
- <div>
- <div class="floatLeft redBackground" style="width: {{ failedBar }}px">&nbsp;</div>
- <div class="floatLeft greenBackground" style="width: {{ passedBar }}px">&nbsp;</div>
- </div>
- </td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div> {# /table-responsive #}
- </div> {# /panel-body #}
- </div> {# /panel... #}
-
- </div> {# /col... #}
- </div> {# /row #}
-</div> {# /container-fluid #}
+<div class="row">
+
+<div class="col-sm-12 col-md-12 main">
+
+{##### Title #####}
+
+<h1 class="page-header">
+Top {{ topN }} Failures
+<button type="button" class="btn btn-xs btn-info" data-toggle="collapse" data-target="#info" aria-expanded="false" aria-controls="info">
+<span class="glyphicon glyphicon-info-sign"></span>
+</button>
+<small>{{ refreshed }}</small>
+</h1>
+
+{##### Info well #####}
+
+<div class="collapse" id="info">
+<div class="well infoWell">
+<span class="glyphicon glyphicon-info-sign"></span> <strong>Top failures</strong><br>
+<ul>
+<li>Lists testsets by number of <strong>{{ masterProject }} {{ masterState }}</strong>
+builds where it failed during the last {{ lastDays }} days.</li>
+<li><strong>latest result</strong> shows the overall testset status based on the latest
+<strong>{{ masterProject }} {{ masterState }}</strong> builds across all branches
+(shows failed if failed in one or in several).</li>
+</ul>
+</div>
+</div>
+
+{##### Top list #####}
+
+<div class="panel panel-primary">
+<div class="panel-heading">
+<h4 class="panel-title bold">Last {{ lastDays }} days <small>(since {{ sinceDate }})</small></h4>
+</div>
+<div class="panel-body">
+<div class="table-responsive">
+<table class="table table-striped">
+<thead>
+<tr>
+<th>testset</th>
+<th class="showInLargeDisplay">project</th>
+<th>latest result</th>
+<th class="leftBorder center">failed <span class ="gray">(total)</span></th>
+<th class="showInLargeDisplay">failed + passed</th>
+</tr>
+</thead>
+<tbody>
+{# Calculate max result count for the bar #}
+{% set maxCount = 1 %}
+{% for testset in testsets %}
+{% if (testset.getTestsetResultCounts.passed + testset.getTestsetResultCounts.failed) > maxCount %}
+{% set maxCount = testset.getTestsetResultCounts.passed + testset.getTestsetResultCounts.failed %}
+{% endif %}
+{% endfor %}
+
+{# Print testsets #}
+{% for testset in testsets %}
+<tr>
+{# Testset name #}
+<td><a href="{{ testsetRoute }}/{{ testset.getName }}/{{ testset.getProjectName }}">{{ testset.getName }}</a></td>
+
+{# Project name #}
+<td class="showInLargeDisplay">{{ testset.getProjectName }}</td>
+
+{# Testset status according to the latest build results #}
+{% if testset.getStatus == constant('testsetRun::RESULT_SUCCESS') %}
+{% set resultIcon = 'glyphicon glyphicon-ok green' %}
+{% elseif testset.getStatus == constant('testsetRun::RESULT_FAILURE') %}
+{% set resultIcon = 'glyphicon glyphicon-remove red' %}
+{% else %}
+{% set resultIcon = '' %}
+{% endif %}
+<td><span class="spaceHorizontal {{ resultIcon }}"></span>{{ testset.getStatus }}</td>
+
+{# Show results as numbers #}
+{% set failed = testset.getTestsetResultCounts.failed %}
+{% set passed = testset.getTestsetResultCounts.passed %}
+{% set total = passed + failed %}
+<td class="leftBorder center">{{ failed }}<span class ="gray"> ({{ total }})</span></td>
+
+{# Show results as bars (scaled to BAR_AREA px) #}
+{% set passedBar = ((BAR_AREA/maxCount) * passed)|round(0, 'floor') %}
+{% if (passed > 0) and (passedBar == 0) %}
+{% set passedBar = 1 %}
+{% endif %}
+{% set failedBar = ((BAR_AREA/maxCount)*failed)|round(0, 'floor') %}
+{% if (failed > 0) and (failedBar == 0) %}
+{% set failedBar = 1 %}
+{% endif %}
+<td class="center showInLargeDisplay">
+<div>
+<div class="floatLeft redBackground" style="width: {{ failedBar }}px">&nbsp;</div>
+<div class="floatLeft greenBackground" style="width: {{ passedBar }}px">&nbsp;</div>
+</div>
+</td>
+</tr>
+{% endfor %}{# testset #}
+</tbody>
+</table>
+</div> {# .table-responsive #}
+</div> {# .panel-body #}
+</div> {# .panel... #}
+
+</div> {# .col... #}
+</div> {# .row #}
+</div> {# .container-fluid #}
{% include "footer.html" %}