From 32d0a312c5e2b3e3f2d3ae770b7dae63717bccb2 Mon Sep 17 00:00:00 2001 From: Jimmy Berry Date: Fri, 15 Feb 2019 10:55:39 -0600 Subject: [PATCH] origin-manager: provide ReviewBot utilizing osclib.origin. --- origin-manager.py | 99 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100755 origin-manager.py diff --git a/origin-manager.py b/origin-manager.py new file mode 100755 index 00000000..442b488c --- /dev/null +++ b/origin-manager.py @@ -0,0 +1,99 @@ +#!/usr/bin/python + +from osclib.core import package_source_hash +from osclib.origin import origin_annotation_dump +from osclib.origin import config_load +from osclib.origin import origin_find +from osclib.origin import policy_evaluate +import ReviewBot +import sys + + +class OriginManager(ReviewBot.ReviewBot): + def __init__(self, *args, **kwargs): + ReviewBot.ReviewBot.__init__(self, *args, **kwargs) + + # ReviewBot options. + self.request_default_return = True + # No such thing as override, only changing origin which must be approved + # by fallback group. Annotation must be included in review. + self.override_allow = False + + def check_source_submission(self, src_project, src_package, src_rev, tgt_project, tgt_package): + if not self.config_validate(tgt_project): + return False + + source_hash_new = package_source_hash(self.apiurl, src_project, src_package, src_rev) + origin_info_new = origin_find(self.apiurl, tgt_project, tgt_package, source_hash_new) + + source_hash_old = package_source_hash(self.apiurl, tgt_project, tgt_package) + origin_info_old = origin_find(self.apiurl, tgt_project, tgt_package, source_hash_old, True) + + result = policy_evaluate(self.apiurl, tgt_project, tgt_package, + origin_info_new, origin_info_old, + source_hash_new, source_hash_old) + return self.policy_result_handle(tgt_project, tgt_package, origin_info_new, origin_info_old, result) + + def config_validate(self, target_project): + config = config_load(self.apiurl, target_project) + if not config: + self.review_messages['declined'] = 'OSRT:OriginConfig attribute missing' + return False + if not config.get('fallback-group'): + self.review_messages['declined'] = 'OSRT:OriginConfig.fallback-group missing' + return False + if not self.dryrun and config['review-user'] != self.review_user: + self.logger.warning( + 'OSRT:OriginConfig.review-user ({}) does not match ReviewBot.review_user ({})'.format( + config['review-user'], self.review_user)) + + return True + + def policy_result_handle(self, project, package, origin_info_new, origin_info_old, result): + if len(result.reviews): + self.policy_result_reviews_add(project, package, result.reviews) + + self.policy_result_comment_add(project, package, result.comments) + + if not result.wait: + if result.accept: + self.review_messages['accepted'] = origin_annotation_dump(origin_info_new, origin_info_old) + return result.accept + + return None + + def policy_result_reviews_add(self, project, package, reviews): + for key, comment in reviews.items(): + if key == 'maintainer': + self.devel_project_review_ensure(self.request, project, package, comment) + elif key == 'fallback': + fallback_group = config_load(self.apiurl, project).get('fallback-group') + self.add_review(self.request, by_group=fallback_group, msg=comment) + else: + self.add_review(self.request, by_group=key, msg=comment) + + def policy_result_comment_add(self, project, package, comments): + message = '\n\n'.join(comments) + if len(self.request.actions) > 1: + message = '## {}/{}\n\n{}'.format(project, package, message) + suffix = '::'.join([project, package]) + else: + suffix = None + + only_replace = False + if not len(comments): + message = 'Previous comment no longer relevant.' + only_replace = True + + self.comment_write(state='seen', message=message, identical=True, + only_replace=only_replace, bot_name_suffix=suffix) + + +class CommandLineInterface(ReviewBot.CommandLineInterface): + def __init__(self, *args, **kwargs): + ReviewBot.CommandLineInterface.__init__(self, *args, **kwargs) + self.clazz = OriginManager + +if __name__ == "__main__": + app = CommandLineInterface() + sys.exit(app.main())