# HG changeset patch # User cmlenz # Date 1123405396 0 # Node ID ecc062d4fd554c84d3ef2db893652d7001526574 # Parent 142d95b9e8b0de2f094101d945d80850ab99b548 Paths to files and directories in the build log output are rendered as links to the repository browser. diff --git a/bitten/trac_ext/templates/build.cs b/bitten/trac_ext/templates/build.cs --- a/bitten/trac_ext/templates/build.cs +++ b/bitten/trac_ext/templates/build.cs @@ -99,7 +99,9 @@ if:len(rev[platform.id]) ?>
( )
started agotook 4: break except TracError, e: @@ -384,7 +398,7 @@ Build.IN_PROGRESS: 'In Progress'} req.hdf['title'] = 'Build %s - %s' % (build_id, status2title[build.status]) - req.hdf['build'] = self._build_to_hdf(build, include_output=True) + req.hdf['build'] = self._build_to_hdf(req, build, include_output=True) req.hdf['build.mode'] = 'view_build' config = BuildConfig.fetch(self.env, build.config) @@ -393,7 +407,7 @@ 'href': self.env.href.build(config.name) } - def _build_to_hdf(self, build, include_output=False): + def _build_to_hdf(self, req, build, include_output=False): hdf = {'id': build.id, 'name': build.slave, 'rev': build.rev, 'status': self._status_label[build.status], 'cls': self._status_label[build.status].replace(' ', '-'), @@ -425,9 +439,48 @@ if include_output: for log in BuildLog.select(self.env, build=build.id, step=step.name, db=db): - steps[-1]['log'] = [{'level': level, - 'message': message} - for level, message in log.messages] + formatters = [] + items = [] + for formatter in self.log_formatters: + formatters.append(formatter.get_formatter(req, build, + step, + log.type)) + for level, message in log.messages: + for format in formatters: + message = format(level, message) + items.append({'level': level, 'message': message}) + steps[-1]['log'] = items hdf['steps'] = steps return hdf + + +class SourceFileLinkFormatter(Component): + """Finds references to files and directories in the repository in the build + log and renders them as links to the repository browser.""" + + implements(ILogFormatter) + + def get_formatter(self, req, build, step, type): + config = BuildConfig.fetch(self.env, build.config) + repos = self.env.get_repository(req.authname) + nodes = [] + def _walk(node): + for child in node.get_entries(): + path = child.path[len(config.path) + 1:] + pattern = re.compile("([\s'\"])(%s)([\s'\"])" % re.escape(path)) + nodes.append((child.path, pattern)) + if child.isdir: + _walk(child) + _walk(repos.get_node(config.path, build.rev)) + nodes.sort(lambda x, y: -cmp(len(x[0]), len(y[0]))) + + def _formatter(level, message): + for path, pattern in nodes: + def _replace(m): + return '%s%s%s' % (m.group(1), + self.env.href.browser(path, rev=build.rev), + m.group(2), m.group(3)) + message = pattern.sub(_replace, message) + return message + return _formatter