91 """ Searches through the requested directory looking at
92 'classes_def.xml' files looking for duplicate Reflex definitions."""
94 classNameRE = re.compile (
r'class\s+name\s*=\s*"([^"]*)"')
95 spacesRE = re.compile (
r'\s+')
96 stdRE = re.compile (
r'std::')
97 srcClassNameRE = re.compile (
r'(\w+)/src/classes_def.*[.]xml')
98 ignoreSrcRE = re.compile (
r'.*/FWCore/Skeletons/scripts/mkTemplates/.+')
99 braketRE = re.compile (
r'<.+>')
100 print(
"Searching for 'classes_def.xml' in '%s'." % os.path.join(os.environ.get(
'CMSSW_BASE'),
'src'))
102 for srcDir
in [os.environ.get(
'CMSSW_BASE'),os.environ.get(
'CMSSW_RELEASE_BASE')]:
103 if not len(srcDir):
continue
104 for xml
in getoutput (
'cd '+os.path.join(srcDir,
'src')+
'; find . -name "*classes_def*.xml" -follow -print').split (
'\n'):
105 if xml
and (
not xml
in xmlFiles):
108 pprint.pprint (xmlFiles)
114 for item
in equivDict:
116 for equiv
in item[pack]:
117 explicitREs.append( (re.compile(
r'\b' + equiv +
r'\b'),pack))
119 for filename
in xmlFiles:
120 if (
not filename)
or (ignoreSrcRE.match(filename)):
continue
121 match = srcClassNameRE.search (filename)
122 if not match:
continue
123 packageName = match.group(1)
124 xmlPackages.append (packageName)
125 matchString =
r'\b' + packageName +
r'\b'
126 packagesREs[packageName] = re.compile (matchString)
127 equivList = equivREs.setdefault (packageName, [])
128 for item
in equivDict:
129 for equiv
in item.get (packageName, []):
130 matchString = re.compile(
r'\b' + equiv +
r'\b')
131 equivList.append( (matchString, equiv) )
132 equivList.append( (packagesREs[packageName], packageName) )
134 ncdict = {
'class' :
'className',
'function' :
'functionName'}
135 for filename
in xmlFiles:
136 if (
not filename)
or (ignoreSrcRE.match(filename)):
continue
143 lostMatch = srcClassNameRE.search (filename)
145 exceptName = lostMatch.group (1)
146 regexList = equivREs[exceptName]
147 xcount = len(regexList)-1
148 if not regexList[xcount][0].search (exceptName):
149 print(
'%s not found in' % exceptName, end=
' ')
150 print(regexList[xcount][0])
154 print(
"filename", filename)
156 filepath = os.path.join(os.environ.get(
'CMSSW_BASE'),
'src',filename)
157 if not os.path.exists(filepath):
158 filepath = os.path.join(os.environ.get(
'CMSSW_RELEASE_BASE'),
'src',filename)
159 xmlObj = xml2obj (filename = filepath,
161 nameChangeDict = ncdict)
162 except Exception
as detail:
163 print(
"File %s is malformed XML. Please fix." % filename)
167 classList = xmlObj.selection.className
170 classList = xmlObj.className
173 print(
"**** SKIPPING '%s' - Doesn't seem to have proper information." % filename)
176 classList = xmlObj.functionName
178 print(
"**** SKIPPING '%s' - Dosen't seem to have proper information(not class/function)." % filename)
180 for piece
in classList:
182 className = spacesRE.sub (
'', piece.name)
187 className = stdRE.sub (
'', className)
190 for typedef, tdList
in six.iteritems(typedefsDict):
192 className = re.sub (alias, typedef, className)
193 classDict.setdefault (className, set()).add (filename)
195 if not options.lostDefs:
197 localObjects.append (className)
198 if options.lazyLostDefs
and not braketRE.search (className):
200 matchString =
r'\b' + className +
r'\b'
201 simpleObjectREs.append( (re.compile (matchString), className ) )
202 for className
in localObjects:
206 for equivRE
in regexList:
208 if equivRE[0].search (className):
211 for simpleRE
in simpleObjectREs:
212 if simpleRE[0].search (className):
214 if options.verbose
and simpleRE[1] != className:
215 print(
" Using %s to ignore %s" \
216 % (simpleRE[1], className))
218 if foundEquiv:
continue
219 for exRes
in explicitREs:
220 if exRes[0].
search(className):
221 dupProblems +=
" %s : %s\n" % (exRes[1], className)
224 if foundEquiv:
continue
225 for packageName
in xmlPackages:
228 if packagesREs[packageName].search (className):
229 dupProblems +=
" %s : %s\n" % (packageName, className)
233 print(
'\n%s\n%s\n' % (filename, dupProblems))
236 for name, fileSet
in sorted( six.iteritems(classDict) ):
237 if len (fileSet) < 2:
240 fileList = sorted (fileSet)
241 for filename
in fileList: