changeset 381:166dcdb9269e

New In-Progress Builds Page, which lists the current builds that are being processed by slaves. Accessible from the main build page.
author wbell
date Tue, 24 Jul 2007 21:56:00 +0000
parents ff46277b466c
children 2078b20186cf
files bitten/trac_ext/templates/bitten_build.cs bitten/trac_ext/templates/bitten_config.cs bitten/trac_ext/web_ui.py
diffstat 3 files changed, 123 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/bitten/trac_ext/templates/bitten_build.cs
+++ b/bitten/trac_ext/templates/bitten_build.cs
@@ -31,11 +31,15 @@
      /if ?>
     </dd><?cs
    /if ?>
-   <dt class="time">Started:</dt>
+   <dt class="time"><?cs if:build.stopped ?>Started:<?cs else ?>Building since:<?cs /if ?>
    <dd class="time"><?cs var:build.started ?> (<?cs
     var:build.started_delta ?> ago)
    </dd>
-   <dt class="duration">Took:</dt>
+   <?cs if:build.stopped ?>
+     <dt class="time">Stopped:</dt>
+     <dd class="time"><?cs var:build.stopped ?> (<?cs var:build.stopped_delta ?> ago) </dd>
+   <?cs /if ?>
+   <dt class="duration">Duration:</dt>
    <dd class="duration"><?cs
     var:build.duration ?>
    </dd>
--- a/bitten/trac_ext/templates/bitten_config.cs
+++ b/bitten/trac_ext/templates/bitten_config.cs
@@ -17,6 +17,15 @@
     /if ?></ul><?cs
    /if ?><?cs
   /with ?><?cs
+ elif:page.mode == 'overview' ?><?cs
+  with:links = chrome.links ?><?cs
+    if:len(links.views) ?><ul>
+     <li class="last">
+      <a href="<?cs var:links.views.0.href ?>"><?cs
+        var:links.views.0.title ?></a>
+     </li><?cs
+    /if ?></ul><?cs
+  /with ?><?cs
  /if ?></div>
  <div id="content" class="build">
   <h1><?cs var:title ?></h1><?cs
@@ -269,6 +278,54 @@
     /if ?></table><?cs
    /if ?></div><br style="clear: right"/><?cs
 
+  elif:page.mode == 'view_inprogress' ?><?cs
+   each:config = configs ?>
+    <h2 class="config <?cs if:!config.active ?>deactivated<?cs
+    /if ?>"><a href="<?cs var:config.href ?>"><?cs var:config.label ?></a></h2>
+     <table class="listing" id="builds"><thead><tr>
+     <th class="chgset" abbrev="Changeset">Chgset</th>
+     <th>Build</th></tr></thead><?cs 
+      each:build = config.builds ?><tr><th class="chgset" scope="row">
+        <a href="<?cs var:build.rev_href ?>" title="View Changeset">[<?cs
+        var:build.rev ?>]</a></th><td class="<?cs
+        var:build.cls ?>"><div class="info">
+        <a href="<?cs
+        var:build.href ?>" title="View build results"><?cs var:build.id ?>:
+         <strong class="status"><?cs var:build.platform ?></strong></a>
+        <div class="system">
+       <strong><?cs var:build.slave.name ?></strong> (<?cs
+       var:build.slave.ipnr ?>)<br /><?cs
+       var:build.slave.os.name ?> <?cs var:build.slave.os.version ?><?cs 
+       if:build.slave.machine || build.slave.processor ?> / <?cs
+        alt:build.slave.processor ?><?cs
+         var:build.slave.machine ?><?cs
+        /alt ?><?cs
+       /if ?><br /><?cs
+         if:build.started ?>
+           Building since: <?cs var:build.started ?>
+           (<?cs var:build.started_delta ?> ago)<?cs
+         /if ?>
+        </div>
+        </div><?cs
+         if:len(build.steps) ?><ul class="steps"><?cs
+          each:step = build.steps ?><li class="<?cs
+           if:step.failed ?>failed<?cs else ?>success<?cs /if ?>">
+           <span class="duration"><?cs var:step.duration ?></span> <a href="<?cs
+           var:step.href ?>"<?cs
+           if:step.description ?> title="<?cs
+            var:step.description ?>"<?cs
+           /if ?>><?cs
+           var:name(step) ?></a><?cs
+           if:step.failed && len(step.errors) ?><ul><?cs
+            each:error = step.errors ?><li><?cs
+             var:error ?></li><?cs
+            /each ?></ul><?cs
+           /if ?></li><?cs
+          /each ?></ul><?cs
+         /if ?></td></td></tr><?cs
+     /each ?></table><?cs
+   /each ?></div><?cs
+
   elif:page.mode == 'edit_platform' ?>
    <form class="platform" method="post" action="">
     <div class="field"><label>Name:<br />
