- {{ p.name|e }} |
+ {{ p.name|e }} |
{% if p.short_value %}
{{ p.short_value|e }} .. [property value too long] |
{% else %}
@@ -165,7 +165,7 @@ SourceStamps:
{{ p.value|e }} |
{% else %}
-
+
{%- for key, value in p.value.items() recursive %}
{{ key|e }} | {{ value|e }} |
{% endfor %}
@@ -179,14 +179,14 @@ SourceStamps:
{% endfor %}
Forced Build Properties:
-
+
Name | Label | Value |
{% for p in properties %}
{% if p.source == "Force Build Form" %}
- {{ p.name|e }} |
-
+ | {{ p.name|e }} |
+
{% if p.label %}
{{ p.label }}
{% endif %}
@@ -215,12 +215,12 @@ SourceStamps:
Timing:
-
- Start | {{ start }} |
+
+ Start | {{ start }} |
{% if end %}
- End | {{ end }} |
+ End | {{ end }} |
{% endif %}
- Elapsed | {{ elapsed }} |
+ Elapsed | {{ elapsed }} |
{% if authz.advertiseAction('forceBuild', request) %}
diff --git a/templates/build_line.html b/templates/build_line.html
index 71be846..63d2117 100644
--- a/templates/build_line.html
+++ b/templates/build_line.html
@@ -15,31 +15,31 @@
{% macro build_tr(b, include_builder=False, loop=None) %}
- {{ b.time }} |
+ {{ b.time }} |
{%- for rev in b.rev_list -%}
{%- if not loop.first %} {% endif -%}
{%- if rev.get('codebase', '') %}{{ rev['codebase'] }}: {% endif -%}
{{ rev['rev']|shortrev(rev['repo']) }}
{%- endfor -%}
|
- {{ b.results }} |
+ {{ b.results }} |
{%- if include_builder %}
- {{ b.builder_name }} |
+ {{ b.builder_name }} |
{% endif %}
- #{{ b.buildnum }} |
+ #{{ b.buildnum }} |
{{ b.reason|e }}
{%- for user in (b.interested_users or []) -%}
{%- if not loop.first %}, {% endif -%}
{{ user|e }}
{%- endfor -%}
|
- {{ b.text|capitalize }} |
+ {{ b.text|capitalize }} |
{% endmacro %}
{% macro build_table(builds, include_builder=False) %}
{% if builds %}
-
+
Time |
Revision |
@@ -47,7 +47,7 @@
{%- if include_builder %}
Builder |
{% endif %}
- Build # |
+ Build # |
Reason |
Info |
diff --git a/templates/builder.html b/templates/builder.html
new file mode 100644
index 0000000..ec3ea7a
--- /dev/null
+++ b/templates/builder.html
@@ -0,0 +1,124 @@
+{% from 'build_line.html' import build_table %}
+{% import 'forms.html' as forms %}
+
+{% extends "layout.html" %}
+{% block content %}
+
+Builder {{ name }}
+
+(view in waterfall)
+
+{% if description %}
+ {{ description }}
+{% endif %}
+
+
+
+{% if current %}
+ Current Builds:
+
+ {% for b in current %}
+ - {{ b.num }}
+ {% if b.when %}
+ ETA: {{ b.when_time }} [{{ b.when }}]
+ {% endif %}
+
+ {{ b.current_step }}
+
+ {% if authz.advertiseAction('stopBuild', request) %}
+ {{ forms.stop_build(b.stop_url, authz, on_all=False, short=True, label='Build') }}
+ {% endif %}
+
+ {% endfor %}
+
+{% else %}
+ No current builds
+{% endif %}
+
+{% if pending %}
+ Pending Build Requests:
+
+ {% for b in pending %}
+ - ({{ b.when }}, waiting {{ b.delay }})
+
+ {% if authz.advertiseAction('cancelPendingBuild', request) %}
+ {{ 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|shortrev(c.repo) }}
+ ({{ c.who|email }}){% if not loop.last %},{% endif %}
+ {% endfor %}
+ {% else %}
+ ({{ b.num_changes }} changes)
+ {% endif %}
+
+ {% if 'owner' in b.properties %}
+ Forced build
+ by {{b.properties['owner'][0]}}
+ {% if 'reason' in b.properties %}
+ {{b.properties['reason'][0]}}
+ {% endif %}
+ {% endif %}
+
+ {% endfor %}
+
+
+ {% if authz.advertiseAction('cancelPendingBuild', request) %}
+ {{ forms.cancel_pending_build(builder_url+"/cancelbuild", authz, short=False, id='all') }}
+ {% endif %}
+
+{% else %}
+ No Pending Build Requests
+{% endif %}
+
+ Recent Builds:
+
+{{ build_table(recent) }}
+
+ Show more
+
+
+
+
+ Buildslaves:
+
+{% if slaves %}
+
+ Name |
+ Status |
+ Admin |
+
+{% endif %}
+{% for s in slaves %}
+
+ {{ s.name|e }} |
+ {% if s.connected %}
+ {% if s.paused %}
+ paused |
+ {% else %}
+ connected |
+ {% endif %}
+ {% else %}
+ offline |
+ {% endif %}
+ {{ s.admin|email if s.admin else ""}} |
+
+{% else %}
+ no slaves attached |
+{% endfor %}
+
+
+{% if authz.advertiseAction('pingBuilder', request) %}
+ Ping slaves
+ {{ forms.ping_builder(builder_url+"/ping", authz) }}
+{% endif %}
+
+{% if authz.advertiseAction('forceBuild', request) and force_schedulers != {} %}
+ Force build
+ {{ forms.force_build(builder_url+"/force", authz, request, False, force_schedulers=force_schedulers,default_props=default_props) }}
+{% endif %}
+
+
+
+{% endblock %}
diff --git a/templates/buildslave.html b/templates/buildslave.html
index b323a77..c53cab0 100644
--- a/templates/buildslave.html
+++ b/templates/buildslave.html
@@ -5,7 +5,7 @@
{% block content %}
Buildslave: {{ slavename|e }}
-
+
{% if current %}
Currently building:
@@ -27,7 +27,7 @@
{{ build_table(recent, True) }}
-
+
{% if access_uri %}
Click to Access Slave
{% endif %}
diff --git a/templates/forms.html b/templates/forms.html
index 44422aa..5a52975 100644
--- a/templates/forms.html
+++ b/templates/forms.html
@@ -114,11 +114,13 @@
{% endif %}
{% endmacro %}
+{# TODO(sergey): Move hardcoded span with inline-block into a CSS class. #}
+
{% macro force_build_scheduler_parameter(f, authz, request, sch, default_props) %}
{% if f and not f.hide and (f.fullName != "username" or not authz.authenticated(request)) %}
-
{% endif %}
{% endmacro %}
@@ -176,15 +178,16 @@
{% for f in sch.all_fields %}
{{ force_build_scheduler_parameter(f, authz, request, sch, default_props) }}
{% endfor %}
-
-
+
+
{% endmacro %}
{% macro force_build(force_url, authz, request, on_all=False, on_selected=False, builders=[], force_schedulers={},default_props={}) %}
+
{% for name, sch in force_schedulers.items() | sort %}
{{ force_build_one_scheduler(force_url, authz, request, on_all, on_selected, builders, sch, default_props=default_props) }}
{% endfor %}
-
+
{% endmacro %}
{% macro graceful_shutdown(shutdown_url, authz) %}
@@ -242,26 +245,28 @@
{% macro rebuild_build(rebuild_url, authz, ss) %}
{% endmacro %}
diff --git a/templates/grid.html b/templates/grid.html
new file mode 100644
index 0000000..e37b59d
--- /dev/null
+++ b/templates/grid.html
@@ -0,0 +1,31 @@
+{% extends "layout.html" %}
+{% import 'grid_macros.html' as grid with context %}
+
+{% block content %}
+
+ Grid View
+
+
+
+
+ {{ title }}
+ {{ grid.category_title() }}
+ |
+
+ {% for s in stamps %}
+ {{ grid.stamp_td(s) }}
+ {% endfor %}
+
+
+{% for builder in builders %}
+
+ {{ grid.builder_td(builder) }}
+ {% for build in builder.builds %}
+ {{ grid.build_td(build) }}
+ {% endfor %}
+
+{% endfor %}
+
+
+
+{% endblock %}
diff --git a/templates/grid_transposed.html b/templates/grid_transposed.html
new file mode 100644
index 0000000..82655e9
--- /dev/null
+++ b/templates/grid_transposed.html
@@ -0,0 +1,30 @@
+{% extends "layout.html" %}
+{% import 'grid_macros.html' as grid with context %}
+
+{% block content %}
+
+ Transposed Grid View
+
+
+
+
+ {{ title }}
+ {{ grid.category_title() }}
+ |
+ {% for builder in builders %}
+ {{ grid.builder_td(builder) }}
+ {% endfor %}
+
+
+{% for i in range %}
+
+ {{ grid.stamp_td(stamps[i]) }}
+ {% for b in builder_builds %}
+ {{ grid.build_td(b[i]) }}
+ {% endfor %}
+
+{% endfor %}
+
+
+
+{% endblock %}
diff --git a/templates/waterfall.html b/templates/waterfall.html
new file mode 100644
index 0000000..d8738db
--- /dev/null
+++ b/templates/waterfall.html
@@ -0,0 +1,66 @@
+{% extends "layout.html" %}
+{% from "box_macros.html" import box %}
+
+{% block content %}
+
+
+
+
+
+
+
+ last build
+ |
+
+{% for b in builders %}
+
+ {{ b.name }}
+ {{ " ".join(b.top) }}
+ |
+{% endfor %}
+
+
+
+current activity |
+
+{% for b in builders %}
+
+ {{ " ".join(b.status) }}
+ |
+{% endfor %}
+
+
+
+{{ tz }} |
+changes |
+
+{% for b in builders %}
+ {{ b.name }} |
+{% endfor %}
+
+
+{# waterfall contents goes here #}
+{% for i in range(gridlen) -%}
+
+ {% for strip in grid -%}
+ {%- if strip[i] -%}{{ box(**strip[i]) }}
+ {%- elif no_bubble -%}{{ box() }}
+ {%- endif -%}
+ {%- endfor -%}
+
+{% endfor %}
+
+
+
+{% if nextpage %}
+ next page
+{% endif %}
+
+{% if no_reload_page %}
+ Stop Reloading
+{% endif %}
+
+{% endblock %}
| |