def searchClassDefXml(): """ Searches through the requested directory looking at 'classes_def.xml' files looking for duplicate Reflex definitions.""" # compile necessary RE statements classNameRE = re.compile(r'class\s+name\s*=\s*"([^"]*)"') spacesRE = re.compile(r'\s+') stdRE = re.compile(r'std::') srcClassNameRE = re.compile(r'(\w+)/src/classes_def.*[.]xml') ignoreSrcRE = re.compile(r'.*/FWCore/Skeletons/scripts/mkTemplates/.+') braketRE = re.compile(r'<.+>') print("Searching for 'classes_def.xml' in '%s'." % os.path.join(os.environ.get('CMSSW_BASE'), 'src')) xmlFiles = [] for srcDir in [ os.environ.get('CMSSW_BASE'), os.environ.get('CMSSW_RELEASE_BASE') ]: if not len(srcDir): continue for xml in getoutput( 'cd ' + os.path.join(srcDir, 'src') + '; find . -name "*classes_def*.xml" -follow -print').split( '\n'): if xml and (not xml in xmlFiles): xmlFiles.append(xml) if options.showXMLs: pprint.pprint(xmlFiles) # try and figure out the names of the packages xmlPackages = [] packagesREs = {} equivREs = {} explicitREs = [] for item in equivDict: for pack in item: for equiv in item[pack]: explicitREs.append((re.compile(r'\b' + equiv + r'\b'), pack)) if options.lostDefs: for filename in xmlFiles: if (not filename) or (ignoreSrcRE.match(filename)): continue match = srcClassNameRE.search(filename) if not match: continue packageName = match.group(1) xmlPackages.append(packageName) matchString = r'\b' + packageName + r'\b' packagesREs[packageName] = re.compile(matchString) equivList = equivREs.setdefault(packageName, []) for item in equivDict: for equiv in item.get(packageName, []): matchString = re.compile(r'\b' + equiv + r'\b') equivList.append((matchString, equiv)) equivList.append((packagesREs[packageName], packageName)) classDict = {} ncdict = {'class': 'className', 'function': 'functionName'} for filename in xmlFiles: if (not filename) or (ignoreSrcRE.match(filename)): continue dupProblems = '' exceptName = '' regexList = [] localObjects = [] simpleObjectREs = [] if options.lostDefs: lostMatch = srcClassNameRE.search(filename) if lostMatch: exceptName = lostMatch.group(1) regexList = equivREs[exceptName] xcount = len(regexList) - 1 if not regexList[xcount][0].search(exceptName): print('%s not found in' % exceptName, end=' ') print(regexList[xcount][0]) sys.exit() else: continue if options.verbose: print("filename", filename) try: filepath = os.path.join(os.environ.get('CMSSW_BASE'), 'src', filename) if not os.path.exists(filepath): filepath = os.path.join(os.environ.get('CMSSW_RELEASE_BASE'), 'src', filename) xmlObj = xml2obj(filename=filepath, filtering=True, nameChangeDict=ncdict) except Exception as detail: print("File %s is malformed XML. Please fix." % filename) print(" ", detail) continue try: classList = xmlObj.selection.className except: try: classList = xmlObj.className except: # this isn't a real classes_def.xml file. Skip it print( "**** SKIPPING '%s' - Doesn't seem to have proper information." % filename) continue if not classList: classList = xmlObj.functionName if not classList: print( "**** SKIPPING '%s' - Dosen't seem to have proper information(not class/function)." % filename) continue for piece in classList: try: className = spacesRE.sub('', piece.name) except: # must be one of these class pattern things. Skip it #print " skipping %s" % filename, piece.__repr__() continue className = stdRE.sub('', className) # print " ", className # Now get rid of any typedefs for typedef, tdList in typedefsDict.items(): for alias in tdList: className = re.sub(alias, typedef, className) classDict.setdefault(className, set()).add(filename) # should we check for lost definitions? if not options.lostDefs: continue localObjects.append(className) if options.lazyLostDefs and not braketRE.search(className): #print " ", className matchString = r'\b' + className + r'\b' simpleObjectREs.append((re.compile(matchString), className)) for className in localObjects: # if we see our name (or equivalent) here, then let's # skip complaining about this foundEquiv = False for equivRE in regexList: #print("searching %s for %s" % (equivRE[1], className)) if equivRE[0].search(className): foundEquiv = True break for simpleRE in simpleObjectREs: if simpleRE[0].search(className): foundEquiv = True if options.verbose and simpleRE[1] != className: print(" Using %s to ignore %s" \ % (simpleRE[1], className)) break if foundEquiv: continue for exRes in explicitREs: if exRes[0].search(className): dupProblems += " %s : %s\n" % (exRes[1], className) foundEquiv = True break if foundEquiv: continue for packageName in xmlPackages: # don't bother looking for the name of this # package in this package if packagesREs[packageName].search(className): dupProblems += " %s : %s\n" % (packageName, className) break # for piece if dupProblems: print('\n%s\n%s\n' % (filename, dupProblems)) # for filename if options.dups: for name, fileSet in sorted(classDict.items()): if len(fileSet) < 2: continue print(name) fileList = sorted(fileSet) for filename in fileList: print(" ", filename) print()
def searchClassDefXml (srcDir): """ Searches through the requested directory looking at 'classes_def.xml' files looking for duplicate Reflex definitions.""" # compile necessary RE statements classNameRE = re.compile (r'class\s+name\s*=\s*"([^"]*)"') spacesRE = re.compile (r'\s+') stdRE = re.compile (r'std::') srcClassNameRE = re.compile (r'(\w+)/src/classes_def.xml') braketRE = re.compile (r'<.+>') # get the source directory we want if not len (srcDir): try: srcDir = getReleaseBaseDir() + '/src' except: raise RuntimeError, "$CMSSW_RELEASE_BASE not found." try: os.chdir (srcDir) except: raise RuntimeError, "'%s' is not a valid directory." % srcDir print "Searching for 'classes_def.xml' in '%s'." % srcDir xmlFiles = commands.getoutput ('find . -name "*classes_def.xml" -print').\ split ('\n') # print out the XML files, if requested if options.showXMLs: pprint.pprint (xmlFiles) # try and figure out the names of the packages xmlPackages = [] packagesREs = {} equivREs = {} if options.lostDefs: for filename in xmlFiles: if not filename: continue match = srcClassNameRE.search (filename) if not match: continue packageName = match.group(1) xmlPackages.append (packageName) matchString = r'\b' + packageName + r'\b' packagesREs[packageName] = re.compile (matchString) equivList = equivREs.setdefault (packageName, []) equivList.append( (packagesREs[packageName], packageName) ) for equiv in equivDict.get (packageName, []): matchString = r'\b' + equiv + r'\b' equivList.append( (re.compile (matchString), equiv) ) #pprint.pprint (equivREs, width=109) classDict = {} ncdict = {'class' : 'className'} for filename in xmlFiles: if not filename: continue dupProblems = '' exceptName = '' regexList = [] localObjects = [] simpleObjectREs = [] if options.lostDefs: lostMatch = srcClassNameRE.search (filename) if lostMatch: exceptName = lostMatch.group (1) regexList = equivREs[exceptName] if not regexList[0][0].search (exceptName): print '%s not found in' % exceptName, print regexList[0][0] sys.exit() else: continue if options.verbose: print "filename", filename try: xmlObj = xml2obj (filename = filename, filtering = True, nameChangeDict = ncdict) except Exception as detail: print "File %s is malformed XML. Please fix." % filename print " ", detail continue try: classList = xmlObj.selection.className except: try: classList = xmlObj.className except: # this isn't a real classes_def.xml file. Skip it print "**** SKIPPING '%s' - Doesn't seem to have proper information." % filename continue for piece in classList: try: className = spacesRE.sub ('', piece.name) except: # must be one of these class pattern things. Skip it #print " skipping %s" % filename, piece.__repr__() continue className = stdRE.sub ('', className) # print " ", className # Now get rid of any typedefs for typedef, tdList in typedefsDict.iteritems(): for alias in tdList: className = re.sub (alias, typedef, className) classDict.setdefault (className, set()).add (filename) # should we check for lost definitions? if not options.lostDefs: continue localObjects.append (className) if options.lazyLostDefs and not braketRE.search (className): #print " ", className matchString = r'\b' + className + r'\b' simpleObjectREs.append( (re.compile (matchString), className ) ) for className in localObjects: # if we see our name (or equivalent) here, then let's # skip complaining about this foundEquiv = False for equivRE in regexList: #print "searching %s for %s" % (equivRE[1], className) if equivRE[0].search (className): foundEquiv = True #print "Found it!" break for simpleRE in simpleObjectREs: if simpleRE[0].search (className): foundEquiv = True if options.verbose and simpleRE[1] != className: print " Using %s to ignore %s" \ % (simpleRE[1], className) break if foundEquiv: continue for packageName in xmlPackages: # don't bother looking for the name of this # package in this package if packagesREs[packageName].search (className): dupProblems += " %s : %s\n" % (packageName, className) # for piece if dupProblems: print '\n%s\n%s\n' % (filename, dupProblems) # for filename if options.dups: for name, fileSet in sorted( classDict.iteritems() ): if len (fileSet) < 2: continue print name fileList = list (fileSet) fileList.sort() for filename in fileList: print " ", filename print
def searchClassDefXml (): """ Searches through the requested directory looking at 'classes_def.xml' files looking for duplicate Reflex definitions.""" # compile necessary RE statements classNameRE = re.compile (r'class\s+name\s*=\s*"([^"]*)"') spacesRE = re.compile (r'\s+') stdRE = re.compile (r'std::') srcClassNameRE = re.compile (r'(\w+)/src/classes_def.*[.]xml') ignoreSrcRE = re.compile (r'.*/FWCore/Skeletons/scripts/mkTemplates/.+') braketRE = re.compile (r'<.+>') print("Searching for 'classes_def.xml' in '%s'." % os.path.join(os.environ.get('CMSSW_BASE'),'src')) xmlFiles = [] for srcDir in [os.environ.get('CMSSW_BASE'),os.environ.get('CMSSW_RELEASE_BASE')]: if not len(srcDir): continue for xml in commands.getoutput ('cd '+os.path.join(srcDir,'src')+'; find . -name "*classes_def*.xml" -follow -print').split ('\n'): if xml and (not xml in xmlFiles): xmlFiles.append(xml) if options.showXMLs: pprint.pprint (xmlFiles) # try and figure out the names of the packages xmlPackages = [] packagesREs = {} equivREs = {} explicitREs = [] for item in equivDict: for pack in item: for equiv in item[pack]: explicitREs.append( (re.compile(r'\b' + equiv + r'\b'),pack)) if options.lostDefs: for filename in xmlFiles: if (not filename) or (ignoreSrcRE.match(filename)): continue match = srcClassNameRE.search (filename) if not match: continue packageName = match.group(1) xmlPackages.append (packageName) matchString = r'\b' + packageName + r'\b' packagesREs[packageName] = re.compile (matchString) equivList = equivREs.setdefault (packageName, []) for item in equivDict: for equiv in item.get (packageName, []): matchString = re.compile(r'\b' + equiv + r'\b') equivList.append( (matchString, equiv) ) equivList.append( (packagesREs[packageName], packageName) ) classDict = {} ncdict = {'class' : 'className', 'function' : 'functionName'} for filename in xmlFiles: if (not filename) or (ignoreSrcRE.match(filename)): continue dupProblems = '' exceptName = '' regexList = [] localObjects = [] simpleObjectREs = [] if options.lostDefs: lostMatch = srcClassNameRE.search (filename) if lostMatch: exceptName = lostMatch.group (1) regexList = equivREs[exceptName] xcount = len(regexList)-1 if not regexList[xcount][0].search (exceptName): print('%s not found in' % exceptName, end=' ') print(regexList[xcount][0]) sys.exit() else: continue if options.verbose: print("filename", filename) try: filepath = os.path.join(os.environ.get('CMSSW_BASE'),'src',filename) if not os.path.exists(filepath): filepath = os.path.join(os.environ.get('CMSSW_RELEASE_BASE'),'src',filename) xmlObj = xml2obj (filename = filepath, filtering = True, nameChangeDict = ncdict) except Exception as detail: print("File %s is malformed XML. Please fix." % filename) print(" ", detail) continue try: classList = xmlObj.selection.className except: try: classList = xmlObj.className except: # this isn't a real classes_def.xml file. Skip it print("**** SKIPPING '%s' - Doesn't seem to have proper information." % filename) continue if not classList: classList = xmlObj.functionName if not classList: print("**** SKIPPING '%s' - Dosen't seem to have proper information(not class/function)." % filename) continue for piece in classList: try: className = spacesRE.sub ('', piece.name) except: # must be one of these class pattern things. Skip it #print " skipping %s" % filename, piece.__repr__() continue className = stdRE.sub ('', className) # print " ", className # Now get rid of any typedefs for typedef, tdList in six.iteritems(typedefsDict): for alias in tdList: className = re.sub (alias, typedef, className) classDict.setdefault (className, set()).add (filename) # should we check for lost definitions? if not options.lostDefs: continue localObjects.append (className) if options.lazyLostDefs and not braketRE.search (className): #print " ", className matchString = r'\b' + className + r'\b' simpleObjectREs.append( (re.compile (matchString), className ) ) for className in localObjects: # if we see our name (or equivalent) here, then let's # skip complaining about this foundEquiv = False for equivRE in regexList: #print "searching %s for %s" % (equivRE[1], className) if equivRE[0].search (className): foundEquiv = True break for simpleRE in simpleObjectREs: if simpleRE[0].search (className): foundEquiv = True if options.verbose and simpleRE[1] != className: print(" Using %s to ignore %s" \ % (simpleRE[1], className)) break if foundEquiv: continue for exRes in explicitREs: if exRes[0].search(className): dupProblems += " %s : %s\n" % (exRes[1], className) foundEquiv = True break if foundEquiv: continue for packageName in xmlPackages: # don't bother looking for the name of this # package in this package if packagesREs[packageName].search (className): dupProblems += " %s : %s\n" % (packageName, className) break # for piece if dupProblems: print('\n%s\n%s\n' % (filename, dupProblems)) # for filename if options.dups: for name, fileSet in sorted( six.iteritems(classDict) ): if len (fileSet) < 2: continue print(name) fileList = sorted (fileSet) for filename in fileList: print(" ", filename) print()
def searchClassDefXml(srcDir): """ Searches through the requested directory looking at 'classes_def.xml' files looking for duplicate Reflex definitions.""" # compile necessary RE statements classNameRE = re.compile(r'class\s+name\s*=\s*"([^"]*)"') spacesRE = re.compile(r'\s+') stdRE = re.compile(r'std::') srcClassNameRE = re.compile(r'(\w+)/src/classes_def.xml') braketRE = re.compile(r'<.+>') # get the source directory we want if not len(srcDir): try: srcDir = getReleaseBaseDir() + '/src' except: raise RuntimeError, "$CMSSW_RELEASE_BASE not found." try: os.chdir(srcDir) except: raise RuntimeError, "'%s' is not a valid directory." % srcDir print "Searching for 'classes_def.xml' in '%s'." % srcDir xmlFiles = commands.getoutput ('find . -name "*classes_def.xml" -print').\ split ('\n') # print out the XML files, if requested if options.showXMLs: pprint.pprint(xmlFiles) # try and figure out the names of the packages xmlPackages = [] packagesREs = {} equivREs = {} if options.lostDefs: for filename in xmlFiles: if not filename: continue match = srcClassNameRE.search(filename) if not match: continue packageName = match.group(1) xmlPackages.append(packageName) matchString = r'\b' + packageName + r'\b' packagesREs[packageName] = re.compile(matchString) equivList = equivREs.setdefault(packageName, []) equivList.append((packagesREs[packageName], packageName)) for equiv in equivDict.get(packageName, []): matchString = r'\b' + equiv + r'\b' equivList.append((re.compile(matchString), equiv)) #pprint.pprint (equivREs, width=109) classDict = {} ncdict = {'class': 'className'} for filename in xmlFiles: if not filename: continue dupProblems = '' exceptName = '' regexList = [] localObjects = [] simpleObjectREs = [] if options.lostDefs: lostMatch = srcClassNameRE.search(filename) if lostMatch: exceptName = lostMatch.group(1) regexList = equivREs[exceptName] if not regexList[0][0].search(exceptName): print '%s not found in' % exceptName, print regexList[0][0] sys.exit() else: continue if options.verbose: print "filename", filename try: xmlObj = xml2obj(filename=filename, filtering=True, nameChangeDict=ncdict) except Exception as detail: print "File %s is malformed XML. Please fix." % filename print " ", detail continue try: classList = xmlObj.selection.className except: try: classList = xmlObj.className except: # this isn't a real classes_def.xml file. Skip it print "**** SKIPPING '%s' - Doesn't seem to have proper information." % filename continue for piece in classList: try: className = spacesRE.sub('', piece.name) except: # must be one of these class pattern things. Skip it #print " skipping %s" % filename, piece.__repr__() continue className = stdRE.sub('', className) # print " ", className # Now get rid of any typedefs for typedef, tdList in typedefsDict.iteritems(): for alias in tdList: className = re.sub(alias, typedef, className) classDict.setdefault(className, set()).add(filename) # should we check for lost definitions? if not options.lostDefs: continue localObjects.append(className) if options.lazyLostDefs and not braketRE.search(className): #print " ", className matchString = r'\b' + className + r'\b' simpleObjectREs.append((re.compile(matchString), className)) for className in localObjects: # if we see our name (or equivalent) here, then let's # skip complaining about this foundEquiv = False for equivRE in regexList: #print "searching %s for %s" % (equivRE[1], className) if equivRE[0].search(className): foundEquiv = True #print "Found it!" break for simpleRE in simpleObjectREs: if simpleRE[0].search(className): foundEquiv = True if options.verbose and simpleRE[1] != className: print " Using %s to ignore %s" \ % (simpleRE[1], className) break if foundEquiv: continue for packageName in xmlPackages: # don't bother looking for the name of this # package in this package if packagesREs[packageName].search(className): dupProblems += " %s : %s\n" % (packageName, className) # for piece if dupProblems: print '\n%s\n%s\n' % (filename, dupProblems) # for filename if options.dups: for name, fileSet in sorted(classDict.iteritems()): if len(fileSet) < 2: continue print name fileList = list(fileSet) fileList.sort() for filename in fileList: print " ", filename print