teichmann@473: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
teichmann@452:   "http://www.w3.org/TR/html4/loose.dtd">
teichmann@486: <html>
teichmann@486: <%@include file="header.inc" %>
teichmann@488: <%
teichmann@488: from cgi import escape
teichmann@488: from xml.sax.saxutils import quoteattr
teichmann@488: from datetime import date, datetime
teichmann@488: %>
teichmann@486: <div class="css_prison">
teichmann@486: <h1><%= escape(description) %></h1>
teichmann@486: <%= header %>
teichmann@486: <table class="statustable">
teichmann@486: <tr>
teichmann@486:   <th class="statustablehead">Status</th>
teichmann@486:   <th class="statustablehead">Package</th>
teichmann@486:   <th class="statustablehead">Revision</th>
teichmann@486:   <th class="statustablehead">Start</th>
teichmann@486:   <th class="statustablehead">Stop</th>
teichmann@486:   <th class="statustablehead">Duration</th>
teichmann@486:   <th class="statustablehead">Notes</th>
teichmann@486: </tr>
teichmann@452: <%
teichmann@482: def nn(s, d=""):
teichmann@482:     if not s: return d
teichmann@482:     return escape(s)
teichmann@482: 
teichmann@482: def pretty_time(t, format="%H:%M:%S"):
teichmann@482:     if not t: return "&lt;unknown&gt;"
teichmann@482:     return t.strftime(format)
teichmann@482: 
teichmann@482: def pretty_timedelta(a, b):
teichmann@482:     if a is None or b is None: return "&lt;unknown&gt;"
teichmann@482:     td = a - b
teichmann@482:     secs = td.days * 24*3600 + td.seconds
teichmann@482:     out = []
teichmann@482:     if secs > 3600:
teichmann@482:         hs = secs // 3600
teichmann@482:         out.append("%dh" % hs)
teichmann@482:         secs %= 3600
teichmann@482:     if secs > 60:
teichmann@482:         ms = secs // 60
teichmann@482:         out.append("%dm" % ms)
teichmann@482:         secs %= 60
teichmann@482:     if secs > 0 or not out:
teichmann@482:         out.append("%ds" % secs)
teichmann@482:     return " ".join(out)
teichmann@482: 
teichmann@482: def date_from_datetime(x):
teichmann@482:     if not x: return None
teichmann@482:     return date(x.year, x.month, x.day)
teichmann@482: 
teichmann@482: def sort_by_start(a, b):
teichmann@482:     a_start = a.build_start
teichmann@482:     b_start = b.build_start
teichmann@482:     if not a_start and not b_start: return 0
teichmann@482:     if not a_start: return 1
teichmann@482:     if not b_start: return -1
teichmann@482:     return cmp(a_start, b_start)
teichmann@482: 
teichmann@482: def create_tags_link(tag_url):
teichmann@482:     return quoteattr(tag_url.replace(
teichmann@482:         "svn://anonsvn.kde.org/home/kde",
teichmann@482:         "http://websvn.kde.org"))
teichmann@482: 
teichmann@482: track_items = sorted(track_items, cmp=sort_by_start, reverse=True)
teichmann@482: 
teichmann@482: last_date = None
teichmann@482: 
teichmann@482: STATUS2CLASS = {
teichmann@482:     'creating_binary_package': 'inprogress',
teichmann@482:     'creating_source_package': 'inprogress',
teichmann@482:     'source_package_created':  'inprogress',
teichmann@482:     'binary_package_created':  'finished'
teichmann@482: }
teichmann@482: 
teichmann@482: STATUS2MSG = {
teichmann@482:     'creating_binary_package': 'building binary packages',
teichmann@482:     'creating_source_package': 'building source package',
teichmann@482:     'source_package_created':  'preparing build envrionment',
teichmann@482:     'binary_package_created':  'success'
teichmann@482: }
teichmann@452: 
teichmann@452: for track_item in track_items:
teichmann@452:     # for all track items
teichmann@452:     curr_date = date_from_datetime(track_item.build_start)
teichmann@452:     if curr_date != last_date:
teichmann@452:         last_date = curr_date
teichmann@490: %><tr class="date_row"><td colspan="7"><%= pretty_time(last_date, "%Y-%m-%d") %> (times in UTC)</td></tr><%
teichmann@452:     # date changed
teichmann@452: %>
teichmann@452: <tr class="<%= STATUS2CLASS.get(track_item.build_status, 'error') %>">
teichmann@490: <td><a name=<%= quoteattr(track_item.build_label) %>><%= STATUS2MSG.get(track_item.build_status, 'error') %></a></td>
teichmann@490: <td><b><%= nn(track_item.track) %></b></td>
teichmann@484: <td align="right"><%
teichmann@474:     tags = track_item.build_tags
teichmann@474:     if tags:
teichmann@474:         # a tag
teichmann@490: %><a href=<%= create_tags_link(tags) %>><strong><%= nn(track_item.revision) %></strong></a><%
teichmann@474:     else:
teichmann@474:         # not a tag
teichmann@484: %><%= nn(track_item.revision) %><%
teichmann@474:     # end if tags
teichmann@484: %></td>
teichmann@478: <td align="right"><%= pretty_time(track_item.build_start) %></td>
teichmann@478: <td align="right"><%= pretty_time(track_item.build_stop) %></td>
teichmann@478: <td align="right"><%= pretty_timedelta(track_item.stop, track_item.build_start) %></td>
teichmann@490: <td><%
teichmann@452:     for log_desc, log_path in track_item.build_logs:
teichmann@452:         # for all logs
teichmann@490: %>[<a href=<%= quoteattr("%s/%s" % (base_dir, log_path)) %>><%= nn(log_desc) %></a>]
teichmann@452: <%
teichmann@452:     # for all logs
teichmann@490: %></td></tr><%
teichmann@452: # for all track itemes
teichmann@452: %>
teichmann@452: 
teichmann@452: </table>
teichmann@475: <hr>
teichmann@478: report generated at <%= pretty_time(datetime.now(), "%Y-%m-%d %H:%M:%S") %>, powered
teichmann@475: by <a href="http://treepkg.wald.intevation.org">Tree Packager</a>
teichmann@485: </div>
teichmann@452: 
teichmann@483: <%@include file="footer.inc" %>
teichmann@452: </html>