Mercurial > bitten > bitten-test
annotate bitten/trac_ext/web_ui.py @ 362:4645863d7966
Fix for a compatibility problem with Trac 0.11dev.
author | cmlenz |
---|---|
date | Thu, 25 Jan 2007 17:40:21 +0000 |
parents | 109800464463 |
children | 05c684ceb8c6 |
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> |
163 | 4 # All rights reserved. |
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
|
5 # |
163 | 6 # This software is licensed as described in the file COPYING, which |
7 # you should have received as part of this distribution. The terms | |
8 # are also available at http://bitten.cmlenz.net/wiki/License. | |
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
|
9 |
316 | 10 """Implementation of the Bitten web interface.""" |
11 | |
295
5f84af72d17f
* Store executable bit in ZIP archives (from `svn:executable`).
cmlenz
parents:
263
diff
changeset
|
12 from datetime import datetime |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
13 import posixpath |
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
|
14 import re |
250 | 15 try: |
16 set | |
17 except NameError: | |
18 from sets import Set as set | |
19 from StringIO import StringIO | |
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
|
20 |
99
efc1eed69ba8
Make Bitten deployable in Trac as a [http://peak.telecommunity.com/DevCenter/PythonEggs Python egg].
cmlenz
parents:
98
diff
changeset
|
21 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
|
22 from trac.core import * |
362 | 23 try: |
24 from trac.timeline import ITimelineEventProvider | |
25 except ImportError: | |
26 from trac.Timeline import ITimelineEventProvider | |
321 | 27 from trac.util import escape, pretty_timedelta, format_datetime, shorten_line, \ |
28 Markup | |
174
79c61c26a4e1
* Changed the `IReportStore` interface to allow querying with [http://www.w3.org/XML/Query/ XQuery]. This should make it possible to efficiently query the report store for any existing metrics.
cmlenz
parents:
168
diff
changeset
|
29 from trac.web import IRequestHandler |
74
1d4fa4c32afa
Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents:
73
diff
changeset
|
30 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
|
31 add_link, add_stylesheet |
255
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
32 from trac.wiki import wiki_to_html, wiki_to_oneliner |
203
e6ddca1e5712
Huge refactoring to remove dependency on BDB XML. Report data is now stored in the Trac database (SQLite/PostgreSQL).
cmlenz
parents:
200
diff
changeset
|
33 from bitten.model import BuildConfig, TargetPlatform, Build, BuildStep, \ |
e6ddca1e5712
Huge refactoring to remove dependency on BDB XML. Report data is now stored in the Trac database (SQLite/PostgreSQL).
cmlenz
parents:
200
diff
changeset
|
34 BuildLog, Report |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
35 from bitten.queue import collect_changes |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
36 from bitten.recipe import Recipe, InvalidRecipeError |
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
|
37 from bitten.trac_ext.api import ILogFormatter, IReportSummarizer |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
38 from bitten.util import xmlio |
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
|
39 |
255
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
40 _status_label = {Build.PENDING: 'pending', |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
41 Build.IN_PROGRESS: 'in progress', |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
42 Build.SUCCESS: 'completed', |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
43 Build.FAILURE: 'failed'} |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
44 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
45 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
|
46 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
|
47 'status': _status_label[build.status], |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
48 'cls': _status_label[build.status].replace(' ', '-'), |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
49 '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
|
50 '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
|
51 if build.started: |
250 | 52 hdf['started'] = format_datetime(build.started) |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
53 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
|
54 if build.stopped: |
250 | 55 hdf['stopped'] = format_datetime(build.stopped) |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
56 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
|
57 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
|
58 hdf['slave'] = { |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
59 'name': build.slave, |
250 | 60 'ipnr': build.slave_info.get(Build.IP_ADDRESS), |
61 'os.name': build.slave_info.get(Build.OS_NAME), | |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
62 '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
|
63 '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
|
64 '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
|
65 '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
|
66 } |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
67 return hdf |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
68 |
318 | 69 |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
70 class BittenChrome(Component): |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
71 """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
|
72 |
320 | 73 implements(INavigationContributor, ITemplateProvider) |
64 | 74 |
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
|
75 # 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
|
76 |
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
|
77 def get_active_navigation_item(self, req): |
316 | 78 """Called by Trac to determine which navigation item should be marked |
79 as active. | |
80 | |
81 @param req: the request object | |
82 """ | |
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
|
83 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
|
84 |
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 def get_navigation_items(self, req): |
316 | 86 """Return the navigation item for access the build status overview from |
87 the Trac navigation bar.""" | |
50
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
88 if not req.perm.has_permission('BUILD_VIEW'): |
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
89 return |
320 | 90 yield ('mainnav', 'build', \ |
91 Markup('<a href="%s" accesskey="5">Build Status</a>', | |
92 self.env.href.build())) | |
93 | |
94 # ITemplatesProvider methods | |
95 | |
96 def get_htdocs_dirs(self): | |
97 """Return the directories containing static resources.""" | |
98 return [('bitten', pkg_resources.resource_filename(__name__, 'htdocs'))] | |
99 | |
100 def get_templates_dirs(self): | |
101 """Return the directories containing templates.""" | |
102 return [pkg_resources.resource_filename(__name__, 'templates')] | |
103 | |
104 | |
105 class BuildConfigController(Component): | |
106 """Implements the web interface for build configurations.""" | |
107 | |
108 implements(IRequestHandler) | |
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
|
109 |
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
|
110 # 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
|
111 |
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
|
112 def match_request(self, req): |
184
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
113 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
|
114 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
|
115 if match.group(1): |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
116 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
|
117 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
|
118 |
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
|
119 def process_request(self, req): |
50
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
120 req.perm.assert_permission('BUILD_VIEW') |
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
121 |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
122 action = req.args.get('action') |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
123 config = req.args.get('config') |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
124 |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
125 if req.method == 'POST': |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
126 if config: |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
127 if action == 'new': |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
128 self._do_create_platform(req, config) |
195
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
129 elif action == 'delete': |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
130 self._do_delete_config(req, config) |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
131 else: |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
132 platform_id = req.args.get('platform') |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
133 if platform_id: |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
134 if action == 'edit': |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
135 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
|
136 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
|
137 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
|
138 self._render_config_form(req, config) |
98
1d9dc07acd3d
Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents:
96
diff
changeset
|
139 elif 'new' in req.args: |
96 | 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._do_save_config(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 if action == 'new': |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
146 self._do_create_config(req) |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
147 else: |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
148 if config: |
195
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
149 if action == 'delete': |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
150 self._render_config_confirm(req, config) |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
151 elif action == 'edit': |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
152 platform_id = req.args.get('platform') |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
153 if platform_id: |
96 | 154 platform = TargetPlatform.fetch(self.env, |
155 int(platform_id)) | |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
156 self._render_platform_form(req, platform) |
98
1d9dc07acd3d
Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents:
96
diff
changeset
|
157 elif 'new' in req.args: |
96 | 158 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
|
159 self._render_platform_form(req, platform) |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
160 else: |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
161 self._render_config_form(req, config) |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
162 else: |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
163 self._render_config(req, config) |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
164 else: |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
165 if action == 'new': |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
166 self._render_config_form(req) |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
167 else: |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
168 self._render_overview(req) |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
169 |
164
a9cddfae3c09
Adapt to Trac [http://projects.edgewall.com/trac/changeset/2132 r2132].
cmlenz
parents:
163
diff
changeset
|
170 add_stylesheet(req, 'bitten/bitten.css') |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
171 return 'bitten_config.cs', None |
64 | 172 |
173 # Internal methods | |
174 | |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
175 def _do_create_config(self, req): |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
176 """Create a new build configuration.""" |
50
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
177 req.perm.assert_permission('BUILD_CREATE') |
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
178 |
98
1d9dc07acd3d
Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents:
96
diff
changeset
|
179 if 'cancel' in req.args: |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
180 req.redirect(self.env.href.build()) |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
181 |
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
|
182 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
|
183 |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
184 if BuildConfig.fetch(self.env, config_name): |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
185 raise TracError('A build configuration with the name "%s" already ' |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
186 'exists' % config_name, 'Duplicate 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
|
187 |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
188 config = BuildConfig(self.env) |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
189 self._process_config(req, config) |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
190 config.insert() |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
191 |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
192 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
|
193 |
195
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
194 def _do_delete_config(self, req, config_name): |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
195 """Save changes to a build configuration.""" |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
196 req.perm.assert_permission('BUILD_DELETE') |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
197 |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
198 if 'cancel' in req.args: |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
199 req.redirect(self.env.href.build(config_name)) |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
200 |
200
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
201 db = self.env.get_db_cnx() |
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
202 |
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
203 config = BuildConfig.fetch(self.env, config_name, db=db) |
195
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
204 assert config, 'Build configuration "%s" does not exist' % config_name |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
205 |
200
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
206 config.delete(db=db) |
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
207 |
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
208 db.commit() |
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
209 |
195
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
210 req.redirect(self.env.href.build()) |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
211 |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
212 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
|
213 """Save changes to a build configuration.""" |
50
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
214 req.perm.assert_permission('BUILD_MODIFY') |
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
215 |
98
1d9dc07acd3d
Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents:
96
diff
changeset
|
216 if 'cancel' in req.args: |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
217 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
|
218 |
96 | 219 config = BuildConfig.fetch(self.env, config_name) |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
220 if not config: |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
221 # FIXME: 404 |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
222 raise TracError('Build configuration "%s" does not exist' |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
223 % config_name, 'Object not found') |
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
|
224 |
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
|
225 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
|
226 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
|
227 |
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
|
228 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
|
229 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
|
230 |
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
|
231 else: |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
232 self._process_config(req, 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
|
233 |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
234 config.update() |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
235 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
|
236 |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
237 def _process_config(self, req, config): |
328
76a3f40d163e
Make sure that the name entered for a build configuration doesn't contain spaces or other URL-unfriendly characters.
cmlenz
parents:
321
diff
changeset
|
238 name = req.args.get('name') |
76a3f40d163e
Make sure that the name entered for a build configuration doesn't contain spaces or other URL-unfriendly characters.
cmlenz
parents:
321
diff
changeset
|
239 if not name: |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
240 raise TracError('Missing required field "name"', 'Missing field') |
328
76a3f40d163e
Make sure that the name entered for a build configuration doesn't contain spaces or other URL-unfriendly characters.
cmlenz
parents:
321
diff
changeset
|
241 if not re.match(r'^[\w.-]+$', name): |
76a3f40d163e
Make sure that the name entered for a build configuration doesn't contain spaces or other URL-unfriendly characters.
cmlenz
parents:
321
diff
changeset
|
242 raise TracError('The field "name" may only contain letters, ' |
76a3f40d163e
Make sure that the name entered for a build configuration doesn't contain spaces or other URL-unfriendly characters.
cmlenz
parents:
321
diff
changeset
|
243 'digits, periods, or dashes.', 'Invalid field') |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
244 |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
245 path = req.args.get('path', '') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
246 repos = self.env.get_repository(req.authname) |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
247 max_rev = req.args.get('max_rev') or None |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
248 try: |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
249 node = repos.get_node(path, max_rev) |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
250 assert node.isdir, '%s is not a directory' % node.path |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
251 except (AssertionError, TracError), e: |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
252 raise TracError(e, 'Invalid repository path') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
253 if req.args.get('min_rev'): |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
254 try: |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
255 repos.get_node(path, req.args.get('min_rev')) |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
256 except TracError, e: |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
257 raise TracError(e, 'Invalid value for oldest revision') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
258 |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
259 recipe_xml = req.args.get('recipe', '') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
260 if recipe_xml: |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
261 try: |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
262 Recipe(xmlio.parse(recipe_xml)).validate() |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
263 except xmlio.ParseError, e: |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
264 raise TracError('Failure parsing recipe: %s' % e, |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
265 'Invalid recipe') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
266 except InvalidRecipeError, e: |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
267 raise TracError(e, 'Invalid recipe') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
268 |
328
76a3f40d163e
Make sure that the name entered for a build configuration doesn't contain spaces or other URL-unfriendly characters.
cmlenz
parents:
321
diff
changeset
|
269 config.name = name |
247
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
270 config.path = repos.normalize_path(path) |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
271 config.recipe = recipe_xml |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
272 config.min_rev = req.args.get('min_rev') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
273 config.max_rev = req.args.get('max_rev') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
274 config.label = req.args.get('label', '') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
275 config.description = req.args.get('description', '') |
b28285d3ceec
Add validation for build configurations, and in particular for build recipes. Closes #48.
cmlenz
parents:
245
diff
changeset
|
276 |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
277 def _do_create_platform(self, req, config_name): |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
278 """Create a new target platform.""" |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
279 req.perm.assert_permission('BUILD_MODIFY') |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
280 |
98
1d9dc07acd3d
Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents:
96
diff
changeset
|
281 if 'cancel' in req.args: |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
282 req.redirect(self.env.href.build(config_name, action='edit')) |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
283 |
192
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
284 platform = TargetPlatform(self.env, config=config_name) |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
285 if self._process_platform(req, platform): |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
286 platform.insert() |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
287 req.redirect(self.env.href.build(config_name, action='edit')) |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
288 |
74
1d4fa4c32afa
Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents:
73
diff
changeset
|
289 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
|
290 """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
|
291 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
|
292 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
|
293 |
1d4fa4c32afa
Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents:
73
diff
changeset
|
294 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
|
295 for platform_id in [int(id) for id in req.args.get('delete_platform')]: |
96 | 296 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
|
297 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
|
298 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
|
299 platform.delete(db=db) |
200
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
300 |
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
301 # FIXME: this should probably also delete all builds done for this |
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
302 # platform, and all the associated reports |
692924ffed80
Changes to the BDB XML report store to support transactions. Closes #47.
cmlenz
parents:
198
diff
changeset
|
303 |
74
1d4fa4c32afa
Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents:
73
diff
changeset
|
304 db.commit() |
1d4fa4c32afa
Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents:
73
diff
changeset
|
305 |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
306 def _do_save_platform(self, req, config_name, platform_id): |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
307 """Save changes to a target platform.""" |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
308 req.perm.assert_permission('BUILD_MODIFY') |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
309 |
98
1d9dc07acd3d
Use {{{in req.args}}} instead of {{{in req.args.keys()}}}.
cmlenz
parents:
96
diff
changeset
|
310 if 'cancel' in req.args: |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
311 req.redirect(self.env.href.build(config_name, action='edit')) |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
312 |
96 | 313 platform = TargetPlatform.fetch(self.env, platform_id) |
192
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
314 if self._process_platform(req, platform): |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
315 platform.update() |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
316 req.redirect(self.env.href.build(config_name, action='edit')) |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
317 |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
318 def _process_platform(self, req, platform): |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
319 platform.name = req.args.get('name') |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
320 |
192
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
321 properties = [int(key[9:]) for key in req.args.keys() |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
322 if key.startswith('property_')] |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
323 properties.sort() |
192
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
324 patterns = [int(key[8:]) for key in req.args.keys() |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
325 if key.startswith('pattern_')] |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
326 patterns.sort() |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
327 platform.rules = [(req.args.get('property_%d' % property), |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
328 req.args.get('pattern_%d' % pattern)) |
192
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
329 for property, pattern in zip(properties, patterns) |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
330 if req.args.get('property_%d' % property)] |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
331 |
192
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
332 add_rules = [int(key[9:]) for key in req.args.keys() |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
333 if key.startswith('add_rule_')] |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
334 if add_rules: |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
335 platform.rules.insert(add_rules[0] + 1, ('', '')) |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
336 self._render_platform_form(req, platform) |
192
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
337 return False |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
338 rm_rules = [int(key[8:]) for key in req.args.keys() |
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
339 if key.startswith('rm_rule_')] |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
340 if rm_rules: |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
341 del platform.rules[rm_rules[0]] |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
342 self._render_platform_form(req, platform) |
192
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
343 return False |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
344 |
192
da2a2e9a8f71
Fix target platform management under mod_python. Closes #44.
cmlenz
parents:
184
diff
changeset
|
345 return True |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
346 |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
347 def _render_overview(self, req): |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
348 req.hdf['title'] = 'Build Status' |
209
d2b9c72e9643
Hide deactivated build configurations on the build status page by default, and provide an option panel to make them visible.
cmlenz
parents:
203
diff
changeset
|
349 show_all = False |
d2b9c72e9643
Hide deactivated build configurations on the build status page by default, and provide an option panel to make them visible.
cmlenz
parents:
203
diff
changeset
|
350 if req.args.get('show') == 'all': |
d2b9c72e9643
Hide deactivated build configurations on the build status page by default, and provide an option panel to make them visible.
cmlenz
parents:
203
diff
changeset
|
351 show_all = True |
d2b9c72e9643
Hide deactivated build configurations on the build status page by default, and provide an option panel to make them visible.
cmlenz
parents:
203
diff
changeset
|
352 req.hdf['config.show_all'] = show_all |
d2b9c72e9643
Hide deactivated build configurations on the build status page by default, and provide an option panel to make them visible.
cmlenz
parents:
203
diff
changeset
|
353 |
255
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
354 configs = BuildConfig.select(self.env, include_inactive=show_all) |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
355 for idx, config in enumerate(configs): |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
356 prefix = 'configs.%d' % idx |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
357 description = config.description |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
358 if description: |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
359 description = wiki_to_html(description, self.env, req) |
255
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
360 req.hdf[prefix] = { |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
361 'name': config.name, 'label': config.label or config.name, |
209
d2b9c72e9643
Hide deactivated build configurations on the build status page by default, and provide an option panel to make them visible.
cmlenz
parents:
203
diff
changeset
|
362 'active': config.active, 'path': config.path, |
d2b9c72e9643
Hide deactivated build configurations on the build status page by default, and provide an option panel to make them visible.
cmlenz
parents:
203
diff
changeset
|
363 'description': description, |
123 | 364 '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
|
365 } |
255
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
366 if not config.active: |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
367 continue |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
368 |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
369 repos = self.env.get_repository(req.authname) |
360
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
328
diff
changeset
|
370 if hasattr(repos, 'sync'): |
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
328
diff
changeset
|
371 repos.sync() |
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
328
diff
changeset
|
372 |
255
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
373 prev_rev = None |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
374 for platform, rev, build in collect_changes(repos, config): |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
375 if rev != prev_rev: |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
376 if prev_rev is None: |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
377 chgset = repos.get_changeset(rev) |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
378 req.hdf[prefix + '.youngest_rev'] = { |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
379 'id': rev, 'href': self.env.href.changeset(rev), |
320 | 380 'author': chgset.author or 'anonymous', |
255
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
381 'date': format_datetime(chgset.date), |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
382 'message': wiki_to_oneliner( |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
383 shorten_line(chgset.message), self.env) |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
384 } |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
385 else: |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
386 break |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
387 prev_rev = rev |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
388 if build: |
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
389 build_hdf = _build_to_hdf(self.env, req, build) |
320 | 390 build_hdf['platform'] = platform.name |
256
aa942e2c7243
A bit of polishing for [265]: also show build if not yet in the queue, some layout improvements.
cmlenz
parents:
255
diff
changeset
|
391 req.hdf[prefix + '.builds.%d' % platform.id] = build_hdf |
aa942e2c7243
A bit of polishing for [265]: also show build if not yet in the queue, some layout improvements.
cmlenz
parents:
255
diff
changeset
|
392 else: |
aa942e2c7243
A bit of polishing for [265]: also show build if not yet in the queue, some layout improvements.
cmlenz
parents:
255
diff
changeset
|
393 req.hdf[prefix + '.builds.%d' % platform.id] = { |
320 | 394 'platform': platform.name, 'status': 'pending' |
256
aa942e2c7243
A bit of polishing for [265]: also show build if not yet in the queue, some layout improvements.
cmlenz
parents:
255
diff
changeset
|
395 } |
255
42f555e1d648
Show the build status for the latest changeset for every build configuration on the main build status page. Closes #21.
cmlenz
parents:
250
diff
changeset
|
396 |
123 | 397 req.hdf['page.mode'] = 'overview' |
398 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
|
399 |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
400 def _render_config(self, req, config_name): |
250 | 401 db = self.env.get_db_cnx() |
402 | |
403 config = BuildConfig.fetch(self.env, config_name, db=db) | |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
404 req.hdf['title'] = 'Build Configuration "%s"' \ |
320 | 405 % config.label or config.name |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
406 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
|
407 description = config.description |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
408 if description: |
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
409 description = wiki_to_html(description, self.env, req) |
123 | 410 req.hdf['config'] = { |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
411 'name': config.name, 'label': config.label, 'path': config.path, |
250 | 412 'min_rev': config.min_rev, |
413 'min_rev_href': self.env.href.changeset(config.min_rev), | |
414 'max_rev': config.max_rev, | |
415 'max_rev_href': self.env.href.changeset(config.max_rev), | |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
416 'active': config.active, 'description': description, |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
417 'browser_href': self.env.href.browser(config.path), |
195
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
418 'can_modify': req.perm.has_permission('BUILD_MODIFY'), |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
419 'can_delete': req.perm.has_permission('BUILD_DELETE') |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
420 } |
123 | 421 req.hdf['page.mode'] = 'view_config' |
47
083e848088ee
* Improvements to the model classes, and a couple of unit tests.
cmlenz
parents:
45
diff
changeset
|
422 |
250 | 423 platforms = list(TargetPlatform.select(self.env, config=config_name, |
424 db=db)) | |
123 | 425 req.hdf['config.platforms'] = [ |
76
ffa1ffd8c7db
* Implement basic slave selection based on configured target platforms. Closes #15.
cmlenz
parents:
74
diff
changeset
|
426 {'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
|
427 ] |
74
1d4fa4c32afa
Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents:
73
diff
changeset
|
428 |
197
d72c0587fae9
* Don't schedule/display builds for revisions where the repository directory is empty. Fixes #46.
cmlenz
parents:
196
diff
changeset
|
429 has_reports = False |
250 | 430 for report in Report.select(self.env, config=config.name, db=db): |
197
d72c0587fae9
* Don't schedule/display builds for revisions where the repository directory is empty. Fixes #46.
cmlenz
parents:
196
diff
changeset
|
431 has_reports = True |
d72c0587fae9
* Don't schedule/display builds for revisions where the repository directory is empty. Fixes #46.
cmlenz
parents:
196
diff
changeset
|
432 break |
d72c0587fae9
* Don't schedule/display builds for revisions where the repository directory is empty. Fixes #46.
cmlenz
parents:
196
diff
changeset
|
433 |
d72c0587fae9
* Don't schedule/display builds for revisions where the repository directory is empty. Fixes #46.
cmlenz
parents:
196
diff
changeset
|
434 if has_reports: |
d72c0587fae9
* Don't schedule/display builds for revisions where the repository directory is empty. Fixes #46.
cmlenz
parents:
196
diff
changeset
|
435 req.hdf['config.charts'] = [ |
203
e6ddca1e5712
Huge refactoring to remove dependency on BDB XML. Report data is now stored in the Trac database (SQLite/PostgreSQL).
cmlenz
parents:
200
diff
changeset
|
436 {'href': self.env.href.build(config.name, 'chart/test')}, |
e6ddca1e5712
Huge refactoring to remove dependency on BDB XML. Report data is now stored in the Trac database (SQLite/PostgreSQL).
cmlenz
parents:
200
diff
changeset
|
437 {'href': self.env.href.build(config.name, 'chart/coverage')} |
197
d72c0587fae9
* Don't schedule/display builds for revisions where the repository directory is empty. Fixes #46.
cmlenz
parents:
196
diff
changeset
|
438 ] |
d72c0587fae9
* Don't schedule/display builds for revisions where the repository directory is empty. Fixes #46.
cmlenz
parents:
196
diff
changeset
|
439 charts_license = self.config.get('bitten', 'charts_license') |
d72c0587fae9
* Don't schedule/display builds for revisions where the repository directory is empty. Fixes #46.
cmlenz
parents:
196
diff
changeset
|
440 if charts_license: |
320 | 441 req.hdf['config.charts_license'] = charts_license |
178
fcbe107ca755
Add some basic charts to the build status page, based on [http://www.maani.us/xml_charts/index.php XML/SWF Charts]:
cmlenz
parents:
174
diff
changeset
|
442 |
214 | 443 page = max(1, int(req.args.get('page', 1))) |
444 more = False | |
445 req.hdf['page.number'] = page | |
446 | |
360
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
328
diff
changeset
|
447 repos = self.env.get_repository(req.authname) |
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
328
diff
changeset
|
448 if hasattr(repos, 'sync'): |
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
328
diff
changeset
|
449 repos.sync() |
5bc81e597352
Fix incompatibility with a change to the versioncontrol layer in Trac 0.10.3
cmlenz
parents:
328
diff
changeset
|
450 |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
451 builds_per_page = 12 * len(platforms) |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
452 idx = 0 |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
453 for platform, rev, build in collect_changes(repos, config): |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
454 if idx >= page * builds_per_page: |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
455 more = True |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
456 break |
232
b6e4896dc026
Fix regression introduced in [239]: first build was being skipped on build configuration page.
cmlenz
parents:
230
diff
changeset
|
457 elif idx >= (page - 1) * builds_per_page: |
230 | 458 prefix = 'config.builds.%d' % rev |
459 req.hdf[prefix + '.href'] = self.env.href.changeset(rev) | |
460 if build and build.status != Build.PENDING: | |
461 build_hdf = _build_to_hdf(self.env, req, build) | |
462 req.hdf['%s.%s' % (prefix, platform.id)] = build_hdf | |
250 | 463 for step in BuildStep.select(self.env, build=build.id, |
464 db=db): | |
465 req.hdf['%s.%s.steps.%s' % (prefix, platform.id, | |
466 step.name)] = { | |
320 | 467 'description': step.description, |
250 | 468 'duration': datetime.fromtimestamp(step.stopped) - \ |
469 datetime.fromtimestamp(step.started), | |
470 'failed': not step.successful, | |
471 'errors': step.errors, | |
472 'href': build_hdf['href'] + '#step_' + step.name, | |
473 } | |
230 | 474 idx += 1 |
214 | 475 |
228
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
476 if page > 1: |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
477 if page == 2: |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
478 prev_href = self.env.href.build(config.name) |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
479 else: |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
480 prev_href = self.env.href.build(config.name, page=page - 1) |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
481 add_link(req, 'prev', prev_href, 'Previous Page') |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
482 if more: |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
483 next_href = self.env.href.build(config.name, page=page + 1) |
a8c9dd7e3f71
* Cleanup and documentation for the `BuildQueue` class added in [236].
cmlenz
parents:
219
diff
changeset
|
484 add_link(req, 'next', next_href, 'Next Page') |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
485 |
195
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
486 def _render_config_confirm(self, req, config_name): |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
487 req.perm.assert_permission('BUILD_DELETE') |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
488 config = BuildConfig.fetch(self.env, config_name) |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
489 req.hdf['title'] = 'Delete Build Configuration "%s"' \ |
320 | 490 % config.label or config.name |
195
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
491 req.hdf['config'] = {'name': config.name} |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
492 req.hdf['page.mode'] = 'delete_config' |
bd6234ed6ac5
Allow deletion of build configurations from the web interface. Closes #27.
cmlenz
parents:
192
diff
changeset
|
493 |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
494 def _render_config_form(self, req, config_name=None): |
96 | 495 config = BuildConfig.fetch(self.env, config_name) |
496 if config: | |
50
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
497 req.perm.assert_permission('BUILD_MODIFY') |
123 | 498 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
|
499 '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
|
500 '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
|
501 '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
|
502 '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
|
503 'description': config.description |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
504 } |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
505 |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
506 req.hdf['title'] = 'Edit Build Configuration "%s"' \ |
320 | 507 % config.label or config.name |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
508 for idx, platform in enumerate(TargetPlatform.select(self.env, |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
509 config_name)): |
123 | 510 req.hdf['config.platforms.%d' % idx] = { |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
511 'id': platform.id, 'name': platform.name, |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
512 'href': self.env.href.build(config_name, action='edit', |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
513 platform=platform.id) |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
514 } |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
515 else: |
50
0d5ad32948b7
Restrict access to web interface with custom permission actions.
cmlenz
parents:
47
diff
changeset
|
516 req.perm.assert_permission('BUILD_CREATE') |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
517 req.hdf['title'] = 'Create Build Configuration' |
123 | 518 req.hdf['page.mode'] = 'edit_config' |
41
16b30ffc5fb9
Add web interface for viewing and managing build configurations. Closes #9.
cmlenz
parents:
35
diff
changeset
|
519 |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
520 def _render_platform_form(self, req, platform): |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
521 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
|
522 if platform.exists: |
320 | 523 req.hdf['title'] = 'Edit Target Platform "%s"' % platform.name |
74
1d4fa4c32afa
Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents:
73
diff
changeset
|
524 else: |
1d4fa4c32afa
Add template and static resources, hooked up using the new {{{ITemplateProvider}}} extension point in Trac.
cmlenz
parents:
73
diff
changeset
|
525 req.hdf['title'] = 'Add Target Platform' |
123 | 526 req.hdf['platform'] = { |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
527 'name': platform.name, 'id': platform.id, 'exists': platform.exists, |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
528 '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
|
529 for propname, pattern in platform.rules] or [('', '')] |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
530 } |
123 | 531 req.hdf['page.mode'] = 'edit_platform' |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
532 |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
533 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
534 class BuildController(Component): |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
535 """Renders the build page.""" |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
536 implements(INavigationContributor, IRequestHandler, ITimelineEventProvider) |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
537 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
538 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
|
539 report_summarizers = ExtensionPoint(IReportSummarizer) |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
540 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
541 # INavigationContributor methods |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
542 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
543 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
|
544 return 'build' |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
545 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
546 def get_navigation_items(self, req): |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
547 return [] |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
548 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
549 # IRequestHandler methods |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
550 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
551 def match_request(self, req): |
174
79c61c26a4e1
* Changed the `IReportStore` interface to allow querying with [http://www.w3.org/XML/Query/ XQuery]. This should make it possible to efficiently query the report store for any existing metrics.
cmlenz
parents:
168
diff
changeset
|
552 match = re.match(r'/build/([\w.-]+)/(\d+)', req.path_info) |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
553 if match: |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
554 if match.group(1): |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
555 req.args['config'] = match.group(1) |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
556 if match.group(2): |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
557 req.args['id'] = match.group(2) |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
558 return True |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
559 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
560 def process_request(self, req): |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
561 req.perm.assert_permission('BUILD_VIEW') |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
562 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
563 db = self.env.get_db_cnx() |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
564 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
|
565 build = Build.fetch(self.env, build_id, db=db) |
96 | 566 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
|
567 |
184
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
568 if req.method == 'POST': |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
569 if req.args.get('action') == 'invalidate': |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
570 self._do_invalidate(req, build, db) |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
571 req.redirect(self.env.href.build(build.config, build.id)) |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
572 |
73
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
573 add_link(req, 'up', self.env.href.build(build.config), |
6d7753ea1798
Implemented basic management of target platforms. Closes #14.
cmlenz
parents:
69
diff
changeset
|
574 'Build Configuration') |
91 | 575 status2title = {Build.SUCCESS: 'Success', Build.FAILURE: 'Failure', |
576 Build.IN_PROGRESS: 'In Progress'} | |
69 | 577 req.hdf['title'] = 'Build %s - %s' % (build_id, |
578 status2title[build.status]) | |
123 | 579 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
|
580 config = BuildConfig.fetch(self.env, build.config, db=db) |
69 | 581 req.hdf['build.config'] = { |
582 'name': config.label, | |
583 'href': self.env.href.build(config.name) | |
584 } | |
585 | |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
586 formatters = [] |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
587 for formatter in self.log_formatters: |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
588 formatters.append(formatter.get_formatter(req, build)) |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
589 |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
590 summarizers = {} # keyed by report type |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
591 for summarizer in self.report_summarizers: |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
592 categories = summarizer.get_supported_categories() |
361
109800464463
`dict.update` can take a sequence of key/value pairs, so remove redundant building of another dict
mgood
parents:
360
diff
changeset
|
593 summarizers.update([(cat, summarizer) for cat in categories]) |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
594 |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
595 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
|
596 steps = [] |
112
a38eabd4b6e1
* Store build logs in a structured way, for example to highlight messages on the error stream.
cmlenz
parents:
111
diff
changeset
|
597 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
|
598 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
|
599 'name': step.name, 'description': step.description, |
123 | 600 '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
|
601 'failed': step.status == BuildStep.FAILURE, |
245
a22ec8fce6c9
Store the reason(s) for build step failure in the database.
cmlenz
parents:
232
diff
changeset
|
602 'errors': step.errors, |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
603 'log': self._render_log(req, build, formatters, step), |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
604 'reports': self._render_reports(req, config, build, summarizers, |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
605 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
|
606 }) |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
607 req.hdf['build.steps'] = steps |
184
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
608 req.hdf['build.can_delete'] = req.perm.has_permission('BUILD_DELETE') |
120
b63ed684c29c
Show the list of reports generated on the build page.
cmlenz
parents:
114
diff
changeset
|
609 |
250 | 610 repos = self.env.get_repository(req.authname) |
611 chgset = repos.get_changeset(build.rev) | |
612 req.hdf['build.chgset_author'] = chgset.author | |
613 | |
164
a9cddfae3c09
Adapt to Trac [http://projects.edgewall.com/trac/changeset/2132 r2132].
cmlenz
parents:
163
diff
changeset
|
614 add_stylesheet(req, 'bitten/bitten.css') |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
615 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
|
616 |
141
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
617 # ITimelineEventProvider methods |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
618 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
619 def get_timeline_filters(self, req): |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
620 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
|
621 yield ('build', 'Builds') |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
622 |
0e21778c04ef
Refactoring: split up the components and templates that render the web interface.
cmlenz
parents:
139
diff
changeset
|
623 def get_timeline_events(self, req, start, stop, filters): |
311 | 624 if 'build' not in filters: |
625 return | |
250 | 626 |
311 | 627 add_stylesheet(req, 'bitten/bitten.css') |
628 | |
629 db = self.env.get_db_cnx() | |
630 cursor = db.cursor() | |
631 cursor.execute("SELECT b.id,b.config,c.label,b.rev,p.name," | |
632 "b.stopped,b.status FROM bitten_build AS b" | |
633 " INNER JOIN bitten_config AS c ON (c.name=b.config) " | |
634 " INNER JOIN bitten_platform AS p ON (p.id=b.platform) " | |
635 "WHERE b.stopped>=%s AND b.stopped<=%s " | |
636 "AND b.status IN (%s, %s) ORDER BY b.stopped", | |
637 (start, stop, Build.SUCCESS, Build.FAILURE)) | |
638 | |
639 event_kinds = {Build.SUCCESS: 'successbuild', | |
640 Build.FAILURE: 'failedbuild'} | |
641 for id, config, label, rev, platform, stopped, status in cursor: | |
642 | |
643 errors = [] | |
644 if status == Build.FAILURE: | |
645 for step in BuildStep.select(self.env, build=id, | |
646 status=BuildStep.FAILURE, | |
647 db=db): | |
320 | 648 errors += [(step.name, error) for error |
311 | 649 in step.errors] |
650 | |
320 | 651 title = Markup('Build of <em>%s [%s]</em> on %s %s', label, rev, |
652 platform, _status_label[status]) | |
311 | 653 message = '' |
654 if req.args.get('format') == 'rss': | |
655 href = self.env.abs_href.build(config, id) | |
656 if errors: | |
657 buf = StringIO() | |
658 prev_step = None | |
659 for step, error in errors: | |
660 if step != prev_step: | |
661 if prev_step is not None: | |
662 buf.write('</ul>') | |
321 | 663 buf.write('<p>Step %s failed:</p><ul>' \ |
664 % escape(step)) | |
311 | 665 prev_step = step |
321 | 666 buf.write('<li>%s</li>' % escape(error)) |
311 | 667 buf.write('</ul>') |
320 | 668 message = Markup(buf.getvalue()) |
311 | 669 else: |
670 href = self.env.href.build(config, id) | |
671 if errors: | |
672 steps = [] | |
673 for step, error in errors: | |
674 if step not in steps: | |
675 steps.append(step) | |
320 | 676 steps = [Markup('<em>%s</em>', step) for step in steps] |
311 | 677 if len(steps) < 2: |
678 message = steps[0] | |
679 elif len(steps) == 2: | |
320 | 680 message = Markup(' and ').join(steps) |
311 | 681 elif len(steps) > 2: |
320 | 682 message = Markup(', ').join(steps[:-1]) + ', and ' + \ |
311 | 683 steps[-1] |
320 | 684 message = Markup('Step%s %s failed', |
685 len(steps) != 1 and 's' or '', message) | |
311 | 686 yield event_kinds[status], href, title, stopped, None, message |
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
|
687 |
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
|
688 # 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
|
689 |
184
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
690 def _do_invalidate(self, req, build, db): |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
691 self.log.info('Invalidating build %d', build.id) |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
692 |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
693 for step in BuildStep.select(self.env, build=build.id, db=db): |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
694 step.delete(db=db) |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
695 |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
696 build.slave = None |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
697 build.started = build.stopped = 0 |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
698 build.status = Build.PENDING |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
699 build.slave_info = {} |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
700 build.update() |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
701 |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
702 db.commit() |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
703 |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
704 req.redirect(self.env.href.build(build.config)) |
fbf949f4c706
Allow invalidation of builds from the web interface. This results in the build being reset to ''PENDING'' status, and all build logs, slave information and reports deleted. Basically initiates a rebuild for a specific revision and target platform.
cmlenz
parents:
182
diff
changeset
|
705 |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
706 def _render_log(self, req, build, formatters, step): |
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
|
707 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
|
708 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
|
709 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
|
710 for format in formatters: |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
711 message = format(step, log.generator, level, message) |
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
|
712 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
|
713 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
|
714 |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
715 def _render_reports(self, req, config, build, summarizers, step): |
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
|
716 reports = [] |
203
e6ddca1e5712
Huge refactoring to remove dependency on BDB XML. Report data is now stored in the Trac database (SQLite/PostgreSQL).
cmlenz
parents:
200
diff
changeset
|
717 for report in Report.select(self.env, build=build.id, step=step.name): |
e6ddca1e5712
Huge refactoring to remove dependency on BDB XML. Report data is now stored in the Trac database (SQLite/PostgreSQL).
cmlenz
parents:
200
diff
changeset
|
718 summarizer = summarizers.get(report.category) |
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
|
719 if summarizer: |
213
25f84dd9f159
* Refactoring of build recipes, the file format has changed slightly:
cmlenz
parents:
209
diff
changeset
|
720 summary = summarizer.render_summary(req, config, build, step, |
203
e6ddca1e5712
Huge refactoring to remove dependency on BDB XML. Report data is now stored in the Trac database (SQLite/PostgreSQL).
cmlenz
parents:
200
diff
changeset
|
721 report.category) |
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
|
722 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
|
723 summary = None |
320 | 724 reports.append({'category': report.category, |
725 'summary': Markup(summary)}) | |
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
|
726 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
|
727 |
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
|
728 |
ecc062d4fd55
Paths to files and directories in the build log output are rendered as links to the repository browser.
cmlenz
parents:
112
diff
changeset
|
729 class SourceFileLinkFormatter(Component): |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
730 """Detects references to files in the build log and renders them as links |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
731 to the repository browser.""" |
203
e6ddca1e5712
Huge refactoring to remove dependency on BDB XML. Report data is now stored in the Trac database (SQLite/PostgreSQL).
cmlenz
parents:
200
diff
changeset
|
732 |
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
|
733 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
|
734 |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
735 _fileref_re = re.compile('(?P<path>[\w.-]+(?:/[\w.-]+)+)(?P<line>(:\d+))') |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
736 |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
737 def get_formatter(self, req, build): |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
738 """Return the log message formatter function.""" |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
739 config = BuildConfig.fetch(self.env, name=build.config) |
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
|
740 repos = self.env.get_repository(req.authname) |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
741 href = self.env.href.browser |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
742 cache = {} |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
743 def _replace(m): |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
744 filepath = posixpath.normpath(m.group('path').replace('\\', '/')) |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
745 if not cache.get(filepath) is True: |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
746 parts = filepath.split('/') |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
747 path = '' |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
748 for part in parts: |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
749 path = posixpath.join(path, part) |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
750 if not path in cache: |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
751 try: |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
752 repos.get_node(posixpath.join(config.path, path), |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
753 build.rev) |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
754 cache[path] = True |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
755 except TracError: |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
756 cache[path] = False |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
757 if cache[path] is False: |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
758 return m.group(0) |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
759 return '<a href="%s">%s</a>' % ( |
263 | 760 href(config.path, filepath) + '#L' + m.group('line')[1:], |
258
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
761 m.group(0)) |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
762 def _formatter(step, type, level, message): |
77cdef044d48
* Improve build log formatter performance: now only matches strings using the `path:line` format, and checks the existance of files in the repository when they are encountered. Should fix (or at least improve) #54.
cmlenz
parents:
256
diff
changeset
|
763 return self._fileref_re.sub(_replace, message) |
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
|
764 return _formatter |