summaryrefslogtreecommitdiff
blob: 2403cdf1deb272a51321d09ddd0360b5ac65db4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import re, StringIO

class PortageProcessor:
	_r = {
		'warnings' : re.compile(r"(Tinderbox QA Warning!|QA Notice: (Pre-stripped|file does not exist|command not found|USE flag|Files built without respecting|The following files)|linux_config_exists|will always overflow|called with bigger|maintainer mode detected|econf called in src_compile|udev rules should be installed)"),
		'testfailed' : re.compile(r"^ \* ERROR: .* failed \(test phase\):"),
		'failed' : re.compile(r"^ \* ERROR: .* failed"),
		'collision' : re.compile(r"Detected file collision"),
		'maintainer' : re.compile(r"^ \* Maintainer: ([a-zA-Z0-9.@_+-]+)(?: ([a-zA-Z0-9.@_+,-]+))?$"),
		'escapes' : re.compile(r"\x1b\[[^\x40-\x7e]*[\x40-\x7e]")
	}

	def __init__(self, db, storage):
		self.db = db
		self.storage = storage

	def process(self, request, source):
		for f in request.files:
			matches = 0
			pkg_failed = False
			test_failed = False
			collision = False
			bug_assignee = 'bug-wranglers@gentoo.org'
			bug_cc = ''

			# TODO: look at proper HTML generation methods:
			# (*) either XHTML via xml.etree
			# (*) or Jinja2 (is it possible to parse and generate in one pass?)
			output = StringIO.StringIO()
			output.write('''\
<!doctype html>
<html>
	<head>
		<link rel="stylesheet" type="text/css" href="htmlgrep.css">
	</head>
	<body>
		<ol>
''')

			for line in f.data.split("\n"):
				match = False

				line = self._r['escapes'].sub('', line)

				if self._r['warnings'].search(line):
					match = True
				elif self._r['testfailed'].search(line):
					test_failed = True
					match = True
				elif self._r['failed'].search(line):
					pkg_failed = True
					match = True
				elif self._r['collision'].search(line):
					pkg_failed = True
					collision = True
					match = True
				else:
					m = self._r['maintainer'].search(line)
					if m:
						bug_assignee, bug_cc = m.group(1, 2)

				if match:
					matches += 1
					output.write('\t'*3 + '<li class="match">' + line + '</li>\n')
				else:
					output.write('\t'*3 + '<li>' + line + '</li>\n')

			output.write('''\
		</ol>
	</body>
</html>
''')

			self.storage.save_file(source, f.filename, output.getvalue())