From bcaa610a672a00898bc3e0fb54af363bdc6125b8 Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Thu, 9 Jun 2016 17:30:43 +0200 Subject: [PATCH] Handle separate lookup file in :NonFree --- check_source_in_factory.py | 29 ++++++++++++----------------- leaper.py | 17 +++++++++++++++-- manager_42.py | 24 ++++++++++++++++-------- update_crawler.py | 2 -- 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/check_source_in_factory.py b/check_source_in_factory.py index a02ebb85..85f2c231 100755 --- a/check_source_in_factory.py +++ b/check_source_in_factory.py @@ -52,14 +52,12 @@ class FactorySourceChecker(ReviewBot.ReviewBot): self.factory = "openSUSE:Factory" ReviewBot.ReviewBot.__init__(self, *args, **kwargs) self.review_messages = { 'accepted' : 'ok', 'declined': 'the package needs to be accepted in Factory first' } - self.lookup = None + self.lookup = {} def parse_lookup(self, project): - self.lookup = yaml.safe_load(self._load_lookup_file(project)) + self.lookup.update(yaml.safe_load(self._load_lookup_file(project))) def _load_lookup_file(self, prj): - if prj.endswith(':NonFree'): - prj = prj[:-len(':NonFree')] return osc.core.http_GET(osc.core.makeurl(self.apiurl, ['source', prj, '00Meta', 'lookup.yml'])) @@ -71,15 +69,19 @@ class FactorySourceChecker(ReviewBot.ReviewBot): # handle here to avoid crashing on the next line self.logger.info("Could not get source info for %s/%s@%s" % (src_project, src_package, src_rev)) return False - good = self._check_factory(src_srcinfo.verifymd5, target_package) + project = self._package_get_upstream_project(target_package) + if project is None: + self.logger.error("no upstream project found for {}, can't check".format(package)) + return False + good = self._check_project(project, target_package, src_srcinfo.verifymd5) if good: - self.logger.info("%s is in Factory"%target_package) + self.logger.info("{} is in {}".format(target_package, project)) return good - good = self._check_requests(src_srcinfo.verifymd5, target_package) + good = self._check_requests(project, target_package, src_srcinfo.verifymd5) if good: - self.logger.info("%s already reviewed for Factory"%target_package) + self.logger.info("{} already reviewed for {}".format(target_package, project)) return good @@ -91,11 +93,8 @@ class FactorySourceChecker(ReviewBot.ReviewBot): return self.factory - def _check_factory(self, rev, package): + def _check_project(self, project, package, rev): """check if factory sources contain the package and revision. check head and history""" - project = self._package_get_upstream_project(package) - if project is None: - return False self.logger.debug("checking %s in %s"%(package, project)) try: si = osc.core.show_package_meta(self.apiurl, project, package) @@ -131,13 +130,9 @@ class FactorySourceChecker(ReviewBot.ReviewBot): self.logger.debug("srcmd5 not found in history either") return False - def _check_requests(self, rev, package): + def _check_requests(self, project, package, rev): self.logger.debug("checking requests") try: - project = self._package_get_upstream_project(package) - if project is None: - self.logger.error("no upstream project found for {}, can't check requests".format(package)) - return None requests = osc.core.get_request_list(self.apiurl, project, package, None, ['new', 'review'], 'submit') except (urllib2.HTTPError, urllib2.URLError): self.logger.debug("none request") diff --git a/leaper.py b/leaper.py index ba8bc189..1b1e78a3 100755 --- a/leaper.py +++ b/leaper.py @@ -45,11 +45,16 @@ class Leaper(ReviewBot.ReviewBot): ReviewBot.ReviewBot.__init__(self, *args, **kwargs) self.maintbot = MaintenanceChecker(*args, **kwargs) # for FactorySourceChecker + self.lookup_checker = FactorySourceChecker(*args, **kwargs) + self.lookup_checker.parse_lookup('openSUSE:Leap:42.2') + self.lookup_checker.parse_lookup('openSUSE:Leap:42.2:NonFree') self.factory = FactorySourceChecker(*args, **kwargs) - self.factory.parse_lookup('openSUSE:Leap:42.2') + # XXX: FactorySourceChecker should be able to handle that itself + self.factory_nonfree = FactorySourceChecker(*args, **kwargs) + self.factory_nonfree.factory = 'openSUSE:Factory:NonFree' def check_source_submission(self, src_project, src_package, src_rev, target_project, target_package): - return self.factory.check_source_submission(src_project, src_package, src_rev, target_project, target_package) + return self.lookup_checker.check_source_submission(src_project, src_package, src_rev, target_project, target_package) def check_one_request(self, req): self.review_messages = self.DEFAULT_REVIEW_MESSAGES.copy() @@ -77,6 +82,14 @@ class Leaper(ReviewBot.ReviewBot): if has_upstream_sources != True or has_correct_maintainer != True: if has_upstream_sources != True: self.review_messages['declined'] += '\nOrigin project changed' + pkg = req.actions[0].tgt_package + prj = self.lookup_checker._package_get_upstream_project(pkg) + if prj: + self.review_messages['declined'] += '(was {})'.format(prj) + if self.factory.check_one_request(req): + self.review_messages['declined'] += '\nsource is in Factory though' + elif self.factory_nonfree.check_one_request(req): + self.review_messages['declined'] += '\nsource is in Factory:NonFree though' # shouldn't happen actually if has_correct_maintainer != True: self.review_messages['declined'] += '\nMaintainer check failed' diff --git a/manager_42.py b/manager_42.py index 02416c8d..f0b5c38d 100755 --- a/manager_42.py +++ b/manager_42.py @@ -59,11 +59,14 @@ class Manager42(object): 'SUSE:SLE-12:GA', 'openSUSE:Leap:42.1:Update', 'openSUSE:Leap:42.1', + 'openSUSE:Leap:42.1:NonFree:Update', + 'openSUSE:Leap:42.1:NonFree', 'openSUSE:Factory', + 'openSUSE:Factory:NonFree', 'openSUSE:Leap:42.2:SLE-workarounds' ] - self.parse_lookup() + self.parse_lookup(self.from_prj) self.fill_package_meta() self.packages = dict() for project in [self.from_prj] + self.project_preference_order: @@ -80,24 +83,29 @@ class Manager42(object): packages.add(title[3:].split(' ')[0]) return sorted(packages) - def parse_lookup(self): - self.lookup = yaml.safe_load(self._load_lookup_file()) + def parse_lookup(self, project): self.lookup_changes = 0 + self.lookup = {} + try: + self.lookup = yaml.safe_load(self._load_lookup_file(project)) + except urllib2.HTTPError, e: + if e.code != 404: + raise - def _load_lookup_file(self): + def _load_lookup_file(self, prj): return self.cached_GET(makeurl(self.apiurl, - ['source', self.from_prj, '00Meta', 'lookup.yml'])) + ['source', prj, '00Meta', 'lookup.yml'])) - def _put_lookup_file(self, data): + def _put_lookup_file(self, prj, data): return http_PUT(makeurl(self.apiurl, - ['source', self.from_prj, '00Meta', 'lookup.yml']), data=data) + ['source', prj, '00Meta', 'lookup.yml']), data=data) def store_lookup(self): if self.lookup_changes == 0: logger.info('no change to lookup.yml') return data = yaml.dump(self.lookup, default_flow_style=False, explicit_start=True) - self._put_lookup_file(data) + self._put_lookup_file(self.from_prj, data) self.lookup_changes = 0 @memoize() diff --git a/update_crawler.py b/update_crawler.py index a68183ed..bbbe017f 100755 --- a/update_crawler.py +++ b/update_crawler.py @@ -199,8 +199,6 @@ class UpdateCrawler(object): def _load_lookup_file(self): prj = self.to_prj - if prj.endswith(':NonFree'): - prj = prj[:-len(':NonFree')] return self.cached_GET(makeurl(self.apiurl, ['source', prj, '00Meta', 'lookup.yml']))