00001
00002
00003 __author__="Aurelija"
00004 __date__ ="$2010-07-14 16.48.55$"
00005
00006 from os.path import join, isdir
00007 import os
00008 import re
00009 import sys
00010 from Utilities.ReleaseScripts.cmsCodeRules.keyFinder import finds
00011 from Utilities.ReleaseScripts.cmsCodeRules.filesFinder import getFilePathsFromWalk
00012 from Utilities.ReleaseScripts.cmsCodeRules.pickleFileCreater import createPickleFile
00013 from Utilities.ReleaseScripts.cmsCodeRules.config import Configuration, rulesNames, rulesDescription, helpMsg, checkPath, picklePath, txtPath, exceptPaths
00014 from Utilities.ReleaseScripts.cmsCodeRules.pathToRegEx import pathToRegEx
00015 from Utilities.ReleaseScripts.cmsCodeRules.showPage import run
00016
00017 configuration = Configuration
00018 RULES = rulesNames
00019 checkPath = checkPath
00020 picklePath = picklePath
00021 txtPath = txtPath
00022
00023 def splitPaths(listRule, pathHead):
00024 try:
00025 for i in range(len(listRule)):
00026 path, linesNumbers = listRule[i]
00027 listRule[i] = (path.replace(pathHead, '', 1), linesNumbers)
00028 except TypeError:
00029 print "Error: given wrong type of parameter in function splitPaths."
00030 return listRule
00031
00032 def runRules(ruleNumberList, directory):
00033
00034 result = []
00035 osWalk = []
00036
00037 for rule in ruleNumberList:
00038 if str(rule) not in RULES:
00039 print 'Error: wrong rule parameter. There is no such rule: "'+rule+'"\n\n' + rulesDescription
00040 print '\nWrite -h for help'
00041 return -1
00042
00043 for rule in configuration.keys():
00044 configuration[rule]['filter'] = re.compile(configuration[rule]['filter'])
00045
00046 osWalk.extend(os.walk(directory))
00047
00048 exceptPathsForEachRule = []
00049 for path in exceptPaths:
00050 exceptPathsForEachRule.append(join(checkPath, path))
00051
00052 for ruleNr in ruleNumberList:
00053 files = []
00054 rule = str(ruleNr)
00055 rule = configuration[ruleNr]
00056
00057 filesToMatch = rule['filesToMatch']
00058 exceptRuleLines = []
00059 exceptRulePaths = []
00060 for path in rule['exceptPaths']:
00061 try:
00062 file, line = path.split(":")
00063 exceptRuleLines.append((pathToRegEx(file), line))
00064 except ValueError:
00065 exceptRulePaths.append(pathToRegEx(path))
00066 for fileType in filesToMatch:
00067 fileList = getFilePathsFromWalk(osWalk, fileType, exceptPathsForEachRule)
00068
00069 for path in exceptRulePaths:
00070 FileList = []
00071 for file in fileList:
00072 File = file.replace(join(checkPath, ""), "")
00073 if not re.match(path, File):
00074 FileList.append(file)
00075 fileList = FileList
00076
00077 filesLinesList = []
00078 skipLines = fileList
00079 for skipper in rule['skip']:
00080 filesLinesList = skipper(skipLines)
00081 skipLines = filesLinesList
00082 if not exceptRuleLines and not rule['skip']:
00083 filesLinesList = fileList
00084
00085 for Nr, fileLine in enumerate(exceptRuleLines):
00086 regEx, line = fileLine
00087 for index, file in enumerate(fileList):
00088 File = file.replace(join(checkPath, ""), "")
00089 if re.match(regEx, File):
00090 if rule['skip'] != None or Nr > 0:
00091 filesLinesList[index] = (filesLinesList[index][0], omitLine(filesLinesList[index][1], line))
00092 else:
00093 filesLinesList.append([file, omitLine(file, line)])
00094 elif rule['skip'] == None:
00095 filesLinesList.append((file, open(file).readlines()))
00096 files.extend(filesLinesList)
00097
00098 listRule = finds(files, rule['filter'], rule['exceptFilter'])
00099 result.append((ruleNr, splitPaths(listRule, checkPath)))
00100 return result
00101
00102 def omitLine(file, line):
00103 try:
00104 if type(file).__name__ != 'list':
00105 fileLines = open(file).readlines()
00106 else: fileLines = file
00107 fileLines[int(line)-1] = ''
00108 except IndexError:
00109 print 'File = "' + file +'" has only ' + str(len(fileLines)) + ' lines. Wrong given line number: ' + str(line)
00110 return fileLines
00111
00112 def printOut(listOfResult, filePath = None):
00113 file = None
00114 try:
00115 for rule, result in listOfResult:
00116 if filePath:
00117 file = open('%s/cmsCodeRule%s.txt'%(filePath, rule), 'w')
00118 for path, lineNumbers in result:
00119 file.write('%s\n'%path)
00120 file.write('%s\n'%str(lineNumbers))
00121 file.close()
00122 else:
00123 if not result or result == -1:
00124 print 'No results for rule %s'%rule
00125 else:
00126 print 'Rule %s:' %rule
00127 for path, lineNumbers in result:
00128 print path
00129 print lineNumbers
00130 except TypeError:
00131 print "Error: wrong type of parameter in function printOut"
00132
00133 if __name__ == "__main__":
00134
00135 cwd = os.getcwd()
00136
00137 createPickle = False
00138 createTxt = False
00139 html = False
00140 help = False
00141 rules = False
00142
00143 goodParameters = True
00144 argvLen = len(sys.argv)
00145 printResult = False
00146 ruleNumbers = RULES
00147
00148 i = 1
00149 while (i != argvLen):
00150 arg = sys.argv[i]
00151
00152 if (arg == '-h'):
00153 help = True
00154 elif (arg == '-r'):
00155 rules = True
00156 i+=1
00157 if i < argvLen:
00158 ruleNumbers = sys.argv[i].split(',')
00159 else:
00160 goodParameters = False
00161 print 'Error: missing rule parameters. Write -h for help'
00162 break
00163 elif (arg == '-d'):
00164 i+=1
00165 if i < argvLen:
00166 checkPath = sys.argv[i]
00167 if not isdir(checkPath):
00168 goodParameters = False
00169 print 'Error: wrong directory "%s"' %checkPath
00170 break
00171 else:
00172 goodParameters = False
00173 print 'Error: missing rule parameters. Write -h for help'
00174 break
00175 elif (arg == '-S'):
00176 createPickle = True
00177 if i+1 < argvLen and sys.argv[i+1][0] != '-':
00178 i+=1
00179 picklePath = sys.argv[i]
00180 if not isdir(picklePath):
00181 goodParameters = False
00182 print 'Error: wrong directory "%s"' %picklePath
00183 break
00184 elif (arg == '-s'):
00185 createTxt = True
00186 if i+1 < argvLen and sys.argv[i+1][0] != '-':
00187 i+=1
00188 txtPath = sys.argv[i]
00189 if not isdir(txtPath):
00190 goodParameters = False
00191 print 'Error: wrong directory "%s"' %txtPath
00192 break
00193 elif (arg == '-html'):
00194 html = True
00195 createPickle = True
00196 elif (arg == '-p'):
00197 printResult = True
00198 else:
00199 goodParameters = False
00200 print 'Error: there is no parameter like "%s". Write -h for help' %arg
00201 break
00202 i+=1
00203
00204 if goodParameters == True:
00205
00206 if argvLen == 2 and help == True:
00207 print helpMsg
00208 else:
00209 result = runRules(ruleNumbers, checkPath)
00210
00211 if result != -1:
00212 if argvLen == 1 or printResult or (createPickle == False and createTxt == False):
00213 printOut(result)
00214 else:
00215 if createPickle:
00216 for rule, ruleResult in result:
00217 createPickleFile('cmsCodeRule%s.dat'%rule, ruleResult, picklePath)
00218 if createTxt:
00219 printOut(result, txtPath)
00220 if html:
00221 run(picklePath, picklePath, picklePath)
00222 if help:
00223 print helpMsg