1*67e74705SXin Li#! /usr/bin/env python 2*67e74705SXin Liimport sys, os, re 3*67e74705SXin Li 4*67e74705SXin Liindex = 'cwg_index.html' 5*67e74705SXin Lioutput = 'cxx_dr_status.html' 6*67e74705SXin Lidr_test_dir = '../test/CXX/drs' 7*67e74705SXin Li 8*67e74705SXin Liif len(sys.argv) == 1: 9*67e74705SXin Li pass 10*67e74705SXin Lielif len(sys.argv) == 2: 11*67e74705SXin Li index = sys.argv[1] 12*67e74705SXin Lielse: 13*67e74705SXin Li print >>sys.stderr, 'Usage: make_drs [<path to cwg_index.html>]' 14*67e74705SXin Li sys.exit(1) 15*67e74705SXin Li 16*67e74705SXin Liclass DR: 17*67e74705SXin Li def __init__(self, section, issue, url, status, title): 18*67e74705SXin Li self.section, self.issue, self.url, self.status, self.title = \ 19*67e74705SXin Li section, issue, url, status, title 20*67e74705SXin Li def __repr__(self): 21*67e74705SXin Li return '%s (%s): %s' % (self.issue, self.status, self.title) 22*67e74705SXin Li 23*67e74705SXin Lidef parse(dr): 24*67e74705SXin Li section, issue_link, status, title = [ 25*67e74705SXin Li col.split('>', 1)[1].split('</TD>')[0] 26*67e74705SXin Li for col in dr.split('</TR>', 1)[0].split('<TD')[1:] 27*67e74705SXin Li ] 28*67e74705SXin Li _, url, issue = issue_link.split('"', 2) 29*67e74705SXin Li url = url.strip() 30*67e74705SXin Li issue = int(issue.split('>', 1)[1].split('<', 1)[0]) 31*67e74705SXin Li title = title.replace('<issue_title>', '').replace('</issue_title>', '').strip() 32*67e74705SXin Li return DR(section, issue, url, status, title) 33*67e74705SXin Li 34*67e74705SXin Listatus_re = re.compile(r'\bdr([0-9]+): (.*)') 35*67e74705SXin Listatus_map = {} 36*67e74705SXin Lifor test_cpp in os.listdir(dr_test_dir): 37*67e74705SXin Li if not test_cpp.endswith('.cpp'): 38*67e74705SXin Li continue 39*67e74705SXin Li test_cpp = os.path.join(dr_test_dir, test_cpp) 40*67e74705SXin Li found_any = False; 41*67e74705SXin Li for match in re.finditer(status_re, file(test_cpp, 'r').read()): 42*67e74705SXin Li status_map[int(match.group(1))] = match.group(2) 43*67e74705SXin Li found_any = True 44*67e74705SXin Li if not found_any: 45*67e74705SXin Li print >> sys.stderr, "warning:%s: no '// dr123: foo' comments in this file" % test_cpp 46*67e74705SXin Li 47*67e74705SXin Lidrs = sorted((parse(dr) for dr in file(index, 'r').read().split('<TR>')[2:]), 48*67e74705SXin Li key = lambda dr: dr.issue) 49*67e74705SXin Liout_file = file(output, 'w') 50*67e74705SXin Li 51*67e74705SXin Liprint >> out_file, '''\ 52*67e74705SXin Li<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 53*67e74705SXin Li "http://www.w3.org/TR/html4/strict.dtd"> 54*67e74705SXin Li<!-- This file is auto-generated by make_cxx_dr_status. Do not modify. --> 55*67e74705SXin Li<html> 56*67e74705SXin Li<head> 57*67e74705SXin Li <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 58*67e74705SXin Li <title>Clang - C++ Defect Report Status</title> 59*67e74705SXin Li <link type="text/css" rel="stylesheet" href="menu.css"> 60*67e74705SXin Li <link type="text/css" rel="stylesheet" href="content.css"> 61*67e74705SXin Li <style type="text/css"> 62*67e74705SXin Li .none { background-color: #FFCCCC } 63*67e74705SXin Li .partial { background-color: #FFE0B0 } 64*67e74705SXin Li .svn { background-color: #FFFF99 } 65*67e74705SXin Li .full { background-color: #CCFF99 } 66*67e74705SXin Li .na { background-color: #DDDDDD } 67*67e74705SXin Li .open * { color: #AAAAAA } 68*67e74705SXin Li //.open { filter: opacity(0.2) } 69*67e74705SXin Li tr:target { background-color: #FFFFBB } 70*67e74705SXin Li th { background-color: #FFDDAA } 71*67e74705SXin Li </style> 72*67e74705SXin Li</head> 73*67e74705SXin Li<body> 74*67e74705SXin Li 75*67e74705SXin Li<!--#include virtual="menu.html.incl"--> 76*67e74705SXin Li 77*67e74705SXin Li<div id="content"> 78*67e74705SXin Li 79*67e74705SXin Li<!--*************************************************************************--> 80*67e74705SXin Li<h1>C++ Defect Report Support in Clang</h1> 81*67e74705SXin Li<!--*************************************************************************--> 82*67e74705SXin Li<p>Last updated: $Date$</p> 83*67e74705SXin Li 84*67e74705SXin Li<h2 id="cxxdr">C++ defect report implementation status</h2> 85*67e74705SXin Li 86*67e74705SXin Li<p>This page tracks which C++ defect reports are implemented within Clang.</p> 87*67e74705SXin Li 88*67e74705SXin Li<table width="689" border="1" cellspacing="0"> 89*67e74705SXin Li <tr> 90*67e74705SXin Li <th>Number</th> 91*67e74705SXin Li <th>Status</th> 92*67e74705SXin Li <th>Issue title</th> 93*67e74705SXin Li <th>Available in Clang?</th> 94*67e74705SXin Li </tr>''' 95*67e74705SXin Li 96*67e74705SXin Lidef availability(issue): 97*67e74705SXin Li status = status_map.get(issue, 'unknown') 98*67e74705SXin Li avail_suffix = '' 99*67e74705SXin Li if status.endswith(' c++11'): 100*67e74705SXin Li status = status[:-6] 101*67e74705SXin Li avail_suffix = ' (C++11 onwards)' 102*67e74705SXin Li if status == 'unknown': 103*67e74705SXin Li avail = 'Unknown' 104*67e74705SXin Li avail_style = ' class="none"' 105*67e74705SXin Li elif status == '3.9': 106*67e74705SXin Li avail = 'SVN' 107*67e74705SXin Li avail_style = ' class="svn"' 108*67e74705SXin Li elif status.startswith('3.'): 109*67e74705SXin Li avail = 'Clang %s' % status 110*67e74705SXin Li avail_style = ' class="full"' 111*67e74705SXin Li elif status == 'yes': 112*67e74705SXin Li avail = 'Yes' 113*67e74705SXin Li avail_style = ' class="full"' 114*67e74705SXin Li elif status == 'partial': 115*67e74705SXin Li avail = 'Partial' 116*67e74705SXin Li avail_style = ' class="partial"' 117*67e74705SXin Li elif status == 'no': 118*67e74705SXin Li avail = 'No' 119*67e74705SXin Li avail_style = ' class="none"' 120*67e74705SXin Li elif status == 'na': 121*67e74705SXin Li avail = 'N/A' 122*67e74705SXin Li avail_style = ' class="na"' 123*67e74705SXin Li elif status.startswith('sup '): 124*67e74705SXin Li dup = status.split(' ', 1)[1] 125*67e74705SXin Li avail = 'Superseded by <a href="#%s">%s</a>' % (dup, dup) 126*67e74705SXin Li try: 127*67e74705SXin Li _, avail_style = availability(int(dup)) 128*67e74705SXin Li except: 129*67e74705SXin Li print >>sys.stderr, "issue %s marked as sup %s" % (issue, dup) 130*67e74705SXin Li avail_style = ' class="none"' 131*67e74705SXin Li elif status.startswith('dup '): 132*67e74705SXin Li dup = int(status.split(' ', 1)[1]) 133*67e74705SXin Li avail = 'Duplicate of <a href="#%s">%s</a>' % (dup, dup) 134*67e74705SXin Li _, avail_style = availability(dup) 135*67e74705SXin Li else: 136*67e74705SXin Li assert False, 'unknown status %s for issue %s' % (status, dr.issue) 137*67e74705SXin Li return (avail + avail_suffix, avail_style) 138*67e74705SXin Li 139*67e74705SXin Licount = {} 140*67e74705SXin Lifor dr in drs: 141*67e74705SXin Li if dr.status in ('concepts',): 142*67e74705SXin Li # Yeah, cool story bro. 143*67e74705SXin Li continue 144*67e74705SXin Li if dr.status in ('open', 'concurrency', 'drafting', 'review', 'extension'): 145*67e74705SXin Li # We may have to deal with these some day, but not yet. 146*67e74705SXin Li row_style = ' class="open"' 147*67e74705SXin Li avail = 'Not resolved' 148*67e74705SXin Li avail_style = '' 149*67e74705SXin Li assert dr.issue not in status_map, "have status for not-ready dr %s" % dr.issue 150*67e74705SXin Li else: 151*67e74705SXin Li row_style = '' 152*67e74705SXin Li avail, avail_style = availability(dr.issue) 153*67e74705SXin Li if not avail.startswith('Sup') and not avail.startswith('Dup'): 154*67e74705SXin Li count[avail] = count.get(avail, 0) + 1 155*67e74705SXin Li 156*67e74705SXin Li print >> out_file, '''\ 157*67e74705SXin Li <tr%s id="%s"> 158*67e74705SXin Li <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/%s">%s</a></td> 159*67e74705SXin Li <td>%s</td> 160*67e74705SXin Li <td>%s</td> 161*67e74705SXin Li <td%s align="center">%s</td> 162*67e74705SXin Li </tr>''' % (row_style, dr.issue, dr.url, dr.issue, dr.status, dr.title, avail_style, avail) 163*67e74705SXin Li 164*67e74705SXin Lifor status, num in count.items(): 165*67e74705SXin Li print "%s: %s" % (status, num) 166*67e74705SXin Li 167*67e74705SXin Liprint >> out_file, '''\ 168*67e74705SXin Li</table> 169*67e74705SXin Li 170*67e74705SXin Li</div> 171*67e74705SXin Li</body> 172*67e74705SXin Li</html>''' 173