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