diff --git a/ReviewBot.py b/ReviewBot.py index 33518468..6fa3ddf8 100644 --- a/ReviewBot.py +++ b/ReviewBot.py @@ -45,6 +45,8 @@ except ImportError: from osc import conf import osc.core import urllib2 +from itertools import count + class ReviewBot(object): """ @@ -574,6 +576,50 @@ class ReviewBot(object): 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): def __init__(self, level=logging.INFO): diff --git a/check_source_in_factory.py b/check_source_in_factory.py index 9337072a..c1574b71 100755 --- a/check_source_in_factory.py +++ b/check_source_in_factory.py @@ -35,7 +35,6 @@ import osc.core import urllib2 import yaml import ReviewBot -from itertools import count 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)) for project in projects: 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: self.logger.info("{} is in {}".format(target_package, project)) return good @@ -103,48 +102,6 @@ class FactorySourceChecker(ReviewBot.ReviewBot): 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): self.logger.debug("checking requests") prjprefix = '' diff --git a/leaper.py b/leaper.py index 1d92f768..db6c8e06 100755 --- a/leaper.py +++ b/leaper.py @@ -186,7 +186,7 @@ class Leaper(ReviewBot.ReviewBot): if devel_package is None: devel_package = 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)) return True else: @@ -266,7 +266,7 @@ class Leaper(ReviewBot.ReviewBot): return True # submitted from elsewhere but is in :Update 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: self.logger.info("submission found in 15.0") return good @@ -285,7 +285,7 @@ class Leaper(ReviewBot.ReviewBot): if oldorigin.startswith('openSUSE:Factory'): # check if an attempt to switch to SLE package is made 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: self.logger.info("request sources come from SLE") self.needs_release_manager = True @@ -305,7 +305,7 @@ class Leaper(ReviewBot.ReviewBot): prj = 'openSUSE:Leap:{}:SLE-workarounds'.format(v) if self.is_package_in_project( prj, target_package): self.logger.info("found package in %s", prj) - if not self.factory._check_project(prj, + if not self._check_matching_srcmd5(prj, target_package, src_srcinfo.verifymd5): 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'): for subprj in ('', ':NonFree', ':Live'): 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: return good good = self.factory._check_requests(prj, target_package, src_srcinfo.verifymd5) @@ -424,7 +424,7 @@ class Leaper(ReviewBot.ReviewBot): return False 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: return good good = self.factory._check_requests(project, target_package, src_srcinfo.verifymd5)