core: extract maintainers_get(), owner_fallback() from MaintenanceChecker.

Allows the code to be properly shared between checkrepo and
check_maintenance_incidents as a todo suggests. Given that the majority of
similar cases for code sharing are extension of osc.core it seems to make
sense to place them in osclib.core.
This commit is contained in:
Jimmy Berry 2017-05-11 23:31:27 -05:00
parent ad81ff98f9
commit 7c6f67979a
3 changed files with 28 additions and 33 deletions

View File

@ -36,6 +36,8 @@ import urllib2
import yaml
from osclib.memoize import memoize
from osclib.core import owner_fallback
from osclib.core import maintainers_get
import ReviewBot
@ -47,32 +49,11 @@ class MaintenanceChecker(ReviewBot.ReviewBot):
ReviewBot.ReviewBot.__init__(self, *args, **kwargs)
self.review_messages = {}
@memoize(session=True)
def owner_fallback(self, project, package):
root = osc.core.owner(self.apiurl, package, project=project)
owner = root.find('owner')
if not owner or owner.get('project') == project:
# Fallback to global (ex Factory) maintainer.
root = osc.core.owner(self.apiurl, package)
return root
# XXX: share with checkrepo
def _maintainers(self, project, package):
"""Get the maintainer of the package involved in the package."""
root = self.owner_fallback(project, package)
maintainers = [p.get('name') for p in root.findall('.//person') if p.get('role') == 'maintainer']
if not maintainers:
for group in [p.get('name') for p in root.findall('.//group') if p.get('role') == 'maintainer']:
url = osc.core.makeurl(self.apiurl, ('group', group))
root = ET.parse(osc.core.http_GET(url)).getroot()
maintainers = maintainers + [p.get('userid') for p in root.findall('./person/person')]
return maintainers
def add_devel_project_review(self, req, package):
""" add devel project/package as reviewer """
a = req.actions[0]
project = a.tgt_releaseproject if a.type == 'maintenance_incident' else req.actions[0].tgt_project
root = self.owner_fallback(project, package)
root = owner_fallback(self.apiurl, project, package)
package_reviews = set((r.by_project, r.by_package) for r in req.reviews if r.by_project)
for p in root.findall('./owner'):
@ -133,7 +114,7 @@ class MaintenanceChecker(ReviewBot.ReviewBot):
self.logger.info("{} submitted from {}, no maintainer review needed".format(pkgname, a.src_project))
return
maintainers = set(self._maintainers(project, pkgname))
maintainers = set(maintainers_get(self.apiurl, project, pkgname))
if maintainers:
known_maintainer = False
for m in maintainers:

View File

@ -28,6 +28,7 @@ from osc.core import http_DELETE
from osc.core import http_GET
from osc.core import http_POST
from osc.core import makeurl
from osclib.core import maintainers_get
from osclib.stagingapi import StagingAPI
from osclib.memoize import memoize
from osclib.pkgcache import PkgCache
@ -965,15 +966,6 @@ class CheckRepo(object):
deps.update(pkgdep.text for pkgdep in root.findall('.//pkgdep'))
return deps
def _maintainers(self, request):
"""Get the maintainer of the package involved in the request."""
query = {
'binary': request.tgt_package,
}
url = makeurl(self.apiurl, ('search', 'owner'), query=query)
root = ET.parse(http_GET(url)).getroot()
return [p.get('name') for p in root.findall('.//person') if p.get('role') == 'maintainer']
def _author(self, request):
"""Get the author of the request."""
query = {
@ -1009,7 +1001,7 @@ class CheckRepo(object):
"""
reasons = []
whatdependson = self._whatdependson(request)
maintainers = self._maintainers(request)
maintainers = maintainers_get(self.apiurl, request.tgt_project, request.tgt_package)
author = self._author(request)
prj_maintainers = self._project_maintainer(request)

View File

@ -1,11 +1,33 @@
from xml.etree import cElementTree as ET
import osc.core
from osc.core import http_GET
from osc.core import makeurl
from osc.core import show_project_meta
from osclib.memoize import memoize
@memoize(session=True)
def owner_fallback(apiurl, project, package):
root = osc.core.owner(apiurl, package, project=project)
owner = root.find('owner')
if not owner or owner.get('project') == project:
# Fallback to global (ex Factory) maintainer.
root = osc.core.owner(apiurl, package)
return root
def maintainers_get(apiurl, project, package):
"""Get the maintainer of the package involved in the package."""
root = owner_fallback(apiurl, project, package)
maintainers = [p.get('name') for p in root.findall('.//person') if p.get('role') == 'maintainer']
if not maintainers:
for group in [p.get('name') for p in root.findall('.//group') if p.get('role') == 'maintainer']:
url = makeurl(apiurl, ('group', group))
root = ET.parse(http_GET(url)).getroot()
maintainers = maintainers + [p.get('userid') for p in root.findall('./person/person')]
return maintainers
@memoize(session=True)
def package_list(apiurl, project):
url = makeurl(apiurl, ['source', project], { 'expand': 1 })