File indexing completed on 2024-12-01 23:40:44
0001
0002
0003 from builtins import range
0004 __author__="Aurelija"
0005 __date__ ="$2010-08-12 10.50.40$"
0006
0007 from optparse import OptionParser
0008 from shutil import rmtree
0009 from os.path import join
0010 import os.path
0011
0012 from Utilities.ReleaseScripts.cmsCodeRules.Formatter import SimpleHTMLFormatter
0013 from Utilities.ReleaseScripts.cmsCodeRules.pickleFileParser import readPicFiles
0014 from Utilities.ReleaseScripts.cmsCodeRules.config import rulesNames, ordering, Configuration, htmlPath, checkPath
0015
0016
0017
0018 def getIB(pathIn):
0019
0020 ib = None
0021 wkDay = None
0022 dirs = os.path.abspath(pathIn).split('/')
0023 for item in dirs:
0024 if item.startswith('CMSSW_'):
0025 ib = item
0026 break
0027
0028 if ib:
0029 import datetime
0030 fooYr, m, d, hr = ib.split('-')
0031 wkDay = datetime.date( int(fooYr[-4:]), int(m), int(d) ).strftime("%a")
0032
0033 return ib, wkDay
0034
0035 class BuildViewer(object):
0036
0037 def __init__(self, formatter, pickleDir, logsDir, htmlDir):
0038
0039 self.formatter = formatter
0040
0041 self.configuration = Configuration
0042
0043 self.logsDir = logsDir
0044 self.pickleDir = pickleDir
0045 self.htmlDir = htmlDir
0046 return
0047
0048
0049
0050 def showResults(self):
0051
0052 ib, wkDay = getIB(checkPath)
0053
0054 rulesResults = readPicFiles(self.pickleDir, True)
0055 createLogFiles(rulesResults, self.logsDir, ib)
0056
0057 self.formatter.writeAnchor(ref='top')
0058 self.formatter.writeH2("CMSSW code rules violation for "+ib)
0059
0060 self.formatter.startTable([20,20,20,20,50],
0061 ['Rule','Packages', 'Files','Sum of violations','Description'], id =
0062 'descriptionTable', tableAttr='border="0" cellspacing="5" cellpadding="5"')
0063
0064 for ruleName in rulesNames:
0065 try:
0066 ruleRes = rulesResults[ruleName]
0067 totalViolations = 0
0068 totalFiles = 0
0069 for package, packageResult in ruleRes:
0070 totalFiles += len(packageResult)
0071 for file, lines in packageResult:
0072 totalViolations += len(lines)
0073 self.formatter.writeRow([ruleName,str(len(ruleRes)),
0074 str(totalFiles), str(totalViolations),
0075 self.configuration[ruleName]['description']])
0076 except KeyError:
0077 self.formatter.writeRow([ruleName,'-', '-', '-',
0078 self.configuration[ruleName]['description']])
0079 self.formatter.endTable()
0080
0081 msg = """
0082 <p>
0083 Click on the package links to get list of files
0084 </p>
0085
0086 """
0087 self.formatter.write(msg)
0088
0089 colFmt = [ 50 ]
0090 colLab = ['Package']
0091
0092 rules = ordering
0093 for rule in rules:
0094 colFmt.append(20)
0095 colLab.append('Rule %s' %rule)
0096
0097 self.formatter.startTable(colFmt, colLab, id = 'mainTable', cls='display', tableAttr='border="0" cellspacing="5" cellpadding="5"')
0098
0099 packages = []
0100 table = []
0101 tableRow = len(colLab)*tuple('')
0102 ruleNr = 0
0103 for ruleName in rules:
0104 try:
0105 ruleResult = rulesResults[ruleName]
0106 for package, packageResult in ruleResult:
0107 try:
0108 index = packages.index(package)
0109 tableRow = table[index] +(str(len(packageResult)),)
0110 table[index] = tableRow
0111 except ValueError:
0112 packages.append(package)
0113 tableRow = ('<a href="logs/'+package+'/log.html"/>'+package,) + tuple('-' for i in range(ruleNr)) + (str(len(packageResult)),)
0114 table.append(tableRow)
0115 addDash(table, ruleNr)
0116 except KeyError:
0117 addDash(table, ruleNr)
0118 ruleNr += 1
0119
0120 for row in table:
0121 self.formatter.writeRow(row)
0122
0123 self.formatter.endTable()
0124
0125 return
0126
0127 def addDash(table, ruleNr):
0128 for index, tableRow in enumerate(table):
0129 if len(tableRow)-1 != ruleNr + 1:
0130 table[index] = table[index] + ('-',)
0131
0132 def numberConverter(number):
0133 number = str(number)
0134 length = len(number)
0135 if length < 3:
0136 number = (3-length)*str(0) + number
0137 return number
0138
0139 def createLogFiles(rulesResult, logsDir, ib):
0140 logDir = join(logsDir,"logs")
0141 if os.path.exists(logDir):
0142 rmtree(logDir)
0143 for ruleName in rulesNames:
0144 try:
0145 ruleResult = rulesResult[ruleName]
0146 for package, packageResult in ruleResult:
0147 logsDir = join(logDir, package)
0148 if not os.path.exists(logsDir): os.makedirs(logsDir, 0o755)
0149 file = open(join(logsDir, "log.html"), 'a')
0150 file.write('Rule %s'%ruleName)
0151 file.write("<br/>")
0152 for path, lineNumbers in packageResult:
0153 for line in lineNumbers:
0154 directory = join(package, path)
0155 file.write('<a href="https://cmssdt.cern.ch/lxr/source/%s?v=%s#%s">%s:%s</a>\n'%(directory, ib, numberConverter(line), directory, line))
0156 file.write("<br/>")
0157 file.write('\n')
0158 file.close()
0159 except KeyError:
0160 pass
0161
0162 def run(pickleDir, logsDir, htmlDir):
0163 aoSorting = ""
0164 for i in range(len(ordering)):
0165 aoSorting += "["+ str(i+1) +",'desc'],"
0166 aoSorting += "[0, 'asc']"
0167
0168 style = """
0169
0170 <style type="text/css" title="currentStyle">
0171 @import "/SDT/html/jsExt/dataTables/media/css/demo_table.css";
0172 </style>
0173
0174 <script type="text/javascript" src="/SDT/html/jsExt/dataTables/media/js/jquery.js"></script>
0175 <script type="text/javascript" src="/SDT/html/jsExt/dataTables/media/js/jquery.dataTables.js"></script>
0176
0177 <script type="text/javascript" charset="utf-8">
0178 /* Initialise the table with the required column sorting data types */
0179 $(document).ready(function() {
0180 $('#mainTable').dataTable( {
0181 "oLanguage": {
0182 "sLengthMenu": "Display _MENU_ records per page",
0183 "sInfoEmpty": "Showing 0 to 0 of 0 records"
0184 },
0185 "aaSorting": [%s]
0186 } );
0187 $('#descriptionTable').dataTable( {
0188 "aaSorting": [[0, 'asc']],
0189 "bPaginate": false,
0190 "bLengthChange": false,
0191 "bFilter": false,
0192 "bSort": false,
0193 "bInfo": false,
0194 "bAutoWidth": false
0195 });
0196 $('#descriptionTable thead th').css({'border-bottom': '1px solid black'});
0197 } );
0198 </script>
0199 """%(aoSorting)
0200
0201 fmtr = SimpleHTMLFormatter(title="CMSSW integration builds", style=style, outFile = open(join(htmlDir,"cmsCRPage.html"), "w"))
0202
0203 bv = BuildViewer(fmtr, pickleDir, logsDir, htmlDir)
0204 bv.showResults()
0205
0206 def main():
0207
0208 parser = OptionParser()
0209 parser.add_option("-l", "-L", dest="logDir", help = "creates log files to DIRECTORY", metavar = "DIRECTORY", default = os.getcwd())
0210 parser.add_option("-p", "-P", dest="pickleDir", help = "reads pickle files from DIRECTORY", metavar = "DIRECTORY", default = os.getcwd())
0211 parser.add_option("-c", "-C", dest="htmlDir", help = "creates cmsCRPage.html file to DIRECTORY", metavar = "DIRECTORY", default = os.getcwd())
0212 (options, args) = parser.parse_args()
0213
0214 logsDir = options.logDir
0215 pickleDir = options.pickleDir
0216 htmlDir = options.htmlDir
0217
0218 if not os.path.exists(logsDir):
0219 print("Error: wrong directory %s"%logsDir)
0220 return
0221
0222 if not os.path.exists(pickleDir):
0223 print("Error: wrong directory %s"%pickleDir)
0224 return
0225
0226 if not os.path.exists(htmlDir):
0227 print("Error: wrong directory %s"%htmlDir)
0228 return
0229
0230 run(pickleDir, logsDir, htmlDir)
0231
0232 return
0233
0234 if __name__ == "__main__":
0235 main()