# 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
|