Initial commit of blenders buildbot configuration
This commit is contained in:
253
templates/build.html
Normal file
253
templates/build.html
Normal file
@@ -0,0 +1,253 @@
|
||||
{% extends "layout.html" %}
|
||||
{% import 'forms.html' as forms %}
|
||||
{% from "change_macros.html" import change with context %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
|
||||
<h1>
|
||||
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.codebase }}</h3>
|
||||
|
||||
<table class="table table-striped table-hover box">
|
||||
{% set ss_class = cycler('alt','') %}
|
||||
|
||||
{% if ss.project %}
|
||||
<tr class="{{ ss_class.next() }}"><td class="left">Project</td><td>{{ ss.project|projectlink }}</td></tr>
|
||||
{% endif %}
|
||||
|
||||
{% if ss.repository %}
|
||||
<tr class="{{ ss_class.next() }}"><td class="left">Repository</td><td>{{ ss.repository|repolink }}</td></tr>
|
||||
{% endif %}
|
||||
|
||||
{% if ss.branch %}
|
||||
<tr class="{{ ss_class.next() }}"><td class="left">Branch</td><td>{{ ss.branch|e }}</td></tr>
|
||||
{% endif %}
|
||||
|
||||
{% if ss.revision %}
|
||||
<tr class="{{ ss_class.next() }}"><td class="left">Revision</td><td>{{ ss.revision|revlink(ss.repository) }}</td></tr>
|
||||
{% endif %}
|
||||
|
||||
{% if got_revisions[ss.codebase] %}
|
||||
<tr class="{{ ss_class.next() }}"><td class="left">Got Revision</td><td>{{ got_revisions[ss.codebase]|revlink(ss.repository) }}</td></tr>
|
||||
{% endif %}
|
||||
|
||||
{% if ss.patch %}
|
||||
<tr class="{{ ss_class.next() }}"><td class="left">Patch</td><td>YES</td></tr>
|
||||
{% endif %}
|
||||
|
||||
{% if ss.changes %}
|
||||
<tr class="{{ ss_class.next() }}"><td class="left">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 class="left" colspan="2">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)))
|
||||
#}
|
||||
|
||||
<ol>
|
||||
{% for s in steps %}
|
||||
<li>
|
||||
<div class="{{ s.css_class }} result">
|
||||
<a href="{{ s.link }}">{{ s.name }}</a>
|
||||
<span class="pull-right label label-info">{{ s.text }}
|
||||
{{ '( ' + s.time_to_run + ' )' if s.time_to_run else '' }}</span>
|
||||
</div>
|
||||
|
||||
<ol>
|
||||
{% set item_class = cycler('alt', '') %}
|
||||
{% for l in s.logs %}
|
||||
<li class="{{ item_class.next() }}"><a class="btn btn-default" href="{{ l.link }}">{{ l.name }}</a></li>
|
||||
{% else %}
|
||||
<li class="{{ item_class.next() }}"><a class="btn btn-default disabled" href="#" >- no logs -</a></li>
|
||||
{% endfor %}
|
||||
|
||||
{% for u in s.urls %}
|
||||
<li class="{{ item_class.next() }}"><a class="btn btn-default" href="{{ u.url }}">{{ u.logname }}</a></li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
|
||||
</div>
|
||||
<div class="container">
|
||||
|
||||
<h2>Build Properties:</h2>
|
||||
|
||||
<table class="table">
|
||||
<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 class="left">{{ 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">
|
||||
{%- 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">
|
||||
<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 class="left">{{ p.name|e }}</td>
|
||||
<td class="left">
|
||||
{% 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">
|
||||
<tr class="alt"><td class="left">Start</td><td>{{ start }}</td></tr>
|
||||
{% if end %}
|
||||
<tr><td class="left">End</td><td>{{ end }}</td></tr>
|
||||
{% endif %}
|
||||
<tr {{ 'class="alt"' if end else '' }}><td class="left">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 %}
|
61
templates/build_line.html
Normal file
61
templates/build_line.html
Normal file
@@ -0,0 +1,61 @@
|
||||
{% macro build_line(b, include_builder=False) %}
|
||||
<small>({{ b.time }})</small>
|
||||
Rev: {% if b.multiple_revs -%}
|
||||
multiple rev
|
||||
{%- else -%}
|
||||
{{ b.rev_list[0]['rev']|shortrev(b.rev_list[0]['repo']) }}
|
||||
{%- endif %}
|
||||
<span class="{{ b.class }}">{{ b.results }}</span>
|
||||
{% if include_builder %}
|
||||
<a href="{{ b.builderurl }}">{{ b.builder_name }}</a>
|
||||
{% endif %}
|
||||
<a href="{{ b.buildurl }}">#{{ b.buildnum }}</a> -
|
||||
{{ b.text|capitalize }}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro build_tr(b, include_builder=False, loop=None) %}
|
||||
<tr class="{{ loop.cycle('alt', '') if loop }}">
|
||||
<td>{{ b.time }}</td>
|
||||
<td>{%- for rev in b.rev_list -%}
|
||||
{%- if not loop.first %}<br/>{% endif -%}
|
||||
{%- if rev.get('codebase', '') %}<span class='codebase'>{{ rev['codebase'] }}</span>: {% endif -%}
|
||||
{{ rev['rev']|shortrev(rev['repo']) }}
|
||||
{%- endfor -%}
|
||||
</td>
|
||||
<td><span class="btn-{% if b.class == "success" %}{{ b.class }}{% else %}danger{% endif %} btn btn-block btn-squishy disabled">{{ b.results }}</span></td>
|
||||
{%- if include_builder %}
|
||||
<td><a class="btn btn-block btn-squishy" href="{{ b.builderurl }}">{{ b.builder_name }}</a></td>
|
||||
{% endif %}
|
||||
<td><a class="btn btn-block btn-squishy" href="{{ b.buildurl }}">#{{ b.buildnum }}</a></td>
|
||||
<td><span class='reason'>{{ b.reason|e }}</span>
|
||||
{%- for user in (b.interested_users or []) -%}
|
||||
{%- if not loop.first %}, {% endif -%}
|
||||
<span class='interested_user'>{{ user|e }}</span>
|
||||
{%- endfor -%}
|
||||
</td>
|
||||
<td class="left">{{ b.text|capitalize }}</td>
|
||||
</tr>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro build_table(builds, include_builder=False) %}
|
||||
{% if builds %}
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>Time</th>
|
||||
<th>Revision</th>
|
||||
<th>Result</th>
|
||||
{%- if include_builder %}
|
||||
<th>Builder</th>
|
||||
{% endif %}
|
||||
<th>Build #</th>
|
||||
<th>Reason</th>
|
||||
<th>Info</th>
|
||||
</tr>
|
||||
{% for b in builds %}
|
||||
{{ build_tr(b, include_builder, loop) }}
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% else %}
|
||||
No matching builds found
|
||||
{% endif %}
|
||||
{% endmacro %}
|
94
templates/buildslave.html
Normal file
94
templates/buildslave.html
Normal file
@@ -0,0 +1,94 @@
|
||||
{% from 'build_line.html' import build_table, build_line %}
|
||||
{% import 'forms.html' as forms %}
|
||||
|
||||
{% extends "layout.html" %}
|
||||
{% block content %}
|
||||
<h1>Buildslave: {{ slavename|e }}</h1>
|
||||
|
||||
<div class="col-md-6">
|
||||
|
||||
{% if current %}
|
||||
<h2>Currently building:</h2>
|
||||
<ul>
|
||||
{% for b in current %}
|
||||
<li>{{ build_line(b, True) }}
|
||||
<form method="post" action="{{ b.buildurl }}/stop" class="command stopbuild" style="display:inline">
|
||||
<input type="submit" value="Stop Build" />
|
||||
<input type="hidden" name="url" value="{{ this_url }}" />
|
||||
</form>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<h2>No current builds</h2>
|
||||
{% endif %}
|
||||
|
||||
<h2>Recent builds</h2>
|
||||
{{ build_table(recent, True) }}
|
||||
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
{% if access_uri %}
|
||||
<a href="{{ access_uri|e }}">Click to Access Slave</a>
|
||||
{% endif %}
|
||||
|
||||
{% if admin %}
|
||||
<h2>Administrator</h2>
|
||||
<p>{{ admin|email }}</p>
|
||||
{% endif %}
|
||||
|
||||
{% if host or info %}
|
||||
<h2>Slave information</h2>
|
||||
|
||||
{% if host %}
|
||||
Buildbot-Slave {{ slave_version }}
|
||||
<div class="box"><p>{{ host|e }}</p></div>
|
||||
{% endif %}
|
||||
|
||||
{% if info %}
|
||||
<table class="table">
|
||||
<tr><th>Name</th><th>Value</th></tr>
|
||||
|
||||
{% for info_name, info_val in info.iteritems() %}
|
||||
<tr class="{{ loop.cycle('alt', '') }}">
|
||||
<td class="left">{{ info_name|e }}</td>
|
||||
{% if info_val is not mapping %}
|
||||
<td>{{ info_val|e }}</td>
|
||||
{% else %}
|
||||
<td>
|
||||
<table class="table table-striped table-hover box">
|
||||
{%- for key, value in info_val.items() recursive %}
|
||||
<tr><td>{{ key|e }}</td><td>{{ value|e }}</td></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<h2>Connection Status</h2>
|
||||
<p>
|
||||
{{ connect_count }} connection(s) in the last hour
|
||||
{% if not slave.isConnected() %}
|
||||
(not currently connected)
|
||||
{% else %}
|
||||
</p>
|
||||
{% if authz.advertiseAction('gracefulShutdown', request) %}
|
||||
<h2>Graceful Shutdown</h2>
|
||||
{% if slave.getGraceful() %}
|
||||
<p>Slave will shut down gracefully when it is idle.</p>
|
||||
{% else %}
|
||||
{{ forms.graceful_shutdown(shutdown_url, authz) }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if authz.advertiseAction('pauseSlave', request) %}
|
||||
<h2>Pause Slave</h2>
|
||||
{{ forms.pause_slave(pause_url, authz, slave.isPaused()) }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
76
templates/buildslaves.html
Normal file
76
templates/buildslaves.html
Normal file
@@ -0,0 +1,76 @@
|
||||
{% extends "layout.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>Buildslaves</h1>
|
||||
|
||||
<div class="container-fluid">
|
||||
|
||||
<table class="table table-striped table-hover box">
|
||||
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
{%- if show_builder_column %}
|
||||
<th>Builders</th>
|
||||
{%- endif %}
|
||||
<th>BuildBot</th>
|
||||
<th>Admin</th>
|
||||
<th>Last heard from</th>
|
||||
<th>Connects/Hour</th>
|
||||
<th>Status</th>
|
||||
</tr>
|
||||
|
||||
{% for s in slaves %}
|
||||
<tr class="{{ loop.cycle('alt','') }}">
|
||||
<td><b><a href="{{ s.link }}">{{ s.name }}</a></b></td>
|
||||
|
||||
{%- if show_builder_column %}
|
||||
<td>
|
||||
{%- if s.builders %}
|
||||
{%- for b in s.builders %}
|
||||
<a href="{{ b.link }}">{{ b.name }}</a>
|
||||
{%- endfor %}
|
||||
{%- else %}
|
||||
<span class="warning">no builders</span>
|
||||
{%- endif -%}
|
||||
</td>
|
||||
{%- endif %}
|
||||
|
||||
|
||||
<td>{{ (s.version or '-')|e }}</td>
|
||||
|
||||
{%- if s.admin -%}
|
||||
<td>{{ s.admin|email }}</td>
|
||||
{%- else -%}
|
||||
<td>-</td>
|
||||
{%- endif -%}
|
||||
|
||||
<td>
|
||||
{%- if s.last_heard_from_age -%}
|
||||
{{ s.last_heard_from_age }} <small>({{ s.last_heard_from_time }})</small>
|
||||
{%- endif -%}
|
||||
</td>
|
||||
<td>
|
||||
{{ s.connectCount }}
|
||||
</td>
|
||||
|
||||
{% if s.connected %}
|
||||
{% if s.running_builds %}
|
||||
<td class="building success">Running {{ s.running_builds }} build(s)</td>
|
||||
{% elif s.paused %}
|
||||
<td class="warning paused">Paused</td>
|
||||
{% else %}
|
||||
<td class="success idle">Idle</td>
|
||||
{% endif %}
|
||||
|
||||
{% else %}
|
||||
<td class="disabled"><i class="fa fa-frown-o"></i> Not connected</td>
|
||||
{% endif %}
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
185
templates/directory.html
Normal file
185
templates/directory.html
Normal file
@@ -0,0 +1,185 @@
|
||||
{% extends "layout.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% if path == "download/" %}
|
||||
<h1>Directory listing for {{ path }}</h1>
|
||||
{% else %}
|
||||
<h1>Download Latest Builds</h1>
|
||||
|
||||
<div class="box alert-warning">
|
||||
<p><i class="fa fa-info-circle"></i> These builds are not as stable as releases, use at your own risk.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if path == "/download/experimental/" %}
|
||||
<div class="box alert-danger"><p>
|
||||
<h1><i class="fa fa-info-circle"></i> These builds are for developer use only!</h1>
|
||||
<h2>They contain highly experimental patches, which might ruin your day!</h2>
|
||||
<h2>If you're NOT a developer, please leave this page IMMEDIATELY!</h2>
|
||||
</p></div>
|
||||
{% endif %}
|
||||
|
||||
{% set row_class = cycler('alt', '') %}
|
||||
|
||||
<table class="table table-striped table-hover box">
|
||||
|
||||
<tr>
|
||||
<th>Operating System</th>
|
||||
<th>Variation</th>
|
||||
<th>Name</th>
|
||||
<th>Size</th>
|
||||
<th>Built On</th>
|
||||
</tr>
|
||||
|
||||
{% for d in directories %}
|
||||
{% if not ("experimental" in d,text) %}
|
||||
<tr class="directory {{ row_class.next() }}">
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td><a href="{{ d.href }}"><b>{{ d.text }}</b></a></td>
|
||||
<td><b>{{ d.size }}</b></td>
|
||||
<td>{{ d.lastmodified }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% for f in files|sort %}
|
||||
{% if ("mingw" in f.text) or ('gooseberry' in f.text) or ("experimental" in f.text) or ("vc1" in f.text) or ("vc9" in f.text) or ("multiview" in f.text) %}
|
||||
{% else %}
|
||||
<tr class="file {{ row_class.next() }}">
|
||||
{% if "mingw32" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 32 bit
|
||||
{% elif "win32" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 32 bit
|
||||
{% elif "mingw64" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 64 bit
|
||||
{% elif "win64" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 64 bit
|
||||
{% elif "OSX" in f.text %}
|
||||
{% if "x86_64" in f.text %}
|
||||
<td><i class="fa fa-apple"></i> Mac OS X 64 bit
|
||||
{% else %}
|
||||
<td><i class="fa fa-apple"></i> Mac OS X 32 bit
|
||||
{% endif %}
|
||||
{% elif "linux" in f.text %}
|
||||
{% if "x86_64" in f.text %}
|
||||
<td><i class="fa fa-linux"></i> Linux 64 bit
|
||||
{% else %}
|
||||
<td><i class="fa fa-linux"></i> Linux 32 bit
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
|
||||
<td>
|
||||
Official
|
||||
</td>
|
||||
|
||||
<td><a class="info" onclick="ga('send', 'event', 'button', 'download', '{{f.text}}');" href="{{ f.href }}">{{ f.text }}</a></td>
|
||||
<td>{{ f.size }}</td>
|
||||
<td>
|
||||
{{ f.lastmodified }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% for f in files|sort %}
|
||||
{% if ("experimental" in f.text) %}
|
||||
<tr class="file {{ row_class.next() }}">
|
||||
{% if "mingw32" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 32 bit
|
||||
{% elif "win32" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 32 bit
|
||||
{% elif "mingw64" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 64 bit
|
||||
{% elif "win64" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 64 bit
|
||||
{% elif "OSX" in f.text %}
|
||||
{% if "x86_64" in f.text %}
|
||||
<td><i class="fa fa-apple"></i> Mac OS X 64 bit
|
||||
{% else %}
|
||||
<td><i class="fa fa-apple"></i> Mac OS X 32 bit
|
||||
{% endif %}
|
||||
{% elif "linux" in f.text %}
|
||||
{% if "x86_64" in f.text %}
|
||||
<td><i class="fa fa-linux"></i> Linux 64 bit
|
||||
{% else %}
|
||||
<td><i class="fa fa-linux"></i> Linux 32 bit
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
|
||||
<td>Experimental Build Branch</td>
|
||||
<td><a class="info" onclick="ga('send', 'event', 'button', 'download', '{{f.text}}');" href="{{ f.href }}">{{ f.text }}</a></td>
|
||||
<td>{{ f.size }}</td>
|
||||
<td>{{ f.lastmodified }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
<tr>
|
||||
<td> </th>
|
||||
<td> </th>
|
||||
<td> </th>
|
||||
<td> </th>
|
||||
<td> </th>
|
||||
</tr>
|
||||
|
||||
{% for f in files|sort %}
|
||||
{% if (not (("mingw" in f.text) or ("vc1" in f.text) or ("vc9" in f.text) or ("multiview" in f.text) or ("gooseberry" in f.text) )) %}
|
||||
{% else %}
|
||||
<tr class="file {{ row_class.next() }}">
|
||||
{% if "mingw32" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 32 bit
|
||||
{% elif "win32" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 32 bit
|
||||
{% elif "mingw64" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 64 bit
|
||||
{% elif "win64" in f.text %}
|
||||
<td><i class="fa fa-windows"></i> Windows 64 bit
|
||||
{% elif "OSX" in f.text %}
|
||||
{% if "x86_64" in f.text %}
|
||||
<td><i class="fa fa-apple"></i> Mac OS X 64 bit
|
||||
{% else %}
|
||||
<td><i class="fa fa-apple"></i> Mac OS X 32 bit
|
||||
{% endif %}
|
||||
{% elif "linux" in f.text %}
|
||||
{% if "x86_64" in f.text %}
|
||||
<td><i class="fa fa-linux"></i> Linux 64 bit
|
||||
{% else %}
|
||||
<td><i class="fa fa-linux"></i> Linux 32 bit
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
|
||||
<td>
|
||||
{% if "mingw" in f.text %}
|
||||
Experimental MinGW
|
||||
{% elif "vc11" in f.text %}
|
||||
Experimental VS 2012<br/><span style="font-weight: normal;">(Windows Vista/7/8)</span>
|
||||
{% elif "vc9" in f.text %}
|
||||
Legacy VS 2008<br/><span style="font-weight: normal;">(Windows XP/Vista/7/8)</span>
|
||||
{% elif "win32-vc12" in f.text %}
|
||||
Official Preview VS 2013<br/><span style="font-weight: normal;">(Windows XP/Vista/7/8)</span>
|
||||
{% elif "win64-vc12" in f.text %}
|
||||
Official Preview VS 2013<br/><span style="font-weight: normal;">(Windows Vista/7/8)</span>
|
||||
{% elif "multiview" in f.text %}
|
||||
Multiview Branch<br/><span style="font-weight: normal;">(Stereoscopic 3D)</span>
|
||||
{% elif "gooseberry" in f.text %}
|
||||
Gooseberry Branch
|
||||
{% else %}
|
||||
Official
|
||||
{% endif %}
|
||||
</td>
|
||||
|
||||
<td><a class="info" onclick="ga('send', 'event', 'button', 'download', '{{f.text}}');" href="{{ f.href }}">{{ f.text }}</a></td>
|
||||
<td>{{ f.size }}</td>
|
||||
<td>{{ f.lastmodified }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
|
||||
{% endblock %}
|
274
templates/forms.html
Normal file
274
templates/forms.html
Normal file
@@ -0,0 +1,274 @@
|
||||
|
||||
{% macro cancel_pending_build(cancel_url, authz, short=False, id='all') %}
|
||||
<form method="post" name="cancel" action="{{ cancel_url }}" class='form-horizontal cancelbuild'
|
||||
{{ 'style="display:inline"' if short else '' }}>
|
||||
{% if not short %}
|
||||
{% if id == 'all' %}
|
||||
<p>To cancel all builds, push the 'Cancel' button</p>
|
||||
<p>To cancel individual builds, click the 'Cancel' buttons above.</p>
|
||||
{% else %}
|
||||
<p>To cancel this build, push the 'Cancel' button</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<input type="hidden" name="id" value="{{ id }}" />
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Cancel" />
|
||||
</form>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro stop_change_builds(stopchange_url, changenum, authz) %}
|
||||
{% if not changenum %}
|
||||
<form method="post" action="{{ stopchange_url }}" class='form-horizontal stopchange'>
|
||||
{% if changenum %}
|
||||
<p>To cancel all builds for this change, push the 'Cancel' button</p>
|
||||
{% else %}
|
||||
<p>To cancel builds for this builder for a given change, fill out the
|
||||
following field and push the 'Cancel' button</p>
|
||||
{% endif %}
|
||||
|
||||
{% if changenum %}
|
||||
<input type="hidden" name="change" value="{{ changenum }}" />
|
||||
{% else %}
|
||||
<div class="row">
|
||||
<span class="label">Change #:</span>
|
||||
<input type="text" name="change"/>
|
||||
</div>
|
||||
{% endif %}
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Cancel" />
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro stop_build(stop_url, authz, on_all=False, on_selected=False, builders=[], short=False, label="Build") %}
|
||||
{% if not short %}
|
||||
<form method="post" name="stop_build" action="{{ stop_url }}" class='form-horizontal stopbuild'
|
||||
{{ 'style="display:inline"' if short else '' }}>
|
||||
{% if not short %}
|
||||
{% if on_all %}
|
||||
<p>To stop all builds, fill out the following field and
|
||||
push the <i>Stop {{ label }}</i> button</p>
|
||||
{% elif on_selected %}
|
||||
<p>To stop selected builds, select the builders, fill out the
|
||||
following field and push the <i>Stop {{ label }}</i> button</p>
|
||||
<table>
|
||||
{% for b in builders %}
|
||||
<tr>
|
||||
<td align="center"><input type="checkbox" name="selected" value="{{ b.name }}"></td>
|
||||
<td class="box"><a href="{{ b.link }}">{{ b.name|e }}</a></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p>To stop this build, fill out the following field and
|
||||
push the <i>Stop {{ label }}</i> button</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if not short %}
|
||||
<div class="row">
|
||||
<span class="label">Reason:</span>
|
||||
<input type="text" name="comments"/>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Stop {{ label }}" />
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro cancel_build(cancel_url, authz, on_all=False, on_selected=False, builders=[], short=False, label="Build") %}
|
||||
{% if not short %}
|
||||
<form method="post" name="cancel_build" action="{{ cancel_url }}" class='form-horizontal cancelbuild'
|
||||
{{ 'style="display:inline"' if short else '' }}>
|
||||
{% if not short %}
|
||||
{% if on_all %}
|
||||
<p>To cancel all pending builds, fill out the following field and
|
||||
push the <i>Cancel {{ label }}</i> button</p>
|
||||
{% elif on_selected %}
|
||||
<p>To cancel selected pending builds, select the builders, fill out the
|
||||
following field and push the <i>Cancel {{ label }}</i> button</p>
|
||||
<table>
|
||||
{% for b in builders %}
|
||||
<tr>
|
||||
<td align="center"><input type="checkbox" name="selected" value="{{ b.name }}"></td>
|
||||
<td class="box"><a href="{{ b.link }}">{{ b.name|e }}</a></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p>To cancel this pending build, fill out the following field and
|
||||
push the <i>Cancel {{ label }}</i> button</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if not short %}
|
||||
<div class="row">
|
||||
<span class="label">Reason:</span>
|
||||
<input type="text" name="comments"/>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Cancel {{ label }}" />
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% 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)) %}
|
||||
<div class="row{% for subtype in f.type %} force-{{subtype}}{%endfor%}"{% if f.name %} id="force-{{sch.name}}-{{f.fullName}}"{% endif %}>
|
||||
{% if 'text' in f.type or 'int' in f.type %}
|
||||
<span class="label">{{f.label}}</span>
|
||||
<input type='text' size='{{f.size}}' name='{{f.fullName}}' value='{{default_props[sch.name+"."+f.fullName]}}' />
|
||||
{% elif 'bool' in f.type%}
|
||||
<input type='checkbox' name='checkbox' value='{{f.fullName}}' {{default_props[sch.name+"."+f.fullName]}} />
|
||||
<span class="label">{{f.label}}</span>
|
||||
{% elif 'textarea' in f.type %}
|
||||
<span class="label">{{f.label}}</span>
|
||||
<textarea name='{{f.fullName}}' rows={{f.rows}} cols={{f.cols}}>{{default_props[sch.name+"."+f.fullName]}}</textarea>
|
||||
{% elif 'list' in f.type %}
|
||||
<span class="label">{{f.label}}</span>
|
||||
<span class="select">
|
||||
<select name='{{f.fullName}}' {{ f.multiple and "multiple" or ""}}>
|
||||
{% for c in default_props[sch.name+"."+f.fullName+".choices"] %}
|
||||
<option {{(c in default_props[sch.name+"."+f.fullName]) and "selected" or ""}}>{{c}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</span>
|
||||
{% elif 'nested' in f.type %}
|
||||
{% if f.label %}<span class="label">{{f.label}}</span>{% endif %}
|
||||
{% for subfield in f.fields %}
|
||||
{{ force_build_scheduler_parameter(subfield, authz, request, sch, default_props) }}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro force_build_one_scheduler(force_url, authz, request, on_all, on_selected, builders, sch, default_props) %}
|
||||
<form method="post" name="force_build" action="{{ force_url }}" class="command_forcebuild">
|
||||
|
||||
<h3>{{ sch.name|e }}</h3>
|
||||
{% if on_all %}
|
||||
<p>To force a build on <strong>all Builders</strong>, fill out the following fields
|
||||
and push the 'Force Build' button</p>
|
||||
{% elif on_selected %}
|
||||
<p>To force a build on <strong>certain Builders</strong>, select the
|
||||
builders, fill out the following fields and push the
|
||||
'Force Build' button</p>
|
||||
|
||||
<table>
|
||||
{% for b in builders %}
|
||||
{% if b.name in sch.builderNames %}
|
||||
<tr>
|
||||
<td align="center"><input type="checkbox" name="selected" value="{{ b.name }}"></td>
|
||||
<td class="box"><a href="{{ b.link }}">{{ b.name|e }}</a></td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
{% else %}
|
||||
<p>To force a build, fill out the following fields and
|
||||
push the 'Force Build' button</p>
|
||||
{% endif %}
|
||||
<input type='hidden' name='forcescheduler' value='{{sch.name}}' />
|
||||
{% for f in sch.all_fields %}
|
||||
{{ force_build_scheduler_parameter(f, authz, request, sch, default_props) }}
|
||||
{% endfor %}
|
||||
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="{{ sch.buttonName }}" />
|
||||
</form>
|
||||
{% 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) %}
|
||||
<form method="post" action="{{ shutdown_url }}" class='form-horizontal graceful_shutdown'>
|
||||
|
||||
<p>To cause this slave to shut down gracefully when it is idle,
|
||||
push the 'Graceful Shutdown' button</p>
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Graceful Shutdown" />
|
||||
</form>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro pause_slave(pause_url, authz, paused) %}
|
||||
<form method="post" action="{{ pause_url }}" class='form-horizontal pause_slave'>
|
||||
|
||||
{% if paused %}
|
||||
<p>To cause this slave to start running new builds again,
|
||||
push the 'Unpause Slave' button</p>
|
||||
{% else %}
|
||||
<p>To cause this slave to stop running new builds,
|
||||
push the 'Pause Slave' button</p>
|
||||
{% endif %}
|
||||
|
||||
{% if paused %}
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Unpause Slave" />
|
||||
{% else %}
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Pause Slave" />
|
||||
{% endif %}
|
||||
</form>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro clean_shutdown(shutdown_url, authz) %}
|
||||
<form method="post" action="{{ shutdown_url }}" class='form-horizontal clean_shutdown'>
|
||||
<p>To cause this master to shut down cleanly, push the 'Clean Shutdown' button.</p>
|
||||
<p>No other builds will be started on this master, and the master will
|
||||
stop once all current builds are finished.</p>
|
||||
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Clean Shutdown" />
|
||||
</form>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro cancel_clean_shutdown(cancel_shutdown_url, authz) %}
|
||||
<form method="post" action="{{ cancel_shutdown_url }}" class='form-horizontal cancel_clean_shutdown'>
|
||||
<p>To cancel a previously initiated shutdown, push the 'Cancel Shutdown' button.</p>
|
||||
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Cancel Shutdown" />
|
||||
</form>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro ping_builder(ping_url, authz) %}
|
||||
<form method="post" action="{{ ping_url }}" class='form-horizontal ping_builder'>
|
||||
<p>To ping the buildslave(s), push the 'Ping' button</p>
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Ping Builder" />
|
||||
</form>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro rebuild_build(rebuild_url, authz, ss) %}
|
||||
<form method="post" action="{{ rebuild_url }}" class="form-horizontal rebuild">
|
||||
|
||||
{% if on_all %}
|
||||
<p>To force a build on <strong>all Builders</strong>, fill out the following fields
|
||||
and push the 'Force Build' button</p>
|
||||
{% else %}
|
||||
<p>To force a build, fill out the following fields and
|
||||
push the 'Force Build' button</p>
|
||||
{% endif %}
|
||||
<div class="row">
|
||||
<span class="label">Reason for re-running build:</span>
|
||||
<input type='text' name='comments' />
|
||||
</div>
|
||||
<div class="row">
|
||||
Rebuild using:
|
||||
<select name="useSourcestamp">
|
||||
<option value='exact' selected>Exact same revisions</option>
|
||||
<option value='updated'>Same sourcestamps (ignoring 'got revision')</option>
|
||||
</select>
|
||||
</div>
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Rebuild" />
|
||||
</form>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro show_users(users_url, authz) %}
|
||||
<form method="post" action="{{ users_url }}" class='form-horizontal show_users'>
|
||||
<p>To show users, press the 'Show Users' button</p>
|
||||
|
||||
<input class="btn btn-default btn-success btn-squishy" type="submit" value="Show Users" />
|
||||
</form>
|
||||
{% endmacro %}
|
105
templates/layout.html
Normal file
105
templates/layout.html
Normal file
@@ -0,0 +1,105 @@
|
||||
{%- block doctype -%}
|
||||
<!DOCTYPE html>
|
||||
{% endblock %}
|
||||
<html lang="en">
|
||||
<head>
|
||||
{% block head %}
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
{% if metatags %}
|
||||
{{ metatags }}
|
||||
{% endif %}
|
||||
{% if refresh %}
|
||||
<meta http-equiv="refresh" content="{{ refresh|e }}"/>
|
||||
{% endif %}
|
||||
<title>{{ title|e }}</title>
|
||||
|
||||
<link href="https://netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="https://netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
|
||||
<link href="{{ path_to_root }}css/main.css" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="{{ stylesheet }}" type="text/css" />
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS" href="{{ path_to_root }}rss">
|
||||
|
||||
<link href="{{ path_to_root }}css/font-borg.css" rel="stylesheet">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
|
||||
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel='stylesheet' type='text/css'>
|
||||
{% endblock %}
|
||||
</head>
|
||||
<body class="interface" onload="parent.postMessage(document.body.scrollHeight, 'https://developer.blender.org');">
|
||||
|
||||
{% block header -%}
|
||||
<header class="navbar navbar-default navbar-fixed-top" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#cloud-navbar-collapse-1">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<i class="fa fa-bars"></i>
|
||||
</button>
|
||||
<a class="logo" href="{{ path_to_root or '.' }}"></a>
|
||||
</div>
|
||||
|
||||
<!-- Collect the nav links, forms, and other content for toggling -->
|
||||
<nav class="collapse navbar-collapse" id="cloud-navbar-collapse-1">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="{{ path_to_root }}download">Download</a></li>
|
||||
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="{{ path_to_root }}waterfall">Waterfall</a></li>
|
||||
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="{{ path_to_root }}grid">Grid</a></li>
|
||||
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="{{ path_to_root }}tgrid">T-Grid</a></li>
|
||||
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="{{ path_to_root }}builders">Builders</a></li>
|
||||
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="{{ path_to_root }}one_line_per_build">Recent Builds</a></li>
|
||||
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="{{ path_to_root }}buildslaves">Buildslaves</a></li>
|
||||
<li class="menu-item menu-item-type-post_type menu-item-object-page"><a href="{{ path_to_root }}about">About</a></li>
|
||||
</ul>
|
||||
</nav><!-- /.navbar-collapse -->
|
||||
|
||||
</div>
|
||||
</header>
|
||||
{% endblock %}
|
||||
|
||||
<div class="container-fluid featured featured-xs">
|
||||
<div class="col-md-12 height-full">
|
||||
<div class="container vertical-align">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{%- block barecontent -%}
|
||||
<div class="content col-md-12">
|
||||
{%- block content -%}
|
||||
{%- endblock -%}
|
||||
</div>
|
||||
{%- endblock -%}
|
||||
|
||||
{%- block footer -%}
|
||||
<footer>
|
||||
<div class="container">
|
||||
<span class="pull-left">
|
||||
<a href="http://buildbot.net/">BuildBot</a> ({{version}})
|
||||
{% if project_name -%}
|
||||
working for the
|
||||
{%- if project_url -%}
|
||||
<a href="{{ project_url }}">{{ project_name }}</a>
|
||||
{%- else -%}
|
||||
{{ project_name }}
|
||||
{%- endif -%}
|
||||
project.
|
||||
{%- endif -%}
|
||||
</span>
|
||||
<span class="pull-right"><p>Page built: {{ time }} ({{ tz }})</p></span>
|
||||
</div>
|
||||
</footer>
|
||||
{% endblock -%}
|
||||
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', 'UA-1418081-1', 'auto');
|
||||
ga('send', 'pageview');
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
17
templates/root.html
Normal file
17
templates/root.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{% extends 'layout.html' %}
|
||||
{% import 'forms.html' as forms %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>Blender Buildbot</h1>
|
||||
|
||||
<div class="column">
|
||||
|
||||
<h3><a href="download">Download latest builds</a></h3>
|
||||
|
||||
<h3><a href="http://wiki.blender.org/index.php/Dev:Doc/BuildBot">Buildbot setup notes</a></h3>
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
Reference in New Issue
Block a user