Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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