def formatInfo(self, trove): """ returns iterator of format lines about this local trove """ # TODO: it'd be nice if this were set up to do arbitrary # formats... n, v, f = trove.getName(), trove.getVersion(), trove.getFlavor() dcfg = self.dcfg troveSource = dcfg.getTroveSource() sourceName = trove.getSourceName() sourceTrove = None if sourceName: try: sourceVer = v.getSourceVersion() if sourceVer.isOnLocalHost(): sourceVer = sourceVer.parentVersion() sourceTrove = troveSource.getTrove( sourceName, sourceVer, deps.Flavor(), withFiles = False) # FIXME: all trove sources should return TroveMissing # on failed getTrove calls except errors.TroveMissing: pass except errors.InsufficientPermission: pass elif n.endswith(':source'): sourceTrove = trove if trove.getBuildTime(): buildTime = time.strftime("%c", time.localtime(trove.getBuildTime())) else: buildTime = "(unknown)" if trove.getSize() is not None: size = "%s" % trove.getSize() else: size = "(unknown)" yield "%-30s %s" % \ (("Name : %s" % trove.getName(), ("Build time: %s" % buildTime))) if dcfg.fullVersions: yield "Version : %s" %v yield "Label : %s" % v.branch().label().asString() else: yield "%-30s %s" % \ (("Version : %s" % v.trailingRevision().asString()), ("Label : %s" % v.branch().label().asString())) yield '%-30s' % ("Size : %s" % size) if hasattr(troveSource, 'trovesArePinned'): yield "Pinned : %s" % troveSource.trovesArePinned( [ (n, v, f) ])[0] commitTime = v.trailingRevision().timeStamp if commitTime: commitTime = time.strftime("%c", time.localtime(commitTime)) else: commitTime = '(unknown)' if not trove.getBuildTime() or log.getVerbosity() <= log.DEBUG: yield "Committed : " + commitTime yield "%-30s" % ("Flavor : %s" % deps.formatFlavor(f)) if trove.getInstallTime(): yield 'Installed : %s' % (time.strftime("%c", time.localtime(trove.getInstallTime()))) imageGroup = trove.troveInfo.imageGroup() if imageGroup is not None: yield 'Image Group: %s' % bool(imageGroup) for ln in self.formatMetadata(trove): yield ln if sourceTrove: if not n.endswith(':source'): yield 'Source : %s' % trove.getSourceName() cl = sourceTrove.getChangeLog() if cl: yield "Change log: %s (%s)" % (cl.getName(), cl.getContact()) lines = cl.getMessage().split("\n")[:-1] for l in lines: yield " " + l if log.getVerbosity() <= log.DEBUG: yield "%-30s %s" % (("Incomp. : %s" % bool(trove.troveInfo.incomplete())), ("TroveVer : %s" % trove.troveInfo.troveVersion())) yield "%-30s" % (("Clone of : %s" % trove.troveInfo.clonedFrom())) subPackages = set(trove.troveInfo.subPackages()) subPackages.discard(trove.getName()) if subPackages: yield "%-30s" % (("Siblings : %s" % (' '.join(sorted(subPackages))))) yield "%-30s" % (("Conary version : %s" % trove.troveInfo.conaryVersion()))
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 formatInfo(self, trove): """ returns iterator of format lines about this local trove """ # TODO: it'd be nice if this were set up to do arbitrary # formats... n, v, f = trove.getName(), trove.getVersion(), trove.getFlavor() dcfg = self.dcfg troveSource = dcfg.getTroveSource() sourceName = trove.getSourceName() sourceTrove = None if sourceName: try: sourceVer = v.getSourceVersion() if sourceVer.isOnLocalHost(): sourceVer = sourceVer.parentVersion() sourceTrove = troveSource.getTrove(sourceName, sourceVer, deps.Flavor(), withFiles=False) # FIXME: all trove sources should return TroveMissing # on failed getTrove calls except errors.TroveMissing: pass except errors.InsufficientPermission: pass elif n.endswith(':source'): sourceTrove = trove if trove.getBuildTime(): buildTime = time.strftime("%c", time.localtime(trove.getBuildTime())) else: buildTime = "(unknown)" if trove.getSize() is not None: size = "%s" % trove.getSize() else: size = "(unknown)" yield "%-30s %s" % \ (("Name : %s" % trove.getName(), ("Build time: %s" % buildTime))) if dcfg.fullVersions: yield "Version : %s" % v yield "Label : %s" % v.branch().label().asString() else: yield "%-30s %s" % \ (("Version : %s" % v.trailingRevision().asString()), ("Label : %s" % v.branch().label().asString())) yield '%-30s' % ("Size : %s" % size) if hasattr(troveSource, 'trovesArePinned'): yield "Pinned : %s" % troveSource.trovesArePinned([(n, v, f) ])[0] yield "%-30s" % ("Flavor : %s" % deps.formatFlavor(f)) if trove.getInstallTime(): yield 'Installed : %s' % (time.strftime( "%c", time.localtime(trove.getInstallTime()))) imageGroup = trove.troveInfo.imageGroup() if imageGroup is not None: yield 'Image Group: %s' % bool(imageGroup) for ln in self.formatMetadata(trove): yield ln if sourceTrove: if not n.endswith(':source'): yield 'Source : %s' % trove.getSourceName() cl = sourceTrove.getChangeLog() if cl: yield "Change log: %s (%s)" % (cl.getName(), cl.getContact()) lines = cl.getMessage().split("\n")[:-1] for l in lines: yield " " + l if log.getVerbosity() <= log.DEBUG: yield "%-30s %s" % ( ("Incomp. : %s" % bool(trove.troveInfo.incomplete())), ("TroveVer : %s" % trove.troveInfo.troveVersion())) yield "%-30s" % (("Clone of : %s" % trove.troveInfo.clonedFrom())) yield "%-30s" % ( ("Conary version : %s" % trove.troveInfo.conaryVersion()))
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