{% from 'build_line.html' import build_table %}
{% import 'forms.html' as forms %}

{% extends "layout.html" %}
{% block content %}

<h1><a href="{{ path_to_root }}waterfall?show={{ name }}">Builder: {{ name }}</a></h1>

<div class="column">

{% if current %}
  <h2>Currently Building:</h2>
  <ul>
  {% for b in current %}
    <li><a href="{{ b.link }}">{{ b.num }}</a>
    {% if b.when %}
      ETA: {{ b.when_time }} [{{ b.when }}]
    {% endif %}

    {{ b.current_step }}

    {% if authz.advertiseAction('stopBuild') %}
      {{ forms.stop_build(b.stop_url, authz, on_all=False, short=True, label='Build') }}
    {% endif %}
    </li>
  {% endfor %}
  </ul>
{% else %}
  <h2>No current builds</h2>
{% endif %}

{% if pending %}
  <h2>Pending Build Requests:</h2>
  <ul>
  {% for b in pending %}
    <li><small>({{ b.when }}, waiting {{ b.delay }})</small>

    {% if authz.advertiseAction('cancelPendingBuild') %}
      {{ forms.cancel_pending_build(builder_url+"/cancelbuild", authz, short=True, id=b.id) }}
    {% endif %}

    {% if b.num_changes < 4 %}
        {% for c in b.changes %}{{ c.revision|longrev(c.repo) }}
        (<a href="{{ c.url }}">{{ c.who }}</a>){% if not loop.last %},{% endif %}
        {% endfor %}
    {% else %}
        ({{ b.num_changes }} changes)
    {% endif %}

    </li>
  {% endfor %}
  </ul>

{% else %}
  <h2>No Pending Build Requests</h2>
{% endif %}

<h2>Recent Builds:</h2>

{{ build_table(recent) }}

</div>
<div class="column">

<h2>Buildslaves:</h2>
<table class="info">
{% if slaves %}
<tr>
  <th>Name</th>
  <th>Status</th>
  <th>Admin</th>
</tr>
{% endif %}
{% for s in slaves %}
  <tr class="{{ loop.cycle('alt', '') }}">
  <td class="slavename"><b><a href="{{ s.link|e }}">{{ s.name|e }}</a></b></td>
  {% if s.connected %}
    <td class="success">connected</td>
    <td class="admin">{{ s.admin|email if s.admin else ""}}</td>
  {% else %}
    <td class="offline">offline</td>
    <td/>
  {% endif %}
  </tr>
{% else %}
  <td>no slaves attached</td>
{% endfor %}
</table>

{% if authz.advertiseAction('pingBuilder') %}
  <h2>Ping slaves</h2>
  {{ forms.ping_builder(builder_url+"/ping", authz) }}
{% endif %}

{% if authz.advertiseAction('forceBuild') %}
  <h2>Force build</h2>
  {{ forms.force_build(builder_url+"/force", authz, False) }}
{% endif %}

</div>

{% endblock %}
