annotate bitten/trac_ext/web_ui.py @ 161:4677161d2ae9

Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
author cmlenz
date Sat, 27 Aug 2005 07:28:30 +0000
parents 395b67aa072e
children 634be6cbb808
rev   line source
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
1 # -*- coding: iso8859-1 -*-
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
2 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
4 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
5 # Bitten is free software; you can redistribute it and/or
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
6 # modify it under the terms of the GNU General Public License as
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
7 # published by the Free Software Foundation; either version 2 of the
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
8 # License, or (at your option) any later version.
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
9 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
10 # Trac is distributed in the hope that it will be useful,
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
13 # General Public License for more details.
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
14 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
15 # You should have received a copy of the GNU General Public License
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
16 # along with this program; if not, write to the Free Software
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
17 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
18 #
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
19 # Author: Christopher Lenz <cmlenz@gmx.de>
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
20
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
21 import re
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
22 from time import localtime, strftime
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
23
99
efc1eed69ba8 Make Bitten deployable in Trac as a [http://peak.telecommunity.com/DevCenter/PythonEggs Python egg].
cmlenz
parents: 98
diff changeset
24 import pkg_resources
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
25 from trac.core import *
64
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
26 from trac.Timeline import ITimelineEventProvider
47
083e848088ee * Improvements to the model classes, and a couple of unit tests.
cmlenz
parents: 45
diff changeset
27 from trac.util import escape, pretty_timedelta
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
28 from trac.web.chrome import INavigationContributor, ITemplateProvider, \
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
29 add_link, add_stylesheet
139
4289fa18de0f * Clean up some imports.
cmlenz
parents: 138
diff changeset
30 from trac.web import IRequestHandler
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
31 from trac.wiki import wiki_to_html
112
a38eabd4b6e1 * Store build logs in a structured way, for example to highlight messages on the error stream.
cmlenz
parents: 111
diff changeset
32 from bitten.model import BuildConfig, TargetPlatform, Build, BuildStep, BuildLog
120
b63ed684c29c Show the list of reports generated on the build page.
cmlenz
parents: 114
diff changeset
33 from bitten.store import ReportStore
161
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
34 from bitten.trac_ext.api import ILogFormatter, IReportSummarizer
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
35 from bitten.trac_ext.summarizers import *
114
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
36
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
37 _status_label = {Build.IN_PROGRESS: 'in progress',
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
38 Build.SUCCESS: 'completed',
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
39 Build.FAILURE: 'failed'}
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
40
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
41 def _build_to_hdf(env, req, build):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
42 hdf = {'id': build.id, 'name': build.slave, 'rev': build.rev,
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
43 'status': _status_label[build.status],
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
44 'cls': _status_label[build.status].replace(' ', '-'),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
45 'href': env.href.build(build.config, build.id),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
46 'chgset_href': env.href.changeset(build.rev)}
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
47 if build.started:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
48 hdf['started'] = strftime('%x %X', localtime(build.started))
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
49 hdf['started_delta'] = pretty_timedelta(build.started)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
50 if build.stopped:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
51 hdf['stopped'] = strftime('%x %X', localtime(build.stopped))
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
52 hdf['stopped_delta'] = pretty_timedelta(build.stopped)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
53 hdf['duration'] = pretty_timedelta(build.stopped, build.started)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
54 hdf['slave'] = {
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
55 'name': build.slave,
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
56 'ip_address': build.slave_info.get(Build.IP_ADDRESS),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
57 'os': build.slave_info.get(Build.OS_NAME),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
58 'os.family': build.slave_info.get(Build.OS_FAMILY),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
59 'os.version': build.slave_info.get(Build.OS_VERSION),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
60 'machine': build.slave_info.get(Build.MACHINE),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
61 'processor': build.slave_info.get(Build.PROCESSOR)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
62 }
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
63 return hdf
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
64
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
65 class BittenChrome(Component):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
66 """Provides the Bitten templates and static resources."""
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
67
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
68 implements(ITemplateProvider)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
69
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
70 # ITemplatesProvider methods
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
71
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
72 def get_htdocs_dir(self):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
73 return pkg_resources.resource_filename(__name__, 'htdocs')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
74
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
75 def get_templates_dir(self):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
76 return pkg_resources.resource_filename(__name__, 'templates')
114
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
77
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
78
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
79 class BuildConfigController(Component):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
80 """Implements the web interface for build configurations."""
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
81
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
82 implements(INavigationContributor, IRequestHandler)
64
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
83
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
84 # INavigationContributor methods
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
85
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
86 def get_active_navigation_item(self, req):
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
87 return 'build'
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
88
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
89 def get_navigation_items(self, req):
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
90 if not req.perm.has_permission('BUILD_VIEW'):
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
91 return
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
92 yield 'mainnav', 'build', \
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
93 '<a href="%s" accesskey="5">Build Status</a>' \
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
94 % self.env.href.build()
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
95
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
96 # IRequestHandler methods
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
97
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
98 def match_request(self, req):
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
99 match = re.match(r'/build(?:/([\w.-]+))?$', req.path_info)
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
100 if match:
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
101 if match.group(1):
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
102 req.args['config'] = match.group(1)
35
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
103 return True
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
104
67631e1d4d45 Some stubbed out code for the Bitten/Trac-integration. This creates a {{{bitten_build}}} table on database upgrade after the plugin is enabled.
cmlenz
parents:
diff changeset
105 def process_request(self, req):
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
106 req.perm.assert_permission('BUILD_VIEW')
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
107
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
108 action = req.args.get('action')
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
109 config = req.args.get('config')
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
110
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
111 if req.method == 'POST':
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
112 if config:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
113 if action == 'new':
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
114 self._do_create_platform(req, config)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
115 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
116 platform_id = req.args.get('platform')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
117 if platform_id:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
118 if action == 'edit':
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
119 self._do_save_platform(req, config, platform_id)
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
120 elif 'delete' in req.args:
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
121 self._do_delete_platforms(req)
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
122 self._render_config_form(req, config)
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
123 elif 'new' in req.args:
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
124 platform = TargetPlatform(self.env, config=config)
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
125 self._render_platform_form(req, platform)
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
126 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
127 self._do_save_config(req, config)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
128 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
129 if action == 'new':
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
130 self._do_create_config(req)
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
131 else:
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
132 if config:
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
133 if action == 'edit':
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
134 platform_id = req.args.get('platform')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
135 if platform_id:
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
136 platform = TargetPlatform.fetch(self.env,
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
137 int(platform_id))
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
138 self._render_platform_form(req, platform)
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
139 elif 'new' in req.args:
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
140 platform = TargetPlatform(self.env, config=config)
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
141 self._render_platform_form(req, platform)
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
142 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
143 self._render_config_form(req, config)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
144 else:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
145 self._render_config(req, config)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
146 else:
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
147 if action == 'new':
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
148 self._render_config_form(req)
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
149 else:
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
150 self._render_overview(req)
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
151
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
152 add_stylesheet(req, 'bitten.css')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
153 return 'bitten_config.cs', None
64
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
154
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
155 # Internal methods
de1a7499f4d6 Basic timeline provider for builds.
cmlenz
parents: 60
diff changeset
156
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
157 def _do_create_config(self, req):
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
158 """Create a new build configuration."""
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
159 req.perm.assert_permission('BUILD_CREATE')
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
160
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
161 if 'cancel' in req.args:
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
162 req.redirect(self.env.href.build())
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
163
147
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
164 config_name = req.args.get('name')
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
165
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
166 assert not BuildConfig.fetch(self.env, config_name), \
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
167 'A build configuration with the name "%s" already exists' \
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
168 % config_name
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
169
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
170 config = BuildConfig(self.env, name=config_name,
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
171 path=req.args.get('path', ''),
147
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
172 recipe=req.args.get('recipe', ''),
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
173 min_rev=req.args.get('min_rev', ''),
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
174 max_rev=req.args.get('max_rev', ''),
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
175 label=req.args.get('label', ''),
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
176 description=req.args.get('description'))
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
177 config.insert()
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
178
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
179 req.redirect(self.env.href.build(config.name))
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
180
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
181 def _do_save_config(self, req, config_name):
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
182 """Save changes to a build configuration."""
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
183 req.perm.assert_permission('BUILD_MODIFY')
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
184
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
185 if 'cancel' in req.args:
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
186 req.redirect(self.env.href.build(config_name))
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
187
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
188 config = BuildConfig.fetch(self.env, config_name)
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
189 assert config, 'Build configuration "%s" does not exist' % config_name
147
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
190
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
191 if 'activate' in req.args:
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
192 config.active = True
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
193
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
194 elif 'deactivate' in req.args:
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
195 config.active = False
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
196
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
197 else:
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
198 # TODO: Validate recipe, repository path, etc
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
199 config.name = req.args.get('name')
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
200 config.path = req.args.get('path', '')
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
201 config.recipe = req.args.get('recipe', '')
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
202 config.min_rev = req.args.get('min_rev')
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
203 config.max_rev = req.args.get('max_rev')
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
204 config.label = req.args.get('label', '')
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
205 config.description = req.args.get('description', '')
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
206
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
207 config.update()
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
208 req.redirect(self.env.href.build(config.name))
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
209
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
210 def _do_create_platform(self, req, config_name):
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
211 """Create a new target platform."""
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
212 req.perm.assert_permission('BUILD_MODIFY')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
213
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
214 if 'cancel' in req.args:
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
215 req.redirect(self.env.href.build(config_name, action='edit'))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
216
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
217 platform = TargetPlatform(self.env, config=config_name,
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
218 name=req.args.get('name'))
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
219
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
220 properties = [int(key[9:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
221 if key.startswith('property_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
222 properties.sort()
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
223 patterns = [int(key[8:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
224 if key.startswith('pattern_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
225 patterns.sort()
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
226 platform.rules = [(req.args.get('property_%d' % property),
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
227 req.args.get('pattern_%d' % pattern))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
228 for property, pattern in zip(properties, patterns)]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
229
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
230 add_rules = [int(key[9:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
231 if key.startswith('add_rule_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
232 if add_rules:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
233 platform.rules.insert(add_rules[0] + 1, ('', ''))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
234 self._render_platform_form(req, platform)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
235 return
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
236 rm_rules = [int(key[8:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
237 if key.startswith('rm_rule_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
238 if rm_rules:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
239 del platform.rules[rm_rules[0]]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
240 self._render_platform_form(req, platform)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
241 return
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
242
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
243 platform.insert()
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
244
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
245 req.redirect(self.env.href.build(config_name, action='edit'))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
246
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
247 def _do_delete_platforms(self, req):
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
248 """Delete selected target platforms."""
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
249 req.perm.assert_permission('BUILD_MODIFY')
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
250 self.log.debug('_do_delete_platforms')
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
251
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
252 db = self.env.get_db_cnx()
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
253 for platform_id in [int(id) for id in req.args.get('delete_platform')]:
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
254 platform = TargetPlatform.fetch(self.env, platform_id, db=db)
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
255 self.log.info('Deleting target platform %s of configuration %s',
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
256 platform.name, platform.config)
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
257 platform.delete(db=db)
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
258 db.commit()
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
259
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
260 def _do_save_platform(self, req, config_name, platform_id):
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
261 """Save changes to a target platform."""
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
262 req.perm.assert_permission('BUILD_MODIFY')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
263
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
264 if 'cancel' in req.args:
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
265 req.redirect(self.env.href.build(config_name, action='edit'))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
266
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
267 platform = TargetPlatform.fetch(self.env, platform_id)
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
268 platform.name = req.args.get('name')
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
269
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
270 properties = [int(key[9:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
271 if key.startswith('property_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
272 properties.sort()
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
273 patterns = [int(key[8:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
274 if key.startswith('pattern_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
275 patterns.sort()
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
276 platform.rules = [(req.args.get('property_%d' % property),
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
277 req.args.get('pattern_%d' % pattern))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
278 for property, pattern in zip(properties, patterns)]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
279
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
280 add_rules = [int(key[9:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
281 if key.startswith('add_rule_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
282 if add_rules:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
283 platform.rules.insert(add_rules[0] + 1, ('', ''))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
284 self._render_platform_form(req, platform)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
285 return
98
1d9dc07acd3d Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents: 96
diff changeset
286 rm_rules = [int(key[8:]) for key in req.args
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
287 if key.startswith('rm_rule_')]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
288 if rm_rules:
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
289 del platform.rules[rm_rules[0]]
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
290 self._render_platform_form(req, platform)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
291 return
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
292
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
293 platform.update()
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
294
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
295 req.redirect(self.env.href.build(config_name, action='edit'))
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
296
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
297 def _render_overview(self, req):
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
298 req.hdf['title'] = 'Build Status'
45
80bc0fae3ed1 Renamed {{{Configuration}}} to {{{BuildConfig}}}.
cmlenz
parents: 41
diff changeset
299 configurations = BuildConfig.select(self.env, include_inactive=True)
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
300 for idx, config in enumerate(configurations):
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
301 description = config.description
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
302 if description:
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
303 description = wiki_to_html(description, self.env, req)
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
304 req.hdf['configs.%d' % idx] = {
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
305 'name': config.name, 'label': config.label or config.name,
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
306 'path': config.path, 'description': description,
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
307 'href': self.env.href.build(config.name),
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
308 }
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
309 req.hdf['page.mode'] = 'overview'
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
310 req.hdf['config.can_create'] = req.perm.has_permission('BUILD_CREATE')
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
311
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
312 def _render_config(self, req, config_name):
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
313 config = BuildConfig.fetch(self.env, config_name)
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
314 req.hdf['title'] = 'Build Configuration "%s"' \
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
315 % escape(config.label or config.name)
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
316 add_link(req, 'up', self.env.href.build(), 'Build Status')
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
317 description = config.description
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
318 if description:
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
319 description = wiki_to_html(description, self.env, req)
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
320 req.hdf['config'] = {
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
321 'name': config.name, 'label': config.label, 'path': config.path,
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
322 'active': config.active, 'description': description,
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
323 'browser_href': self.env.href.browser(config.path),
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
324 'can_modify': req.perm.has_permission('BUILD_MODIFY')
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
325 }
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
326 req.hdf['page.mode'] = 'view_config'
47
083e848088ee * Improvements to the model classes, and a couple of unit tests.
cmlenz
parents: 45
diff changeset
327
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
328 platforms = TargetPlatform.select(self.env, config=config_name)
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
329 req.hdf['config.platforms'] = [
76
ffa1ffd8c7db * Implement basic slave selection based on configured target platforms. Closes #15.
cmlenz
parents: 74
diff changeset
330 {'name': platform.name, 'id': platform.id} for platform in platforms
ffa1ffd8c7db * Implement basic slave selection based on configured target platforms. Closes #15.
cmlenz
parents: 74
diff changeset
331 ]
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
332
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
333 repos = self.env.get_repository(req.authname)
111
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
334 try:
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
335 root = repos.get_node(config.path)
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
336 for idx, (path, rev, chg) in enumerate(root.get_history()):
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
337 prefix = 'config.builds.%d' % rev
111
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
338 req.hdf[prefix + '.href'] = self.env.href.changeset(rev)
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
339 for build in Build.select(self.env, config=config.name, rev=rev):
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
340 if build.status == Build.PENDING:
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
341 continue
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
342 req.hdf['%s.%s' % (prefix, build.platform)] = _build_to_hdf(self.env, req, build)
111
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
343 if idx > 4:
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
344 break
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
345 except TracError, e:
8d76fd3918a5 Don't just bail on the build configuration page if an invalid repository path is configured.
cmlenz
parents: 99
diff changeset
346 self.log.error('Error accessing repository info', exc_info=True)
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
347
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
348 def _render_config_form(self, req, config_name=None):
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
349 config = BuildConfig.fetch(self.env, config_name)
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
350 if config:
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
351 req.perm.assert_permission('BUILD_MODIFY')
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
352 req.hdf['config'] = {
147
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
353 'name': config.name, 'exists': config.exists,
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
354 'path': config.path, 'active': config.active,
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
355 'recipe': config.recipe, 'min_rev': config.min_rev,
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
356 'max_rev': config.max_rev, 'label': config.label,
395b67aa072e Build recipes are now stored in the database with the build configuration. This means that it is no longer necessary to store the recipe in the repository. Closes #41.
cmlenz
parents: 142
diff changeset
357 'description': config.description
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
358 }
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
359
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
360 req.hdf['title'] = 'Edit Build Configuration "%s"' \
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
361 % escape(config.label or config.name)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
362 for idx, platform in enumerate(TargetPlatform.select(self.env,
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
363 config_name)):
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
364 req.hdf['config.platforms.%d' % idx] = {
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
365 'id': platform.id, 'name': platform.name,
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
366 'href': self.env.href.build(config_name, action='edit',
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
367 platform=platform.id)
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
368 }
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
369 else:
50
0d5ad32948b7 Restrict access to web interface with custom permission actions.
cmlenz
parents: 47
diff changeset
370 req.perm.assert_permission('BUILD_CREATE')
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
371 req.hdf['title'] = 'Create Build Configuration'
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
372 req.hdf['page.mode'] = 'edit_config'
41
16b30ffc5fb9 Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents: 35
diff changeset
373
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
374 def _render_platform_form(self, req, platform):
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
375 req.perm.assert_permission('BUILD_MODIFY')
74
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
376 if platform.exists:
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
377 req.hdf['title'] = 'Edit Target Platform "%s"' \
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
378 % escape(platform.name)
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
379 else:
1d4fa4c32afa Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents: 73
diff changeset
380 req.hdf['title'] = 'Add Target Platform'
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
381 req.hdf['platform'] = {
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
382 'name': platform.name, 'id': platform.id, 'exists': platform.exists,
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
383 'rules': [{'property': propname, 'pattern': pattern}
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
384 for propname, pattern in platform.rules] or [('', '')]
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
385 }
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
386 req.hdf['page.mode'] = 'edit_platform'
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
387
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
388
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
389 class BuildController(Component):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
390 """Renders the build page."""
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
391 implements(INavigationContributor, IRequestHandler, ITimelineEventProvider)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
392
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
393 log_formatters = ExtensionPoint(ILogFormatter)
161
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
394 report_summarizers = ExtensionPoint(IReportSummarizer)
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
395
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
396 # INavigationContributor methods
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
397
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
398 def get_active_navigation_item(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
399 return 'build'
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
400
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
401 def get_navigation_items(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
402 return []
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
403
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
404 # IRequestHandler methods
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
405
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
406 def match_request(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
407 match = re.match(r'/build/([\w.-]+)/([\d]+)', req.path_info)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
408 if match:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
409 if match.group(1):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
410 req.args['config'] = match.group(1)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
411 if match.group(2):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
412 req.args['id'] = match.group(2)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
413 return True
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
414
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
415 def process_request(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
416 req.perm.assert_permission('BUILD_VIEW')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
417
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
418 db = self.env.get_db_cnx()
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
419 build_id = int(req.args.get('id'))
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
420 build = Build.fetch(self.env, build_id, db=db)
96
c8c36f34ff5a Change model class pattern:
cmlenz
parents: 91
diff changeset
421 assert build, 'Build %s does not exist' % build_id
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
422
73
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
423 add_link(req, 'up', self.env.href.build(build.config),
6d7753ea1798 Implemented basic management of target platforms. Closes #14.
cmlenz
parents: 69
diff changeset
424 'Build Configuration')
91
91db738c6a74 Fix status display for in-progress builds.
cmlenz
parents: 82
diff changeset
425 status2title = {Build.SUCCESS: 'Success', Build.FAILURE: 'Failure',
91db738c6a74 Fix status display for in-progress builds.
cmlenz
parents: 82
diff changeset
426 Build.IN_PROGRESS: 'In Progress'}
69
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
427 req.hdf['title'] = 'Build %s - %s' % (build_id,
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
428 status2title[build.status])
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
429 req.hdf['page.mode'] = 'view_build'
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
430 config = BuildConfig.fetch(self.env, build.config, db=db)
69
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
431 req.hdf['build.config'] = {
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
432 'name': config.label,
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
433 'href': self.env.href.build(config.name)
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
434 }
b92d7c7d70fd Record build slave properties in database.
cmlenz
parents: 67
diff changeset
435
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
436 req.hdf['build'] = _build_to_hdf(self.env, req, build)
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
437 steps = []
112
a38eabd4b6e1 * Store build logs in a structured way, for example to highlight messages on the error stream.
cmlenz
parents: 111
diff changeset
438 for step in BuildStep.select(self.env, build=build.id, db=db):
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
439 steps.append({
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
440 'name': step.name, 'description': step.description,
123
cccfa117e344 Template cleanup
cmlenz
parents: 120
diff changeset
441 'duration': pretty_timedelta(step.started, step.stopped),
161
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
442 'failed': step.status == BuildStep.FAILURE,
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
443 'log': self._render_log(req, build, step),
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
444 'reports': self._render_reports(req, build, step)
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
445 })
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
446 req.hdf['build.steps'] = steps
120
b63ed684c29c Show the list of reports generated on the build page.
cmlenz
parents: 114
diff changeset
447
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
448 add_stylesheet(req, 'bitten.css')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
449 return 'bitten_build.cs', None
80
dc1c7fc9b915 Record the output of build steps in the database. See #12. Still need to get better granularity in transmitting the log output from slave to master before #12 can be closed.
cmlenz
parents: 79
diff changeset
450
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
451 # ITimelineEventProvider methods
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
452
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
453 def get_timeline_filters(self, req):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
454 if req.perm.has_permission('BUILD_VIEW'):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
455 yield ('build', 'Builds')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
456
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
457 def get_timeline_events(self, req, start, stop, filters):
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
458 if 'build' in filters:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
459 add_stylesheet(req, 'bitten.css')
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
460 db = self.env.get_db_cnx()
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
461 cursor = db.cursor()
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
462 cursor.execute("SELECT b.id,b.config,c.label,b.rev,p.name,b.slave,"
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
463 "b.stopped,b.status FROM bitten_build AS b"
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
464 " INNER JOIN bitten_config AS c ON (c.name=b.config)"
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
465 " INNER JOIN bitten_platform AS p ON (p.id=b.platform) "
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
466 "WHERE b.stopped>=%s AND b.stopped<=%s "
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
467 "AND b.status IN (%s, %s) ORDER BY b.stopped",
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
468 (start, stop, Build.SUCCESS, Build.FAILURE))
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
469 event_kinds = {Build.SUCCESS: 'successbuild',
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
470 Build.FAILURE: 'failedbuild'}
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
471 for id, config, label, rev, platform, slave, stopped, status in cursor:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
472 title = 'Build of <em>%s [%s]</em> by %s (%s) %s' \
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
473 % (escape(label), escape(rev), escape(slave),
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
474 escape(platform), _status_label[status])
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
475 if req.args.get('format') == 'rss':
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
476 href = self.env.abs_href.build(config, id)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
477 else:
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
478 href = self.env.href.build(config, id)
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
479 yield event_kinds[status], href, title, stopped, None, ''
114
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
480
161
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
481 # Internal methods
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
482
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
483 def _render_log(self, req, build, step):
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
484 items = []
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
485 for log in BuildLog.select(self.env, build=build.id, step=step.name):
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
486 formatters = []
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
487 for formatter in self.log_formatters:
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
488 formatters.append(formatter.get_formatter(req, build, step,
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
489 log.type))
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
490 for level, message in log.messages:
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
491 for format in formatters:
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
492 message = format(level, message)
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
493 items.append({'level': level, 'message': message})
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
494 return items
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
495
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
496 def _render_reports(self, req, build, step):
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
497 summarizers = {} # keyed by report type
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
498 for summarizer in self.report_summarizers:
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
499 types = summarizer.get_supported_report_types()
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
500 summarizers.update(dict([(type, summarizer) for type in types]))
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
501 self.log.debug("Report summarizers: %s", summarizers)
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
502
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
503 store = ReportStore(self.env)
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
504 reports = []
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
505 for report in store.retrieve_reports(build, step):
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
506 report_type = report.attr['type']
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
507 summarizer = summarizers.get(report_type)
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
508 if summarizer:
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
509 summary = summarizer.render_report_summary(req, build, step,
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
510 report)
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
511 else:
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
512 summary = None
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
513 report_href = self.env.href.buildreport(build.id, step.name,
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
514 report_type)
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
515 reports.append({'type': report_type, 'href': report_href,
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
516 'summary': summary})
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
517 return reports
4677161d2ae9 Reports can now be "summarized" on the build results page, with special components rendering summary HTML fragments for specific report types. The summaries are displayed as tabs next to the log of the build step. Currently summarizers for test results and code coverage exist.
cmlenz
parents: 147
diff changeset
518
114
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
519
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
520 class SourceFileLinkFormatter(Component):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
521 """Finds references to files and directories in the repository in the build
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
522 log and renders them as links to the repository browser."""
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
523
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
524 implements(ILogFormatter)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
525
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
526 def get_formatter(self, req, build, step, type):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
527 config = BuildConfig.fetch(self.env, build.config)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
528 repos = self.env.get_repository(req.authname)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
529 nodes = []
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
530 def _walk(node):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
531 for child in node.get_entries():
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
532 path = child.path[len(config.path) + 1:]
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
533 pattern = re.compile("([\s'\"])(%s)([\s'\"])" % re.escape(path))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
534 nodes.append((child.path, pattern))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
535 if child.isdir:
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
536 _walk(child)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
537 _walk(repos.get_node(config.path, build.rev))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
538 nodes.sort(lambda x, y: -cmp(len(x[0]), len(y[0])))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
539
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
540 def _formatter(level, message):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
541 for path, pattern in nodes:
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
542 def _replace(m):
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
543 return '%s<a href="%s">%s</a>%s' % (m.group(1),
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
544 self.env.href.browser(path, rev=build.rev),
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
545 m.group(2), m.group(3))
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
546 message = pattern.sub(_replace, message)
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
547 return message
ecc062d4fd55 Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents: 112
diff changeset
548 return _formatter
128
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
549
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
550
141
0e21778c04ef Refactoring: split up the components and templates that render the web interface.
cmlenz
parents: 139
diff changeset
551 class BuildReportController(Component):
128
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
552 """Temporary web interface that simply displays the XML source of a report
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
553 using the Trac `Mimeview` component."""
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
554
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
555 implements(INavigationContributor, IRequestHandler)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
556
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
557 template_cs = """<?cs include:"header.cs" ?>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
558 <div id="ctxtnav" class="nav"></div>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
559 <div id="content" class="build">
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
560 <h1>Build <a href="<?cs var:build.href ?>"><?cs var:build.id ?></a>: <?cs
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
561 var:report.type ?></h1>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
562 <?cs var:report.preview ?>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
563 </div>
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
564 <?cs include:"footer.cs" ?>"""
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
565
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
566 # INavigationContributor methods
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
567
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
568 def get_active_navigation_item(self, req):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
569 return 'build'
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
570
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
571 def get_navigation_items(self, req):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
572 return []
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
573
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
574 # IRequestHandler methods
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
575
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
576 def match_request(self, req):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
577 match = re.match(r'/buildreport/(?P<build>[\d]+)/(?P<step>[\w]+)'
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
578 r'/(?P<type>[\w]+)', req.path_info)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
579 if match:
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
580 for name in match.groupdict():
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
581 req.args[name] = match.group(name)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
582 return True
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
583
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
584 def process_request(self, req):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
585 req.perm.assert_permission('BUILD_VIEW')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
586
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
587 build = Build.fetch(self.env, int(req.args.get('build')))
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
588 if not build:
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
589 raise TracError, 'Build %d does not exist' % req.args.get('build')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
590 step = BuildStep.fetch(self.env, build.id, req.args.get('step'))
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
591 if not step:
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
592 raise TracError, 'Build step %s does not exist' \
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
593 % req.args.get('step')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
594 report_type = req.args.get('type')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
595
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
596 req.hdf['build'] = {'id': build.id,
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
597 'href': self.env.href.build(build.config, build.id)}
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
598
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
599 store = ReportStore(self.env)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
600 reports = []
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
601 for report in store.retrieve_reports(build, step, report_type):
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
602 req.hdf['title'] = 'Build %d: %s' % (build.id, report_type)
138
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
603 xml = report._node.toprettyxml(' ')
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
604 if req.args.get('format') == 'xml':
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
605 req.send_response(200)
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
606 req.send_header('Content-Type', 'text/xml;charset=utf-8')
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
607 req.end_headers()
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
608 req.write(xml)
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
609 return
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
610 else:
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
611 from trac.mimeview import Mimeview
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
612 preview = Mimeview(self.env).render(req, 'application/xml', xml)
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
613 req.hdf['report'] = {'type': report_type, 'preview': preview}
128
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
614 break
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
615
138
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
616 xml_href = self.env.href.buildreport(build.id, step.name, report_type,
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
617 format='xml')
f34d2b9d9556 Add plain XML view of reports.
cmlenz
parents: 128
diff changeset
618 add_link(req, 'alternate', xml_href, 'XML', 'text/xml')
128
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
619 add_stylesheet(req, 'css/code.css')
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
620 template = req.hdf.parse(self.template_cs)
4e3373472318 Add a view of the XML reports stored for a build. This is temporary, and will probably go away as soon as a proper interface to the reports is added.
cmlenz
parents: 123
diff changeset
621 return template, None
Copyright (C) 2012-2017 Edgewall Software