1169691Skan#!/usr/bin/python 2169691Skan 3169691Skanimport sys 4169691Skanimport commands 5169691Skanimport re 6169691Skanfrom xml.dom import minidom 7169691Skanfrom BeautifulSoup import BeautifulSoup 8169691Skanimport make_graph 9169691Skan 10169691Skanclass exception: 11169691Skan pass 12169691Skan 13169691Skanres_div_re = re.compile('(.*?)_res_div') 14169691Skansettings_div_re = re.compile('(.*?)_settings_div') 15169691Skan 16169691Skan 17169691Skangray_border_div_str = '<div style = "border-style: dotted; border-width: 1px; border-color: lightgray">' 18169691Skanspace_div_str = '<div style = "width: 100%; height: 20px">' 19169691Skan 20169691Skan 21169691Skan 22169691Skandef logical_build_from_build(build): 23169691Skan if build == 'gcc': 24169691Skan return 'g++' 25169691Skan if build == 'msvc': 26169691Skan return 'msvc++' 27169691Skan if build == 'local': 28169691Skan return 'local' 29169691Skan sys.stderr.write(build) 30169691Skan raise exception 31169691Skan 32169691Skan 33169691Skandef img_title_from_origs(label, title, base_build_ref, build_name, logical_build_name): 34169691Skan title = title.replace('_tt_', '<tt>') 35169691Skan title = title.replace('_455tt_', '</tt>') 36169691Skan title = title.replace('_b_', '<b>') 37169691Skan title = title.replace('_455b_', '</b>') 38169691Skan title = title.replace('_456', ',') 39169691Skan title = title.replace('_457', '[]') 40169691Skan title = title.replace('_', ' ') 41169691Skan return '%s: %s - <a href = "%s_performance_tests.html#%s">%s</a>' % ( 42169691Skan label, 43169691Skan title, 44169691Skan base_build_ref, 45169691Skan build_name, 46169691Skan logical_build_name) 47169691Skan 48169691Skan 49169691Skandef make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name): 50169691Skan cmd_str = '%s/scripts/make_graph.py %s %s %s %s %s' % ( 51169691Skan src_dir, doc_dir, 52169691Skan res_dir, 53169691Skan tests_info_xml_f_name, 54169691Skan test_name, 55169691Skan build_name) 56169691Skan # Must start a new process for pychart - otherwise pngs overlap. 57169691Skan so = commands.getstatusoutput(cmd_str) 58169691Skan if(so[0] != 0): 59169691Skan sys.stderr.write(cmd_str + '\n') 60169691Skan sys.stderr.write(so[1] + '\n') 61169691Skan sys.exit(-1) 62169691Skan 63169691Skan 64169691Skandef make_png_str(label, test_name, build): 65169691Skan ret = '<h6 class="c1">' 66169691Skan ret += '<a name="%s" id= "%s">' % (label, label) 67169691Skan ret += '<img src="%s" ' % (test_name + '_' + build + '.png') 68169691Skan ret += 'alt="no image" />' 69169691Skan ret += '</a></h6>' 70169691Skan return ret 71169691Skan 72169691Skandef process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name): 73169691Skan doc_dir = src_dir + "/docs/html/ext/pb_ds" 74169691Skan res_dir = build_dir 75169691Skan html_f = open(doc_dir + '/' + html_f_name) 76169691Skan soup = BeautifulSoup(html_f.read()) 77169691Skan html_f.close() 78169691Skan platform_comp_re = re.compile('platform_comp_%s' % build_name) 79169691Skan for d in soup('div'): 80169691Skan try: 81169691Skan settings_m = settings_div_re.match(d['id']) 82169691Skan res_m = res_div_re.match(d['id']) 83169691Skan except: 84169691Skan settings_m = None 85169691Skan res_m = None 86169691Skan 87169691Skan if settings_m: 88169691Skan build = settings_m.groups()[0] 89169691Skan if build == build_name: 90169691Skan logical_build_name = logical_build_from_build(build) 91169691Skan info = gray_border_div_str 92169691Skan info += '<h3><a name = "%s"><u>%s</u></a></h3>' % (build, logical_build_name) 93169691Skan info += make_graph.comp_platform_info(compiler_name) 94169691Skan info += '</div>%s</div>' % space_div_str 95169691Skan d.contents = info 96169691Skan elif res_m: 97169691Skan label = res_m.groups()[0] 98169691Skan d = d.divTag 99169691Skan 100169691Skan build = d['id'].replace('%s_' % label, '') 101169691Skan 102169691Skan if build == build_name: 103169691Skan logical_build_name = logical_build_from_build(build) 104169691Skan d = d.divTag 105169691Skan test_name = d['id'].replace('%s_' % label, '') 106169691Skan d = d.divTag 107169691Skan base_build_ref = d['id'].replace('%s_' % label, '') 108169691Skan d = d.divTag 109169691Skan title = d['id'].replace('%s_' % label, '') 110169691Skan img_title = img_title_from_origs(label, title, base_build_ref, build, logical_build_name) 111169691Skan 112169691Skan make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name) 113169691Skan png_str = make_png_str(label, test_name, build) 114169691Skan content = gray_border_div_str 115169691Skan content += png_str 116169691Skan content += img_title 117169691Skan# content += make_graph.legend(doc_dir, res_dir, tests_info_xml_f_name, test_name, build_name) 118169691Skan content += '</div>%s</div>' % space_div_str 119169691Skan d.contents = content 120169691Skan 121169691Skan return soup 122169691Skan 123169691Skan 124169691Skan 125169691Skanif __name__ == "__main__": 126169691Skan """ 127169691Skan Doc dir 128169691Skan This module takes 6 parameters from the command line: 129169691Skan Source directory 130169691Skan Build directory 131169691Skan HTMLs XML file name 132169691Skan Tests info XML file name 133169691Skan Build name 134169691Skan Compiler name 135169691Skan """ 136169691Skan 137169691Skan usg = "make_graph.py <src_dir> <build_dir> <htmls_xml_f_name> <tests_info_xml_f_name> <build_name> <compiler_name>\n" 138169691Skan 139169691Skan if len(sys.argv) != 7: 140169691Skan sys.stderr.write(usg) 141169691Skan raise exception 142169691Skan 143169691Skan src_dir = sys.argv[1] 144169691Skan build_dir = sys.argv[2] 145169691Skan htmls_xml_f_name = sys.argv[3] 146169691Skan tests_info_xml_f_name = sys.argv[4] 147169691Skan build_name = sys.argv[5] 148169691Skan compiler_name = sys.argv[6] 149169691Skan doc_dir = src_dir + "/docs/html/ext/pb_ds" 150169691Skan htmls_dat = minidom.parse(htmls_xml_f_name) 151169691Skan for html in htmls_dat.getElementsByTagName('html'): 152169691Skan html_f_name = html.attributes['name'].value 153169691Skan 154169691Skan new_soup = process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name) 155169691Skan 156169691Skan html_f = open(doc_dir + '/' + html_f_name, 'w') 157169691Skan html_f.write(str(new_soup)) 158169691Skan html_f.close() 159169691Skan 160169691Skan 161