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 import yaml
from osclib.memoize import memoize from osclib.memoize import memoize
from osclib.core import owner_fallback
from osclib.core import maintainers_get
import ReviewBot import ReviewBot
@ -47,32 +49,11 @@ class MaintenanceChecker(ReviewBot.ReviewBot):
ReviewBot.ReviewBot.__init__(self, *args, **kwargs) ReviewBot.ReviewBot.__init__(self, *args, **kwargs)
self.review_messages = {} 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): def add_devel_project_review(self, req, package):
""" add devel project/package as reviewer """ """ add devel project/package as reviewer """
a = req.actions[0] a = req.actions[0]
project = a.tgt_releaseproject if a.type == 'maintenance_incident' else req.actions[0].tgt_project 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) package_reviews = set((r.by_project, r.by_package) for r in req.reviews if r.by_project)
for p in root.findall('./owner'): 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)) self.logger.info("{} submitted from {}, no maintainer review needed".format(pkgname, a.src_project))
return return
maintainers = set(self._maintainers(project, pkgname)) maintainers = set(maintainers_get(self.apiurl, project, pkgname))
if maintainers: if maintainers:
known_maintainer = False known_maintainer = False
for m in maintainers: 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_GET
from osc.core import http_POST from osc.core import http_POST
from osc.core import makeurl from osc.core import makeurl
from osclib.core import maintainers_get
from osclib.stagingapi import StagingAPI from osclib.stagingapi import StagingAPI
from osclib.memoize import memoize from osclib.memoize import memoize
from osclib.pkgcache import PkgCache from osclib.pkgcache import PkgCache
@ -965,15 +966,6 @@ class CheckRepo(object):
deps.update(pkgdep.text for pkgdep in root.findall('.//pkgdep')) deps.update(pkgdep.text for pkgdep in root.findall('.//pkgdep'))
return deps 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): def _author(self, request):
"""Get the author of the request.""" """Get the author of the request."""
query = { query = {
@ -1009,7 +1001,7 @@ class CheckRepo(object):
""" """
reasons = [] reasons = []
whatdependson = self._whatdependson(request) whatdependson = self._whatdependson(request)
maintainers = self._maintainers(request) maintainers = maintainers_get(self.apiurl, request.tgt_project, request.tgt_package)
author = self._author(request) author = self._author(request)
prj_maintainers = self._project_maintainer(request) prj_maintainers = self._project_maintainer(request)

View File

@ -1,11 +1,33 @@
from xml.etree import cElementTree as ET from xml.etree import cElementTree as ET
import osc.core
from osc.core import http_GET from osc.core import http_GET
from osc.core import makeurl from osc.core import makeurl
from osc.core import show_project_meta from osc.core import show_project_meta
from osclib.memoize import memoize 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) @memoize(session=True)
def package_list(apiurl, project): def package_list(apiurl, project):
url = makeurl(apiurl, ['source', project], { 'expand': 1 }) url = makeurl(apiurl, ['source', project], { 'expand': 1 })