CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
cmsCodeRulesChecker.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 __author__="Aurelija"
4 __date__ ="$2010-07-14 16.48.55$"
5 
6 from os.path import join, isdir
7 import os
8 import re
9 import sys
10 from Utilities.ReleaseScripts.cmsCodeRules.keyFinder import finds
11 from Utilities.ReleaseScripts.cmsCodeRules.filesFinder import getFilePathsFromWalk
12 from Utilities.ReleaseScripts.cmsCodeRules.pickleFileCreater import createPickleFile
13 from Utilities.ReleaseScripts.cmsCodeRules.config import Configuration, rulesNames, rulesDescription, helpMsg, checkPath, picklePath, txtPath, exceptPaths
14 from Utilities.ReleaseScripts.cmsCodeRules.pathToRegEx import pathToRegEx
15 from Utilities.ReleaseScripts.cmsCodeRules.showPage import run
16 
17 configuration = Configuration
18 RULES = rulesNames
19 checkPath = checkPath
20 picklePath = picklePath
21 txtPath = txtPath
22 
23 def splitPaths(listRule, pathHead):
24  try:
25  for i in range(len(listRule)):
26  path, linesNumbers = listRule[i]
27  listRule[i] = (path.replace(pathHead, '', 1), linesNumbers)
28  except TypeError:
29  print "Error: given wrong type of parameter in function splitPaths."
30  return listRule
31 
32 def runRules(ruleNumberList, directory):
33 
34  result = []
35  osWalk = []
36 
37  for rule in ruleNumberList:
38  if str(rule) not in RULES:
39  print 'Error: wrong rule parameter. There is no such rule: "'+rule+'"\n\n' + rulesDescription
40  print '\nWrite -h for help'
41  return -1
42 
43  for rule in configuration.keys():
44  configuration[rule]['filter'] = re.compile(configuration[rule]['filter'])
45 
46  osWalk.extend(os.walk(directory))
47 
48  exceptPathsForEachRule = []
49  for path in exceptPaths:
50  exceptPathsForEachRule.append(join(checkPath, path))
51 
52  for ruleNr in ruleNumberList:
53  files = []
54  rule = str(ruleNr)
55  rule = configuration[ruleNr]
56 
57  filesToMatch = rule['filesToMatch']
58  exceptRuleLines = []
59  exceptRulePaths = []
60  for path in rule['exceptPaths']:
61  try:
62  file, line = path.split(":")
63  exceptRuleLines.append((pathToRegEx(file), line))
64  except ValueError:
65  exceptRulePaths.append(pathToRegEx(path))
66  for fileType in filesToMatch:
67  fileList = getFilePathsFromWalk(osWalk, fileType, exceptPathsForEachRule)
68 # ------------------------------------------------------------------------------
69  for path in exceptRulePaths:
70  FileList = []
71  for file in fileList:
72  File = file.replace(join(checkPath, ""), "")
73  if not re.match(path, File):
74  FileList.append(file)
75  fileList = FileList
76 # ------------------------------------------------------------------------------
77  filesLinesList = []
78  skipLines = fileList
79  for skipper in rule['skip']:
80  filesLinesList = skipper(skipLines)
81  skipLines = filesLinesList
82  if not exceptRuleLines and not rule['skip']:
83  filesLinesList = fileList
84 # ------------------------------------------------------------------------------
85  for Nr, fileLine in enumerate(exceptRuleLines):
86  regEx, line = fileLine
87  for index, file in enumerate(fileList):
88  File = file.replace(join(checkPath, ""), "")
89  if re.match(regEx, File):
90  if rule['skip'] != None or Nr > 0:
91  filesLinesList[index] = (filesLinesList[index][0], omitLine(filesLinesList[index][1], line))
92  else:
93  filesLinesList.append([file, omitLine(file, line)])
94  elif rule['skip'] == None:
95  filesLinesList.append((file, open(file).readlines()))
96  files.extend(filesLinesList)
97 # ------------------------------------------------------------------------------
98  listRule = finds(files, rule['filter'], rule['exceptFilter'])
99  result.append((ruleNr, splitPaths(listRule, checkPath)))
100  return result
101 
102 def omitLine(file, line):
103  try:
104  if type(file).__name__ != 'list':
105  fileLines = open(file).readlines()
106  else: fileLines = file
107  fileLines[int(line)-1] = ''
108  except IndexError:
109  print 'File = "' + file +'" has only ' + str(len(fileLines)) + ' lines. Wrong given line number: ' + str(line)
110  return fileLines
111 
112 def printOut(listOfResult, filePath = None):
113  file = None
114  try:
115  for rule, result in listOfResult:
116  if filePath:
117  file = open('%s/cmsCodeRule%s.txt'%(filePath, rule), 'w')
118  for path, lineNumbers in result:
119  file.write('%s\n'%path)
120  file.write('%s\n'%str(lineNumbers))
121  file.close()
122  else:
123  if not result or result == -1:
124  print 'No results for rule %s'%rule
125  else:
126  print 'Rule %s:' %rule
127  for path, lineNumbers in result:
128  print path
129  print lineNumbers
130  except TypeError:
131  print "Error: wrong type of parameter in function printOut"
132 
133 if __name__ == "__main__":
134 
135  cwd = os.getcwd()
136 
137  createPickle = False
138  createTxt = False
139  html = False
140  help = False
141  rules = False
142 
143  goodParameters = True
144  argvLen = len(sys.argv)
145  printResult = False
146  ruleNumbers = RULES
147 
148  i = 1
149  while (i != argvLen):
150  arg = sys.argv[i]
151 
152  if (arg == '-h'):
153  help = True
154  elif (arg == '-r'):
155  rules = True
156  i+=1
157  if i < argvLen:
158  ruleNumbers = sys.argv[i].split(',')
159  else:
160  goodParameters = False
161  print 'Error: missing rule parameters. Write -h for help'
162  break
163  elif (arg == '-d'):
164  i+=1
165  if i < argvLen:
166  checkPath = sys.argv[i]
167  if not isdir(checkPath):
168  goodParameters = False
169  print 'Error: wrong directory "%s"' %checkPath
170  break
171  else:
172  goodParameters = False
173  print 'Error: missing rule parameters. Write -h for help'
174  break
175  elif (arg == '-S'):
176  createPickle = True
177  if i+1 < argvLen and sys.argv[i+1][0] != '-':
178  i+=1
179  picklePath = sys.argv[i]
180  if not isdir(picklePath):
181  goodParameters = False
182  print 'Error: wrong directory "%s"' %picklePath
183  break
184  elif (arg == '-s'):
185  createTxt = True
186  if i+1 < argvLen and sys.argv[i+1][0] != '-':
187  i+=1
188  txtPath = sys.argv[i]
189  if not isdir(txtPath):
190  goodParameters = False
191  print 'Error: wrong directory "%s"' %txtPath
192  break
193  elif (arg == '-html'):
194  html = True
195  createPickle = True
196  elif (arg == '-p'):
197  printResult = True
198  else:
199  goodParameters = False
200  print 'Error: there is no parameter like "%s". Write -h for help' %arg
201  break
202  i+=1
203 
204  if goodParameters == True:
205 
206  if argvLen == 2 and help == True:
207  print helpMsg
208  else:
209  result = runRules(ruleNumbers, checkPath)
210 
211  if result != -1:
212  if argvLen == 1 or printResult or (createPickle == False and createTxt == False):
213  printOut(result)
214  else:
215  if createPickle:
216  for rule, ruleResult in result:
217  createPickleFile('cmsCodeRule%s.dat'%rule, ruleResult, picklePath)
218  if createTxt:
219  printOut(result, txtPath)
220  if html:
221  run(picklePath, picklePath, picklePath)
222  if help:
223  print helpMsg
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
double split
Definition: MVATrainer.cc:139