--- a/bitten/trac_ext/web_ui.py
+++ b/bitten/trac_ext/web_ui.py
@@ -51,6 +51,7 @@
     if build.started:
         hdf['started'] = format_datetime(build.started)
         hdf['started_delta'] = pretty_timedelta(build.started)
+        hdf['duration'] = pretty_timedelta(build.started)
     if build.stopped:
         hdf['stopped'] = format_datetime(build.stopped)
         hdf['stopped_delta'] = pretty_timedelta(build.stopped)
@@ -120,6 +121,7 @@
         req.perm.assert_permission('BUILD_VIEW')
 
         action = req.args.get('action')
+        view = req.args.get('view')
         config = req.args.get('config')
 
         if req.method == 'POST':
@@ -164,6 +166,8 @@
             else:
                 if action == 'new':
                     self._render_config_form(req)
+                elif view == 'inprogress':
+                    self._render_inprogress(req)
                 else:
                     self._render_overview(req)
 
@@ -351,6 +355,8 @@
             show_all = True
         req.hdf['config.show_all'] = show_all
 
+        add_link(req, 'views', req.href.build(view='inprogress'), 'In Progress Builds')
+
         configs = BuildConfig.select(self.env, include_inactive=show_all)
         for idx, config in enumerate(configs):
             prefix = 'configs.%d' % idx
@@ -397,6 +403,60 @@
         req.hdf['page.mode'] = 'overview'
         req.hdf['config.can_create'] = req.perm.has_permission('BUILD_CREATE')
 
+    def _render_inprogress(self, req):
+        req.hdf['title'] = 'In Progress Builds'
+
+        db = self.env.get_db_cnx()
+
+        configs = BuildConfig.select(self.env, include_inactive=False)
+        for idx, config in enumerate(configs):
+            if not config.active:
+                continue
+
+            in_progress_builds = Build.select(self.env, config=config.name,
+                                              status=Build.IN_PROGRESS, db=db)
+            
+            # sort correctly by revision.
+            builds = list(in_progress_builds)
+            builds.sort(lambda x, y: int(y.rev) - int(x.rev))
+            prefix = 'configs.%d' % idx
+
+            current_builds = 0
+            for idx2, build in enumerate(builds):
+                prefix2 = '%s.builds.%d' % (prefix, idx2)
+                rev = build.rev
+                req.hdf[prefix2] = _build_to_hdf(self.env, req, build)
+                req.hdf[prefix2 + '.rev'] = rev
+                req.hdf[prefix2 + '.rev_href'] = self.env.href.changeset(rev)
+                platform = TargetPlatform.fetch(self.env, build.platform)
+                req.hdf[prefix2 + '.platform'] = platform.name
+                
+                for step in BuildStep.select(self.env, build=build.id, db=db):
+                    req.hdf['%s.steps.%s' % (prefix2, step.name)] = {
+                         'description': step.description,
+                         'duration': datetime.fromtimestamp(step.stopped) - \
+                                     datetime.fromtimestamp(step.started),
+                         'failed': not step.successful,
+                         'errors': step.errors,
+                         'href': req.hdf[prefix2 + '.href'] + '#step_' + step.name }
+
+                current_builds = current_builds + 1
+
+            if current_builds == 0: 
+                continue
+
+            description = config.description
+            if description:
+                description = wiki_to_html(description, self.env, req)
+            req.hdf[prefix] = {
+                'name': config.name, 'label': config.label or config.name,
+                'active': config.active, 'path': config.path,
+                'description': description,
+                'href': self.env.href.build(config.name),
+            }
+
+        req.hdf['page.mode'] = 'view_inprogress'
+
     def _render_config(self, req, config_name):
         db = self.env.get_db_cnx()
 
Copyright (C) 2012-2017 Edgewall Software