File indexing completed on 2024-12-01 23:40:44
0001
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)