10 countRE = re.compile (
r'^count_(\w+)')
11 avoid = [
'index',
'print']
14 """returns a tuple. First value is true if summary hasn't found 15 any problems, else false.""" 18 compared = summary.get(
'eventsCompared', -1)
19 if len( summary) != 2:
21 for key,value
in six.iteritems(summary):
22 if countRE.search(key):
24 return (retval, {
'count':count,
'compared':compared})
26 if __name__ ==
"__main__":
29 percentRE = re.compile (
r'%')
30 startOutputRE = re.compile (
r'^Summary$')
31 success1RE = re.compile (
r"{'eventsCompared':\s+(\d+),\s+'count_(\S+)':\s+(\d+)\s*}")
32 success2RE = re.compile (
r"{'count_(\S+)':\s+(\d+),\s+'eventsCompared':\s+(\d+)\s*}")
33 loadingSoRE = re.compile (
r'loading (genobjectrootlibs/\w+)')
34 creatingSoRE = re.compile (
r'creating shared library (\S+)')
35 compRootRE = re.compile (
r' --compRoot=(\S+)')
36 descriptionRE = re.compile (
r'^edmOneToOneComparison.py (\w+).txt')
37 edmCommandRE = re.compile (
r'^(edmOneToOneComparison.py .+?)\s*$')
39 labelErrorRE = re.compile (
r"labelDict = GenObject._ntupleDict\[tupleName\]\['_label'\]")
40 missingLabelRE = re.compile (
r'not able to get')
41 terminatedRE = re.compile (
r'Terminated\s+\$EXE\s+\$@')
42 cppExceptionRE = re.compile (
r'\(C\+\+ exception\)')
43 missingCfgRE = re.compile (
r"raise.+Can't open configuration")
44 finishRE = re.compile (
r'finish')
45 dummyRE = re.compile (
r'edm::Wrapper<dummyType>')
46 noEdmWrapperRE = re.compile (
r"'ROOT' has no attribute 'edm::Wrapper")
47 uint32RE = re.compile (
r"Config file parser error 'operatoruint32_t")
48 nonSpacesRE = re.compile (
r'\S')
49 problemDict = {
'labelDict' : labelErrorRE,
50 'missingLabel' : missingLabelRE,
51 'terminate' : terminatedRE,
53 'cppException' : cppExceptionRE,
54 'missingCfg' : missingCfgRE,
55 'noEdmWrapper' : noEdmWrapperRE,
57 'operator' : re.compile (
r"onfig file parser error 'operator"),
58 'useless' : re.compile (
r'no member functions that are useful'),
59 'lazy' : re.compile (
r': Assertion'),
60 'detset' : re.compile (
r"AttributeError: 'edm::DetSet"),
61 'doubleint' : re.compile (
r'AttributeError: (int|double)'),
64 parser = optparse.OptionParser (
"Usage: %prog logfilePrefix [directory]")
65 parser.add_option (
"--counts", dest=
"counts",
66 action=
"store_true", default=
False,
67 help=
"Display counts only.")
68 parser.add_option (
'--mismatch', dest=
'mismatch',
70 help=
'Displays only mismatch output')
71 parser.add_option (
"--diffTree", dest=
"diffTree",
72 action=
"store_true", default=
False,
73 help=
"Shows diffTree printout.")
74 parser.add_option (
'--makeCompRoot', dest=
'makeCompRoot',
76 help=
'Prints commands to make compRoot files for difftree')
77 parser.add_option (
"--problem", dest=
"problem", type=
'string',
78 help=
"Displays problems matching PROBLEM")
80 options, args = parser.parse_args()
81 if not 1 <= len (args) <= 2:
82 raise RuntimeError(
"Must give directory and log file prefix")
83 logfilePrefix = percentRE.sub (
'*', args[0])
84 if logfilePrefix[-1] !=
'*':
91 files = glob (logfilePrefix)
95 for filename
in oldFiles:
96 files.append (logdir +
'/' + filename)
98 totalFiles = len (files)
112 source = open (log,
'r') 118 line = line.rstrip(
'\n')
119 match = edmCommandRE.search (line)
121 command = match.group(1)
122 match = loadingSoRE.search (line)
124 goShlib = match.group(1)
125 match = creatingSoRE.search (line)
127 goShlib = match.group(1)
129 match = descriptionRE.search (line)
131 objectName = match.group(1)
132 match = compRootRE.search (line)
134 compRoot = match.group(1)
135 match = loadingSoRE.search (line)
137 soName = match.group(1)
139 if not nonSpacesRE.search(line):
143 if startOutputRE.search(line):
147 if success1RE.search (line)
or success2RE.search(line):
150 for key, regex
in six.iteritems(problemDict):
152 if regex.search(line):
153 if key
in problemSet:
156 problems.setdefault(log,[]).
append(key)
157 if key
not in problemTypes:
158 problemTypes[key] = 1
160 problemTypes[key] += 1
165 summary = eval (summaryLines)
166 ok = summaryOK (summary)
175 successes[log] = pprint.pformat (summary, indent=4)
179 if log
not in problems
and not ok[0]:
180 if not ok[0]
and summary:
182 problems[log] = pprint.pformat (summary, indent=4)
184 if objectName
and compRoot
and soName:
186 varNames = summary.get(objectName, {}).\
188 variables = [
'eta',
'phi']
189 for var
in sorted (varNames):
190 if var
not in variables
and var
not in avoid:
191 variables.append (var)
192 diffCmd =
'diffTreeTool.py --skipUndefined %s %s %s' \
193 % (compRoot, soName,
" ".
join(variables))
195 diffOutput[log] = diffCmd
197 problems[log] = [
'other',
'ran:%s' % ran,
198 'success:%s' % success]
200 if key
not in problemTypes:
201 problemTypes[key] = 1
203 problemTypes[key] += 1
204 mismatches = problemTypes.get(
'mismatch', 0)
205 if 'mismatch' in problemTypes:
206 del problemTypes[
'mismatch']
207 print "total: ", len (files)
208 print "success: ", succeeded
209 print "mismatches: ", mismatches
210 print "weird: ", weird
211 print "Tool issue types:" 213 for key, value
in sorted (six.iteritems(problemTypes)):
214 print " %-15s: %4d" % (key, value)
216 print " ",
'-'*13,
" : ----" 217 print " %-15s: %4d + %d + %d + %d = %d" \
218 % (
'total', total, succeeded, mismatches, weird,
219 total + succeeded + mismatches + weird)
221 if not options.counts:
222 print "\nDetailed Problems list:" 223 for key, problemList
in sorted (six.iteritems(problems)):
224 if options.problem
and problemList[0] != options.problem:
226 if options.mismatch
and not isinstance (problemList, str):
229 print " %s:\n %s\n" % (key, problemList)
230 if options.mismatch
and goShlib
and compRoot:
231 print "diffTree %s %s" % (goShlib, compRoot)
232 diffCmd = diffOutput.get(key)
234 print commands.getoutput (diffCmd)
235 if not options.problem
and not options.mismatch:
236 print "\n",
'='*78,
'\n' 237 print "Success list:" 238 for key, successesList
in sorted (six.iteritems(successes)):
239 print " %s:\n %s\n" % (key, successesList)
static std::string join(char **cmd)
T get(const Candidate &c)