def formatTroveHeader(self, trove, n, v, f, flags, indent): """ Print information about this trove """ dcfg = self.dcfg if dcfg.printSimpleHeader(): ln = self.formatNVF(n, v, f, indent) if dcfg.showTroveFlags: fmtFlags = [] if not flags & TROVE_HASTROVE: fmtFlags.append('Missing') if not flags & TROVE_BYDEFAULT: fmtFlags.append('NotByDefault') if not flags & TROVE_STRONGREF: fmtFlags.append('Weak') if trove and trove.isRedirect(): redirectFlags = [] for rName, rBranch, rFlavor in trove.iterRedirects(): if rFlavor is None: flag = 'Redirect -> %s=%s' % (rName, rBranch) else: flag = 'Redirect -> %s=%s[%s]' % (rName, rBranch, rFlavor) redirectFlags.append(flag) if not redirectFlags: redirectFlags.append('Redirect -> Nothing') fmtFlags.extend(redirectFlags) if trove and trove.isRemoved(): fmtFlags.append('Removed') if fmtFlags: ln += ' [%s]' % ','.join(fmtFlags) yield ln indent += 1 else: indent = 0 if not trove: # don't bother trying to print extra info for non-existant # troves (they might have had flag info printed though) return if dcfg.printInfo(): for line in self.formatInfo(trove): yield line if dcfg.printDigSigs(): for line in self.formatDigSigs(trove, indent): yield line if dcfg.printBuildReqs(): for buildReq in sorted(trove.getBuildRequirements(), key=lambda x:x[0]): yield ' ' * (indent) + self.formatNVF(*buildReq) elif dcfg.printDeps(): for line in self.formatDeps(trove.getProvides(), trove.getRequires(), indent=indent): yield line
def formatTroveHeader(self, trove, n, v, f, flags, indent): """ Print information about this trove """ dcfg = self.dcfg if dcfg.printSimpleHeader(): ln = self.formatNVF(n, v, f, indent) if dcfg.showTroveFlags: fmtFlags = [] if not flags & TROVE_HASTROVE: fmtFlags.append('Missing') if not flags & TROVE_BYDEFAULT: fmtFlags.append('NotByDefault') if not flags & TROVE_STRONGREF: fmtFlags.append('Weak') if trove and trove.isRedirect(): redirectFlags = [] for rName, rBranch, rFlavor in trove.iterRedirects(): if rFlavor is None: flag = 'Redirect -> %s=%s' % (rName, rBranch) else: flag = 'Redirect -> %s=%s[%s]' % (rName, rBranch, rFlavor) redirectFlags.append(flag) if not redirectFlags: redirectFlags.append('Redirect -> Nothing') fmtFlags.extend(redirectFlags) if trove and trove.isRemoved(): fmtFlags.append('Removed') if fmtFlags: ln += ' [%s]' % ','.join(fmtFlags) yield ln indent += 1 else: indent = 0 if not trove: # don't bother trying to print extra info for non-existant # troves (they might have had flag info printed though) return if dcfg.printInfo(): for line in self.formatInfo(trove): yield line if dcfg.printDigSigs(): for line in self.formatDigSigs(trove, indent): yield line if dcfg.printBuildReqs(): for buildReq in sorted(trove.getBuildRequirements(), key=lambda x: x[0]): yield ' ' * (indent) + self.formatNVF(*buildReq) elif dcfg.printDeps(): for line in self.formatDeps(trove.getProvides(), trove.getRequires(), indent=indent): yield line
def mineLabel(self, labelText, jiraProject): print 'Looking at %s product...' %jiraProject sourceMap = {} sourceOwner = {} label = versions.Label(labelText) repoPkgs = frozenset([ x for x in self.repos.troveNames(label) if ':' not in x and not (x.startswith('cross-') or x.startswith('bootstrap-') or trove.troveIsGroup(x)) ]) cu = self.db.cursor() cu.execute("""SELECT component.cname FROM component, project WHERE component.project = project.id AND project.pname = %s""", jiraProject) jiraPkgs = frozenset([r[0] for r in cu.fetchall()]) newPkgs = sorted(list(repoPkgs-jiraPkgs)) troveVersions = self.repos.getTroveLeavesByLabel( dict.fromkeys(newPkgs, {label: None})) for troveName in newPkgs: self.log('checking binary package ' + troveName) # need latest version troveVersion = sorted(troveVersions[troveName].keys())[-1] # we only need one flavor, any flavor, to get the sourceName troveFlavor = troveVersions[troveName][troveVersion][0] trove = self.repos.getTrove(troveName, troveVersion, troveFlavor, withFiles=False) if trove.isRedirect(): # We do not want to modify jira automatically when we # see a redirect, because the redirect may not apply to # all versions, and we might really want to keep existing # versions the same. self.log(' ...ignoring redirected trove ' + troveName) continue sourceName = trove.getSourceName() if not sourceName: # old package from before troveinfo continue sourceNick = sourceName.split(':')[0] if sourceNick in jiraPkgs: # database doesn't like double-adds self.log(' ...source trove %s already in jira' %sourceNick) continue if sourceNick in sourceMap: sourceMap[sourceNick][trove.getName()] = True # only investigate each source trove once self.log(' ...already checked source trove ' + sourceNick) continue sourceMap[sourceNick] = {trove.getName(): True} sourceVerList = self.repos.getTroveVersionsByLabel( {sourceName: {label : None} }) sourceVerList = sorted(sourceVerList[sourceName].keys()) l = [] for sourceVer in sourceVerList: l.extend(((sourceName, sourceVer, deps.Flavor()),)) sourceTroves = self.repos.getTroves(l) personMap = {} firstPerson = None for sourceTrove in sourceTroves: cl = sourceTrove.getChangeLog() person = self.getPerson(cl.getName(), labelText) if not firstPerson: firstPerson = person if person in personMap: personMap[person] += 1 else: personMap[person] = 1 if firstPerson: # original committer is more likely to be the responsible party personMap[firstPerson] += 3 candidate = sorted(personMap.items(), key=lambda x: x[1])[-1][0] if not candidate: print "No best owner recognized for %s" %sourceNick continue sourceOwner[sourceNick] = candidate print " Best owner for source %s is %s" %( sourceNick, sourceOwner[sourceNick]) self.sourceMap[jiraProject] = sourceMap self.sourceOwner[jiraProject] = sourceOwner
def mineLabel(self, labelText, jiraProject): print 'Looking at %s product...' % jiraProject sourceMap = {} sourceOwner = {} label = versions.Label(labelText) repoPkgs = frozenset([ x for x in self.repos.troveNames(label) if ':' not in x and not (x.startswith('cross-') or x.startswith( 'bootstrap-') or trove.troveIsGroup(x)) ]) cu = self.db.cursor() cu.execute( """SELECT component.cname FROM component, project WHERE component.project = project.id AND project.pname = %s""", jiraProject) jiraPkgs = frozenset([r[0] for r in cu.fetchall()]) newPkgs = sorted(list(repoPkgs - jiraPkgs)) troveVersions = self.repos.getTroveLeavesByLabel( dict.fromkeys(newPkgs, {label: None})) for troveName in newPkgs: self.log('checking binary package ' + troveName) # need latest version troveVersion = sorted(troveVersions[troveName].keys())[-1] # we only need one flavor, any flavor, to get the sourceName troveFlavor = troveVersions[troveName][troveVersion][0] trove = self.repos.getTrove(troveName, troveVersion, troveFlavor, withFiles=False) if trove.isRedirect(): # We do not want to modify jira automatically when we # see a redirect, because the redirect may not apply to # all versions, and we might really want to keep existing # versions the same. self.log(' ...ignoring redirected trove ' + troveName) continue sourceName = trove.getSourceName() if not sourceName: # old package from before troveinfo continue sourceNick = sourceName.split(':')[0] if sourceNick in jiraPkgs: # database doesn't like double-adds self.log(' ...source trove %s already in jira' % sourceNick) continue if sourceNick in sourceMap: sourceMap[sourceNick][trove.getName()] = True # only investigate each source trove once self.log(' ...already checked source trove ' + sourceNick) continue sourceMap[sourceNick] = {trove.getName(): True} sourceVerList = self.repos.getTroveVersionsByLabel( {sourceName: { label: None }}) sourceVerList = sorted(sourceVerList[sourceName].keys()) l = [] for sourceVer in sourceVerList: l.extend(((sourceName, sourceVer, deps.Flavor()), )) sourceTroves = self.repos.getTroves(l) personMap = {} firstPerson = None for sourceTrove in sourceTroves: cl = sourceTrove.getChangeLog() person = self.getPerson(cl.getName(), labelText) if not firstPerson: firstPerson = person if person in personMap: personMap[person] += 1 else: personMap[person] = 1 if firstPerson: # original committer is more likely to be the responsible party personMap[firstPerson] += 3 candidate = sorted(personMap.items(), key=lambda x: x[1])[-1][0] if not candidate: print "No best owner recognized for %s" % sourceNick continue sourceOwner[sourceNick] = candidate print " Best owner for source %s is %s" % (sourceNick, sourceOwner[sourceNick]) self.sourceMap[jiraProject] = sourceMap self.sourceOwner[jiraProject] = sourceOwner