254 lines
6.9 KiB
HTML
254 lines
6.9 KiB
HTML
{% extends "layout.html" %}
|
|
{% import 'forms.html' as forms %}
|
|
{% from "change_macros.html" import change with context %}
|
|
|
|
{% block content %}
|
|
<div class="container">
|
|
|
|
<h1 style="white-space: nowrap;">
|
|
Builder <a href="{{ path_to_builder }}">{{ b.getBuilder().getName() }}</a>
|
|
Build #{{ b.getNumber() }}
|
|
</h1>
|
|
|
|
{% if not b.isFinished() %}
|
|
<h2>Build In Progress:</h2>
|
|
|
|
{% if when_time %}
|
|
<p>ETA: {{ when_time }} [{{ when }}]</p>
|
|
{% endif %}
|
|
|
|
{{ current_step }}
|
|
|
|
{% if authz.advertiseAction('stopBuild', request) %}
|
|
<h2>Stop Build</h2>
|
|
{{ forms.stop_build(build_url+"/stop", authz, on_all=False, short=False, label='This Build') }}
|
|
{% endif %}
|
|
{% else %}
|
|
<h2>Results:</h2>
|
|
|
|
|
|
<p><span class="btn-{% if result_css == "success" %}{{ result_css }}{% else %}danger{% endif %} btn btn-default btn-block btn-squishy disabled">
|
|
{{ b.getText()|join(' ')|capitalize }}
|
|
</span>
|
|
</p>
|
|
|
|
{% if b.getTestResults() %}
|
|
<h3><a href="{{ tests_link }}"/></h3>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
<h2>
|
|
{% if sourcestamps|count == 1 %}
|
|
SourceStamp:
|
|
{% else %}
|
|
SourceStamps:
|
|
{% endif %}
|
|
</h2>
|
|
|
|
{% for sourcestamps_row in sourcestamps | batch(3, ' ') %}
|
|
<div class="row flex">
|
|
{% for ss in sourcestamps_row %}
|
|
<div class="col-md-4">
|
|
<div class="box">
|
|
<h3>{{ ss }}</h3>
|
|
<table class="table table-striped table-hover box">
|
|
{% set ss_class = cycler('alt','') %}
|
|
|
|
{% if ss.project %}
|
|
<tr class="{{ ss_class.next() }}"><td>Project</td><td>{{ ss.project|projectlink }}</td></tr>
|
|
{% endif %}
|
|
|
|
{% if ss.repository %}
|
|
<tr class="{{ ss_class.next() }}"><td>Repository</td><td>{{ ss.repository|repolink }}</td></tr>
|
|
{% endif %}
|
|
|
|
{% if ss.branch %}
|
|
<tr class="{{ ss_class.next() }}"><td>Branch</td><td>{{ ss.branch|e }}</td></tr>
|
|
{% endif %}
|
|
|
|
{% if ss.revision %}
|
|
<tr class="{{ ss_class.next() }}"><td>Revision</td><td>{{ ss.revision|revlink(ss.repository) }}</td></tr>
|
|
{% endif %}
|
|
|
|
{% if got_revisions[ss] %}
|
|
<tr class="{{ ss_class.next() }}"><td>Got Revision</td><td>{{ got_revisions[ss.codebase]|revlink(ss.repository) }}</td></tr>
|
|
{% endif %}
|
|
|
|
{% if ss.patch %}
|
|
<tr class="{{ ss_class.next() }}"><td>Patch</td><td>YES</td></tr>
|
|
{% endif %}
|
|
|
|
{% if ss.changes %}
|
|
<tr class="{{ ss_class.next() }}"><td>Changes</td><td><a href="#changes-{{ ss.codebase }}">{{ ss.changes|count }} change{{ 's' if ss.changes|count > 1 else '' }}</a></td></tr>
|
|
{% endif %}
|
|
|
|
{% if not ss.branch and not ss.revision and not ss.patch and not ss.changes %}
|
|
<tr class="{{ ss_class.next() }}"><td colspan="2" align="center">Build of most recent revision</td></tr>
|
|
{% endif %}
|
|
</table>
|
|
</div></div>
|
|
{% endfor %}
|
|
</div>
|
|
{% endfor %}
|
|
|
|
{#
|
|
# TODO: turn this into a table, or some other sort of definition-list
|
|
# that doesn't take up quite so much vertical space
|
|
#}
|
|
|
|
<h2>BuildSlave:</h2>
|
|
|
|
{% if slave_url %}
|
|
<a href="{{ slave_url|e }}">{{ b.getSlavename()|e }}</a>
|
|
{% else %}
|
|
{{ b.getSlavename()|e }}
|
|
{% endif %}
|
|
|
|
<h2>Reason:</h2>
|
|
<p>
|
|
{{ b.getReason()|e }}
|
|
</p>
|
|
|
|
<h2>Steps and Logfiles:</h2>
|
|
|
|
{#
|
|
# TODO:
|
|
# urls = self.original.getURLs()
|
|
# ex_url_class = "BuildStep external"
|
|
# for name, target in urls.items():
|
|
# text.append('[<a href="%s" class="%s">%s</a>]' %
|
|
# (target, ex_url_class, html.escape(name)))
|
|
#}
|
|
|
|
{# TODO(sergey): Move hardcoded span with inline-block into a CSS class. #}
|
|
|
|
<ol>
|
|
{% for s in steps %}
|
|
<li>
|
|
<span style="display: inline-block; width: 40%;"><a href="{{ s.link }}">{{ s.name }}</a></span>
|
|
<span style="display: inline-block; width: 25%;">
|
|
<span class="label label-info">{{ s.text }} {{ '( ' + s.time_to_run + ' )' if s.time_to_run else '' }}</span>
|
|
</span>
|
|
<span style="display: inline-block; width: 30%; padding-left: 12pt;">
|
|
<ol>
|
|
{% set item_class = cycler('alt', '') %}
|
|
{% for l in s.logs %}
|
|
<a class="btn btn-default" href="{{ l.link }}">{{ l.name }}</a>
|
|
{% else %}
|
|
<a class="btn btn-default disabled" href="#" >- no logs -</a>
|
|
{% endfor %}
|
|
{% for u in s.urls %}
|
|
<a class="btn btn-default" href="{{ u.url }}">{{ u.logname }}</a>
|
|
{% endfor %}
|
|
</ol>
|
|
</span>
|
|
</li>
|
|
{% endfor %}
|
|
</ol>
|
|
|
|
</div>
|
|
<div class="container">
|
|
|
|
<h2>Build Properties:</h2>
|
|
|
|
<table class="table table-striped table-hover box">
|
|
<tr><th>Name</th><th>Value</th><th>Source</th></tr>
|
|
|
|
{% for p in properties %}
|
|
{% if p.source != "Force Build Form" %}
|
|
<tr class="{{ loop.cycle('alt', '') }}">
|
|
<td>{{ p.name|e }}</td>
|
|
{% if p.short_value %}
|
|
<td>{{ p.short_value|e }} .. [property value too long]</td>
|
|
{% else %}
|
|
{% if p.value is not mapping %}
|
|
<td>{{ p.value|e }}</td>
|
|
{% else %}
|
|
<td>
|
|
<table class="table table-striped table-hove">
|
|
{%- for key, value in p.value.items() recursive %}
|
|
<tr><td>{{ key|e }}</td><td>{{ value|e }}</td></tr>
|
|
{% endfor %}
|
|
</table>
|
|
</td>
|
|
{% endif %}
|
|
{% endif %}
|
|
<td>{{ p.source|e }}</td>
|
|
</tr>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</table>
|
|
<h2>Forced Build Properties:</h2>
|
|
<table class="table table-striped table-hover box">
|
|
<tr><th>Name</th><th>Label</th><th>Value</th></tr>
|
|
|
|
{% for p in properties %}
|
|
{% if p.source == "Force Build Form" %}
|
|
<tr class="{{ loop.cycle('alt', '') }}">
|
|
<td>{{ p.name|e }}</td>
|
|
<td>
|
|
{% if p.label %}
|
|
{{ p.label }}
|
|
{% endif %}
|
|
</td>
|
|
{% if p.text %}
|
|
<td><textarea readonly cols="{{p.cols}}" rows="{{p.rows}}">{{ p.text|e }}</textarea></td>
|
|
{% else %}
|
|
<td>{{ p.value|e }}</td>
|
|
{% endif %}
|
|
</tr>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</table>
|
|
|
|
<h2>Responsible Users:</h2>
|
|
|
|
{% if responsible_users %}
|
|
<ol>
|
|
{% for u in responsible_users %}
|
|
<li class="{{ loop.cycle('alt', '') }}">{{ u|user }}</li>
|
|
{% endfor %}
|
|
</ol>
|
|
{% else %}
|
|
<p>no responsible users</p>
|
|
{% endif %}
|
|
|
|
|
|
<h2>Timing:</h2>
|
|
<table class="table table-striped table-hover box">
|
|
<tr class="alt"><td>Start</td><td>{{ start }}</td></tr>
|
|
{% if end %}
|
|
<tr><td>End</td><td>{{ end }}</td></tr>
|
|
{% endif %}
|
|
<tr {{ 'class="alt"' if end else '' }}><td>Elapsed</td><td>{{ elapsed }}</td></tr>
|
|
</table>
|
|
|
|
{% if authz.advertiseAction('forceBuild', request) %}
|
|
<h3>Resubmit Build:</h3>
|
|
{{ forms.rebuild_build(build_url+"/rebuild", authz, sourcestamps[0]) }}
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
<br style="clear:both"/>
|
|
|
|
{% if has_changes %}
|
|
<div class="column">
|
|
<h2>All Changes:</h2>
|
|
{% for ss in sourcestamps %}
|
|
{% if ss.changes %}
|
|
<h3 id="changes-{{ ss.codebase }}"> {{ ss.codebase }}:</h3>
|
|
<ol>
|
|
{% for c in ss.changes %}
|
|
<li><h3>Change #{{ c.number }}</h3>
|
|
{{ change(c.asDict()) }}
|
|
</li>
|
|
{% endfor %}
|
|
</ol>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% endblock %}
|