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-07-14 16.48.55$"
0006 
0007 from os.path import join, isdir
0008 import os
0009 import re
0010 import sys
0011 from Utilities.ReleaseScripts.cmsCodeRules.keyFinder import finds
0012 from Utilities.ReleaseScripts.cmsCodeRules.filesFinder import getFilePathsFromWalk
0013 from Utilities.ReleaseScripts.cmsCodeRules.pickleFileCreater import createPickleFile
0014 from Utilities.ReleaseScripts.cmsCodeRules.config import Configuration, rulesNames, rulesDescription, helpMsg, checkPath, picklePath, txtPath, exceptPaths
0015 from Utilities.ReleaseScripts.cmsCodeRules.pathToRegEx import pathToRegEx
0016 from Utilities.ReleaseScripts.cmsCodeRules.showPage import run
0017 
0018 configuration = Configuration
0019 RULES = rulesNames
0020 checkPath = checkPath
0021 picklePath = picklePath
0022 txtPath = txtPath
0023 
0024 def splitPaths(listRule, pathHead):
0025     try:
0026         for i in range(len(listRule)):
0027             path, linesNumbers = listRule[i]
0028             listRule[i] = (path.replace(pathHead, '', 1), linesNumbers)
0029     except TypeError:
0030         print("Error: given wrong type of parameter in function splitPaths.")
0031     return listRule
0032 
0033 def runRules(ruleNumberList, directory):
0034 
0035     result = []
0036     osWalk = []
0037     
0038     for rule in ruleNumberList:
0039         if str(rule) not in RULES:
0040             print('Error: wrong rule parameter. There is no such rule: "'+rule+'"\n\n' + rulesDescription)
0041             print('\nWrite -h for help')
0042             return -1
0043 
0044     for rule in configuration.keys():
0045         configuration[rule]['filter'] = re.compile(configuration[rule]['filter'])
0046 
0047     osWalk.extend(os.walk(directory))
0048 
0049     exceptPathsForEachRule = []
0050     for path in exceptPaths:
0051         exceptPathsForEachRule.append(join(checkPath, path))
0052 
0053     for ruleNr in ruleNumberList:
0054         files = []
0055         rule = str(ruleNr)
0056         rule = configuration[ruleNr]
0057 
0058         filesToMatch = rule['filesToMatch']
0059         exceptRuleLines = []
0060         exceptRulePaths = []
0061         for path in rule['exceptPaths']:
0062             try:
0063                 file, line = path.split(":",1)
0064                 xline = line
0065                 xdata = None
0066                 try:
0067                     xline, xdata = line.split(":",1)
0068                     if not xline: xline = '.*'
0069                 except ValueError:
0070                     pass
0071                 exceptRuleLines.append((pathToRegEx(file), xline,xdata))
0072             except ValueError:
0073                 exceptRulePaths.append(pathToRegEx(path))
0074         for fileType in filesToMatch:
0075             fileList = getFilePathsFromWalk(osWalk, fileType, exceptPathsForEachRule)
0076 # ------------------------------------------------------------------------------
0077             for path in exceptRulePaths:
0078                 xFileList = []
0079                 for file in fileList:
0080                     xFile = file.replace(join(checkPath, ""), "")
0081                     if not re.match(path, xFile):
0082                         xFileList.append(file)
0083                 fileList = xFileList
0084 # ------------------------------------------------------------------------------
0085             filesLinesList = fileList
0086             if rule['skip']:
0087                 for skipper in rule['skip']:
0088                     filesLinesList = skipper(filesLinesList)
0089             else:
0090                 for i,xFile in enumerate(filesLinesList):
0091                     filesLinesList[i]=((xFile,open(xFile, errors='replace').readlines()))
0092 # ------------------------------------------------------------------------------
0093             for Nr, fileLine in enumerate(exceptRuleLines):
0094                 regEx, line, lineEx = fileLine
0095                 for index, file in enumerate(fileList):
0096                     xFile = file.replace(join(checkPath, ""), "")
0097                     if re.match(regEx, xFile):
0098                         filesLinesList[index] = (filesLinesList[index][0], omitLine(filesLinesList[index][1], line,lineEx))
0099             files.extend(filesLinesList)
0100 # ------------------------------------------------------------------------------
0101         listRule = finds(files, rule['filter'], rule['exceptFilter'])
0102         result.append((ruleNr, splitPaths(listRule, checkPath)))
0103     return result
0104 
0105 def omitLine(lines, line, regEx=None):
0106     fileLines = lines
0107     if re.match('^\d+$',line):
0108         xline = int(line)-1
0109         try:
0110             if (not regEx) or (re.search(regEx,fileLines[xline].strip())):
0111                 fileLines[xline] = ''
0112         except IndexError:
0113             pass
0114     else:
0115         for i,lineData in enumerate(fileLines):
0116             if re.match(line,str(i)):
0117                 lineData = lineData.strip()
0118                 if (not regEx) or (re.search(regEx,lineData)):
0119                     fileLines[i] = ''
0120     return fileLines
0121 
0122 def printOut(listOfResult, filePath = None):
0123     file = None
0124     try:
0125         for rule, result in listOfResult:
0126             if filePath:
0127                 file = open('%s/cmsCodeRule%s.txt'%(filePath, rule), 'w')
0128                 for path, lineNumbers in result:
0129                     file.write('%s\n'%path)
0130                     file.write('%s\n'%str(lineNumbers))
0131                 file.close()
0132             else:
0133                 if not result or result == -1:
0134                     print('No results for rule %s'%rule)
0135                 else:
0136                     print('Rule %s:' %rule)
0137                     for path, lineNumbers in result:
0138                         print(path)
0139                         print(lineNumbers)
0140     except TypeError:
0141         print("Error: wrong type of parameter in function printOut")
0142 
0143 if __name__ == "__main__":
0144 
0145     cwd = os.getcwd()
0146     
0147     createPickle = False
0148     createTxt = False
0149     html = False
0150     help = False
0151     rules = False
0152     
0153     goodParameters = True
0154     argvLen = len(sys.argv)
0155     printResult = False
0156     ruleNumbers = RULES
0157 
0158     i = 1
0159     while (i != argvLen):
0160         arg = sys.argv[i]
0161 
0162         if   (arg == '-h'):
0163             help = True
0164         elif (arg == '-r'):
0165             rules = True
0166             i+=1
0167             if i < argvLen:
0168                 ruleNumbers = sys.argv[i].split(',')
0169             else:
0170                 goodParameters = False
0171                 print('Error: missing rule parameters. Write -h for help')
0172                 break
0173         elif (arg == '-d'):
0174             i+=1
0175             if i < argvLen:
0176                 checkPath = sys.argv[i]
0177                 if not isdir(checkPath):
0178                     goodParameters = False
0179                     print('Error: wrong directory "%s"' %checkPath)
0180                     break
0181             else:
0182                 goodParameters = False
0183                 print('Error: missing rule parameters. Write -h for help')
0184                 break
0185         elif (arg == '-S'):
0186             createPickle = True
0187             if i+1 < argvLen and sys.argv[i+1][0] != '-':
0188                 i+=1
0189                 picklePath = sys.argv[i]
0190                 if not isdir(picklePath):
0191                     goodParameters = False
0192                     print('Error: wrong directory "%s"' %picklePath)
0193                     break
0194         elif (arg == '-s'):
0195             createTxt = True
0196             if i+1 < argvLen and sys.argv[i+1][0] != '-':
0197                 i+=1
0198                 txtPath = sys.argv[i]
0199                 if not isdir(txtPath):
0200                     goodParameters = False
0201                     print('Error: wrong directory "%s"' %txtPath)
0202                     break
0203         elif (arg == '-html'):
0204             html = True
0205             createPickle = True
0206         elif (arg == '-p'):
0207             printResult = True
0208         else:
0209             goodParameters = False
0210             print('Error: there is no parameter like "%s". Write -h for help' %arg)
0211             break
0212         i+=1
0213 
0214     if goodParameters == True:
0215 
0216         if argvLen == 2 and help == True:
0217             print(helpMsg)
0218         else:
0219             result = runRules(ruleNumbers, checkPath)
0220                     
0221             if result != -1:
0222                 if argvLen == 1 or printResult or (createPickle == False and createTxt == False):
0223                     printOut(result)
0224                 else:
0225                     if createPickle:
0226                         for rule, ruleResult in result:
0227                             createPickleFile('cmsCodeRule%s.dat'%rule, ruleResult, picklePath)
0228                     if createTxt:
0229                         printOut(result, txtPath)
0230             if html:
0231                 run(picklePath, picklePath, picklePath)
0232             if help:
0233                 print(helpMsg)