Mercurial > bitten > bitten-test
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()