Refactor _check_project into ReviewBot

This commit is contained in:
Ludwig Nussel 2018-05-30 13:55:38 +02:00
parent 432237a2a8
commit a471c0b9e8
3 changed files with 53 additions and 50 deletions

View File

@ -45,6 +45,8 @@ except ImportError:
from osc import conf from osc import conf
import osc.core import osc.core
import urllib2 import urllib2
from itertools import count
class ReviewBot(object): class ReviewBot(object):
""" """
@ -574,6 +576,50 @@ class ReviewBot(object):
self.comment_handler_remove() self.comment_handler_remove()
def _check_matching_srcmd5(self, project, package, rev, history_limit = 5):
"""check if factory sources contain the package and revision. check head and history"""
self.logger.debug("checking %s in %s"%(package, project))
try:
si = osc.core.show_package_meta(self.apiurl, project, package)
except (urllib2.HTTPError, urllib2.URLError):
si = None
if si is None:
self.logger.debug("new package")
return None
else:
si = self.get_sourceinfo(project, package)
if rev == si.verifymd5:
self.logger.debug("srcmd5 matches")
return True
if history_limit:
self.logger.debug("%s not the latest version, checking history", rev)
u = osc.core.makeurl(self.apiurl, [ 'source', project, package, '_history' ], { 'limit': history_limit })
try:
r = osc.core.http_GET(u)
except urllib2.HTTPError as e:
self.logger.debug("package has no history!?")
return None
root = ET.parse(r).getroot()
# we need this complicated construct as obs doesn't honor
# the 'limit' parameter use above for obs interconnect:
# https://github.com/openSUSE/open-build-service/issues/2545
for revision, i in zip(reversed(root.findall('revision')), count()):
node = revision.find('srcmd5')
if node is None:
continue
self.logger.debug("checking %s"%node.text)
if node.text == rev:
self.logger.debug("got it, rev %s"%revision.get('rev'))
return True
if i == history_limit:
break
self.logger.debug("srcmd5 not found in history either")
return False
class CommentFromLogHandler(logging.Handler): class CommentFromLogHandler(logging.Handler):
def __init__(self, level=logging.INFO): def __init__(self, level=logging.INFO):

View File

@ -35,7 +35,6 @@ import osc.core
import urllib2 import urllib2
import yaml import yaml
import ReviewBot import ReviewBot
from itertools import count
class FactorySourceChecker(ReviewBot.ReviewBot): class FactorySourceChecker(ReviewBot.ReviewBot):
@ -77,7 +76,7 @@ class FactorySourceChecker(ReviewBot.ReviewBot):
self.review_messages['declined'] = 'the package needs to be accepted in {} first'.format(' or '.join(projects)) self.review_messages['declined'] = 'the package needs to be accepted in {} first'.format(' or '.join(projects))
for project in projects: for project in projects:
self.logger.info("Checking in project %s" % project) self.logger.info("Checking in project %s" % project)
good = self._check_project(project, target_package, src_srcinfo.verifymd5) good = self._check_matching_srcmd5(project, target_package, src_srcinfo.verifymd5, self.history_limit)
if good: if good:
self.logger.info("{} is in {}".format(target_package, project)) self.logger.info("{} is in {}".format(target_package, project))
return good return good
@ -103,48 +102,6 @@ class FactorySourceChecker(ReviewBot.ReviewBot):
return projects return projects
def _check_project(self, project, package, rev):
"""check if factory sources contain the package and revision. check head and history"""
self.logger.debug("checking %s in %s"%(package, project))
try:
si = osc.core.show_package_meta(self.apiurl, project, package)
except (urllib2.HTTPError, urllib2.URLError):
si = None
if si is None:
self.logger.debug("new package")
return None
else:
si = self.get_sourceinfo(project, package)
if rev == si.verifymd5:
self.logger.debug("srcmd5 matches")
return True
self.logger.debug("%s not the latest version, checking history", rev)
u = osc.core.makeurl(self.apiurl, [ 'source', project, package, '_history' ], { 'limit': self.history_limit })
try:
r = osc.core.http_GET(u)
except urllib2.HTTPError as e:
self.logger.debug("package has no history!?")
return None
root = ET.parse(r).getroot()
# we need this complicated construct as obs doesn't honor
# the 'limit' parameter use above for obs interconnect:
# https://github.com/openSUSE/open-build-service/issues/2545
for revision, i in zip(reversed(root.findall('revision')), count()):
node = revision.find('srcmd5')
if node is None:
continue
self.logger.debug("checking %s"%node.text)
if node.text == rev:
self.logger.debug("got it, rev %s"%revision.get('rev'))
return True
if i == self.history_limit:
break
self.logger.debug("srcmd5 not found in history either")
return False
def _check_requests(self, project, package, rev): def _check_requests(self, project, package, rev):
self.logger.debug("checking requests") self.logger.debug("checking requests")
prjprefix = '' prjprefix = ''

