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
Esempio n. 3
0
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()
Esempio n. 4
0
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