1*f8a1b7d9SAlexander Kabaev#!/usr/bin/python
2*f8a1b7d9SAlexander Kabaev
3*f8a1b7d9SAlexander Kabaevimport sys
4*f8a1b7d9SAlexander Kabaevimport commands
5*f8a1b7d9SAlexander Kabaevimport re
6*f8a1b7d9SAlexander Kabaevfrom xml.dom import minidom
7*f8a1b7d9SAlexander Kabaevfrom BeautifulSoup import BeautifulSoup
8*f8a1b7d9SAlexander Kabaevimport make_graph
9*f8a1b7d9SAlexander Kabaev
10*f8a1b7d9SAlexander Kabaevclass exception:
11*f8a1b7d9SAlexander Kabaev	pass
12*f8a1b7d9SAlexander Kabaev
13*f8a1b7d9SAlexander Kabaevres_div_re = re.compile('(.*?)_res_div')
14*f8a1b7d9SAlexander Kabaevsettings_div_re = re.compile('(.*?)_settings_div')
15*f8a1b7d9SAlexander Kabaev
16*f8a1b7d9SAlexander Kabaev
17*f8a1b7d9SAlexander Kabaevgray_border_div_str = '<div style = "border-style: dotted; border-width: 1px; border-color: lightgray">'
18*f8a1b7d9SAlexander Kabaevspace_div_str = '<div style = "width: 100%; height: 20px">'
19*f8a1b7d9SAlexander Kabaev
20*f8a1b7d9SAlexander Kabaev
21*f8a1b7d9SAlexander Kabaev
22*f8a1b7d9SAlexander Kabaevdef logical_build_from_build(build):
23*f8a1b7d9SAlexander Kabaev	if build == 'gcc':
24*f8a1b7d9SAlexander Kabaev		return 'g++'
25*f8a1b7d9SAlexander Kabaev	if build == 'msvc':
26*f8a1b7d9SAlexander Kabaev		return 'msvc++'
27*f8a1b7d9SAlexander Kabaev	if build == 'local':
28*f8a1b7d9SAlexander Kabaev		return 'local'
29*f8a1b7d9SAlexander Kabaev	sys.stderr.write(build)
30*f8a1b7d9SAlexander Kabaev	raise exception
31*f8a1b7d9SAlexander Kabaev
32*f8a1b7d9SAlexander Kabaev
33*f8a1b7d9SAlexander Kabaevdef img_title_from_origs(label, title, base_build_ref, build_name, logical_build_name):
34*f8a1b7d9SAlexander Kabaev	title = title.replace('_tt_', '<tt>')
35*f8a1b7d9SAlexander Kabaev	title = title.replace('_455tt_', '</tt>')
36*f8a1b7d9SAlexander Kabaev	title = title.replace('_b_', '<b>')
37*f8a1b7d9SAlexander Kabaev	title = title.replace('_455b_', '</b>')
38*f8a1b7d9SAlexander Kabaev	title = title.replace('_456', ',')
39*f8a1b7d9SAlexander Kabaev	title = title.replace('_457', '[]')
40*f8a1b7d9SAlexander Kabaev	title = title.replace('_', ' ')
41*f8a1b7d9SAlexander Kabaev	return '%s: %s - <a href = "%s_performance_tests.html#%s">%s</a>' % (
42*f8a1b7d9SAlexander Kabaev		label,
43*f8a1b7d9SAlexander Kabaev		title,
44*f8a1b7d9SAlexander Kabaev		base_build_ref,
45*f8a1b7d9SAlexander Kabaev		build_name,
46*f8a1b7d9SAlexander Kabaev		logical_build_name)
47*f8a1b7d9SAlexander Kabaev
48*f8a1b7d9SAlexander Kabaev
49*f8a1b7d9SAlexander Kabaevdef make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name):
50*f8a1b7d9SAlexander Kabaev	cmd_str = '%s/scripts/make_graph.py %s %s %s %s %s' % (
51*f8a1b7d9SAlexander Kabaev		src_dir, doc_dir,
52*f8a1b7d9SAlexander Kabaev		res_dir,
53*f8a1b7d9SAlexander Kabaev		tests_info_xml_f_name,
54*f8a1b7d9SAlexander Kabaev		test_name,
55*f8a1b7d9SAlexander Kabaev		build_name)
56*f8a1b7d9SAlexander Kabaev	# Must start a new process for pychart - otherwise pngs overlap.
57*f8a1b7d9SAlexander Kabaev	so = commands.getstatusoutput(cmd_str)
58*f8a1b7d9SAlexander Kabaev	if(so[0] != 0):
59*f8a1b7d9SAlexander Kabaev		sys.stderr.write(cmd_str + '\n')
60*f8a1b7d9SAlexander Kabaev		sys.stderr.write(so[1] + '\n')
61*f8a1b7d9SAlexander Kabaev		sys.exit(-1)
62*f8a1b7d9SAlexander Kabaev
63*f8a1b7d9SAlexander Kabaev
64*f8a1b7d9SAlexander Kabaevdef make_png_str(label, test_name, build):
65*f8a1b7d9SAlexander Kabaev	ret = '<h6 class="c1">'
66*f8a1b7d9SAlexander Kabaev	ret += '<a name="%s" id= "%s">' % (label, label)
67*f8a1b7d9SAlexander Kabaev	ret += '<img src="%s" ' % (test_name + '_' + build + '.png')
68*f8a1b7d9SAlexander Kabaev	ret += 'alt="no image" />'
69*f8a1b7d9SAlexander Kabaev	ret += '</a></h6>'
70*f8a1b7d9SAlexander Kabaev	return ret
71*f8a1b7d9SAlexander Kabaev
72*f8a1b7d9SAlexander Kabaevdef process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name):
73*f8a1b7d9SAlexander Kabaev	doc_dir = src_dir + "/docs/html/ext/pb_ds"
74*f8a1b7d9SAlexander Kabaev	res_dir = build_dir
75*f8a1b7d9SAlexander Kabaev	html_f = open(doc_dir + '/' + html_f_name)
76*f8a1b7d9SAlexander Kabaev	soup = BeautifulSoup(html_f.read())
77*f8a1b7d9SAlexander Kabaev	html_f.close()
78*f8a1b7d9SAlexander Kabaev	platform_comp_re = re.compile('platform_comp_%s' % build_name)
79*f8a1b7d9SAlexander Kabaev	for d in soup('div'):
80*f8a1b7d9SAlexander Kabaev		try:
81*f8a1b7d9SAlexander Kabaev			settings_m = settings_div_re.match(d['id'])
82*f8a1b7d9SAlexander Kabaev			res_m = res_div_re.match(d['id'])
83*f8a1b7d9SAlexander Kabaev		except:
84*f8a1b7d9SAlexander Kabaev			settings_m = None
85*f8a1b7d9SAlexander Kabaev			res_m = None
86*f8a1b7d9SAlexander Kabaev
87*f8a1b7d9SAlexander Kabaev		if settings_m:
88*f8a1b7d9SAlexander Kabaev			build = settings_m.groups()[0]
89*f8a1b7d9SAlexander Kabaev			if build == build_name:
90*f8a1b7d9SAlexander Kabaev				logical_build_name = logical_build_from_build(build)
91*f8a1b7d9SAlexander Kabaev				info = gray_border_div_str
92*f8a1b7d9SAlexander Kabaev				info += '<h3><a name = "%s"><u>%s</u></a></h3>' % (build, logical_build_name)
93*f8a1b7d9SAlexander Kabaev				info += make_graph.comp_platform_info(compiler_name)
94*f8a1b7d9SAlexander Kabaev				info += '</div>%s</div>' % space_div_str
95*f8a1b7d9SAlexander Kabaev				d.contents = info
96*f8a1b7d9SAlexander Kabaev		elif res_m:
97*f8a1b7d9SAlexander Kabaev			label = res_m.groups()[0]
98*f8a1b7d9SAlexander Kabaev			d = d.divTag
99*f8a1b7d9SAlexander Kabaev
100*f8a1b7d9SAlexander Kabaev			build = d['id'].replace('%s_' % label, '')
101*f8a1b7d9SAlexander Kabaev
102*f8a1b7d9SAlexander Kabaev			if build == build_name:
103*f8a1b7d9SAlexander Kabaev				logical_build_name = logical_build_from_build(build)
104*f8a1b7d9SAlexander Kabaev				d = d.divTag
105*f8a1b7d9SAlexander Kabaev				test_name = d['id'].replace('%s_' % label, '')
106*f8a1b7d9SAlexander Kabaev				d = d.divTag
107*f8a1b7d9SAlexander Kabaev				base_build_ref = d['id'].replace('%s_' % label, '')
108*f8a1b7d9SAlexander Kabaev				d = d.divTag
109*f8a1b7d9SAlexander Kabaev				title = d['id'].replace('%s_' % label, '')
110*f8a1b7d9SAlexander Kabaev				img_title = img_title_from_origs(label, title, base_build_ref, build, logical_build_name)
111*f8a1b7d9SAlexander Kabaev
112*f8a1b7d9SAlexander Kabaev				make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name)
113*f8a1b7d9SAlexander Kabaev				png_str = make_png_str(label, test_name, build)
114*f8a1b7d9SAlexander Kabaev				content = gray_border_div_str
115*f8a1b7d9SAlexander Kabaev				content += png_str
116*f8a1b7d9SAlexander Kabaev				content += img_title
117*f8a1b7d9SAlexander Kabaev#				content += make_graph.legend(doc_dir, res_dir, tests_info_xml_f_name, test_name, build_name)
118*f8a1b7d9SAlexander Kabaev				content += '</div>%s</div>' % space_div_str
119*f8a1b7d9SAlexander Kabaev				d.contents = content
120*f8a1b7d9SAlexander Kabaev
121*f8a1b7d9SAlexander Kabaev	return soup
122*f8a1b7d9SAlexander Kabaev
123*f8a1b7d9SAlexander Kabaev
124*f8a1b7d9SAlexander Kabaev
125*f8a1b7d9SAlexander Kabaevif __name__ == "__main__":
126*f8a1b7d9SAlexander Kabaev	"""
127*f8a1b7d9SAlexander Kabaev	Doc dir
128*f8a1b7d9SAlexander Kabaev	This module takes 6 parameters from the command line:
129*f8a1b7d9SAlexander Kabaev	Source directory
130*f8a1b7d9SAlexander Kabaev	Build directory
131*f8a1b7d9SAlexander Kabaev	HTMLs XML file name
132*f8a1b7d9SAlexander Kabaev	Tests info XML file name
133*f8a1b7d9SAlexander Kabaev	Build name
134*f8a1b7d9SAlexander Kabaev	Compiler name
135*f8a1b7d9SAlexander Kabaev	"""
136*f8a1b7d9SAlexander Kabaev
137*f8a1b7d9SAlexander Kabaev	usg = "make_graph.py <src_dir> <build_dir> <htmls_xml_f_name> <tests_info_xml_f_name> <build_name> <compiler_name>\n"
138*f8a1b7d9SAlexander Kabaev
139*f8a1b7d9SAlexander Kabaev	if len(sys.argv) != 7:
140*f8a1b7d9SAlexander Kabaev		sys.stderr.write(usg)
141*f8a1b7d9SAlexander Kabaev		raise exception
142*f8a1b7d9SAlexander Kabaev
143*f8a1b7d9SAlexander Kabaev	src_dir = sys.argv[1]
144*f8a1b7d9SAlexander Kabaev	build_dir = sys.argv[2]
145*f8a1b7d9SAlexander Kabaev	htmls_xml_f_name = sys.argv[3]
146*f8a1b7d9SAlexander Kabaev	tests_info_xml_f_name = sys.argv[4]
147*f8a1b7d9SAlexander Kabaev	build_name = sys.argv[5]
148*f8a1b7d9SAlexander Kabaev	compiler_name = sys.argv[6]
149*f8a1b7d9SAlexander Kabaev	doc_dir = src_dir + "/docs/html/ext/pb_ds"
150*f8a1b7d9SAlexander Kabaev	htmls_dat = minidom.parse(htmls_xml_f_name)
151*f8a1b7d9SAlexander Kabaev	for html in htmls_dat.getElementsByTagName('html'):
152*f8a1b7d9SAlexander Kabaev		html_f_name = html.attributes['name'].value
153*f8a1b7d9SAlexander Kabaev
154*f8a1b7d9SAlexander Kabaev		new_soup = process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name)
155*f8a1b7d9SAlexander Kabaev
156*f8a1b7d9SAlexander Kabaev		html_f = open(doc_dir + '/' + html_f_name, 'w')
157*f8a1b7d9SAlexander Kabaev		html_f.write(str(new_soup))
158*f8a1b7d9SAlexander Kabaev		html_f.close()
159*f8a1b7d9SAlexander Kabaev
160*f8a1b7d9SAlexander Kabaev
161