Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-12-01 23:40:44

0001 #!/usr/bin/env python3
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 # helper function:
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()