View File

@ -186,7 +186,7 @@ class Leaper(ReviewBot.ReviewBot):
if devel_package is None: if devel_package is None:
devel_package = package devel_package = package
if self.is_package_in_project(devel_project, devel_package): if self.is_package_in_project(devel_project, devel_package):
if self.factory._check_project(devel_project, devel_package, src_srcinfo.verifymd5) == True: if self._check_matching_srcmd5(devel_project, devel_package, src_srcinfo.verifymd5) == True:
self.logger.info('matching sources in {}/{}'.format(devel_project, devel_package)) self.logger.info('matching sources in {}/{}'.format(devel_project, devel_package))
return True return True
else: else:
@ -266,7 +266,7 @@ class Leaper(ReviewBot.ReviewBot):
return True return True
# submitted from elsewhere but is in :Update # submitted from elsewhere but is in :Update
else: else:
good = self.factory._check_project('openSUSE:Leap:15.0:Update', target_package, src_srcinfo.verifymd5) good = self._check_matching_srcmd5('openSUSE:Leap:15.0:Update', target_package, src_srcinfo.verifymd5)
if good: if good:
self.logger.info("submission found in 15.0") self.logger.info("submission found in 15.0")
return good return good
@ -285,7 +285,7 @@ class Leaper(ReviewBot.ReviewBot):
if oldorigin.startswith('openSUSE:Factory'): if oldorigin.startswith('openSUSE:Factory'):
# check if an attempt to switch to SLE package is made # check if an attempt to switch to SLE package is made
for sp in ('SP1:GA', 'SP1:Update'): for sp in ('SP1:GA', 'SP1:Update'):
good = self.factory._check_project('SUSE:SLE-15-{}'.format(sp), target_package, src_srcinfo.verifymd5) good = self._check_matching_srcmd5('SUSE:SLE-15-{}'.format(sp), target_package, src_srcinfo.verifymd5)
if good: if good:
self.logger.info("request sources come from SLE") self.logger.info("request sources come from SLE")
self.needs_release_manager = True self.needs_release_manager = True
@ -305,7 +305,7 @@ class Leaper(ReviewBot.ReviewBot):
prj = 'openSUSE:Leap:{}:SLE-workarounds'.format(v) prj = 'openSUSE:Leap:{}:SLE-workarounds'.format(v)
if self.is_package_in_project( prj, target_package): if self.is_package_in_project( prj, target_package):
self.logger.info("found package in %s", prj) self.logger.info("found package in %s", prj)
if not self.factory._check_project(prj, if not self._check_matching_srcmd5(prj,
target_package, target_package,
src_srcinfo.verifymd5): src_srcinfo.verifymd5):
self.logger.info("sources in %s are NOT identical", self.logger.info("sources in %s are NOT identical",
@ -413,7 +413,7 @@ class Leaper(ReviewBot.ReviewBot):
def _check_factory(self, target_package, src_srcinfo, target_project='openSUSE:Factory'): def _check_factory(self, target_package, src_srcinfo, target_project='openSUSE:Factory'):
for subprj in ('', ':NonFree', ':Live'): for subprj in ('', ':NonFree', ':Live'):
prj = ''.join((target_project, subprj)) prj = ''.join((target_project, subprj))
good = self.factory._check_project(prj, target_package, src_srcinfo.verifymd5) good = self._check_matching_srcmd5(prj, target_package, src_srcinfo.verifymd5)
if good: if good:
return good return good
good = self.factory._check_requests(prj, target_package, src_srcinfo.verifymd5) good = self.factory._check_requests(prj, target_package, src_srcinfo.verifymd5)
@ -424,7 +424,7 @@ class Leaper(ReviewBot.ReviewBot):
return False return False
def _check_project_and_request(self, project, target_package, src_srcinfo): def _check_project_and_request(self, project, target_package, src_srcinfo):
good = self.factory._check_project(project, target_package, src_srcinfo.verifymd5) good = self._check_matching_srcmd5(project, target_package, src_srcinfo.verifymd5)
if good: if good:
return good return good
good = self.factory._check_requests(project, target_package, src_srcinfo.verifymd5) good = self.factory._check_requests(project, target_package, src_srcinfo.verifymd5)