diff --git a/check_source.py b/check_source.py index 71d4044d..52a6eb9a 100755 --- a/check_source.py +++ b/check_source.py @@ -26,6 +26,7 @@ class CheckSource(ReviewBot.ReviewBot): self.devel_whitelist = None self.review_team = 'opensuse-review-team' self.repo_checker = 'factory-repo-checker' + self.staging_group = 'factory-staging' self.skip_add_reviews = False def check_one_request(self, request): @@ -71,7 +72,7 @@ class CheckSource(ReviewBot.ReviewBot): server_service_files=True, expand_link=True) shutil.rmtree(os.path.join(target_package, '.osc')) os.rename(target_package, '_old') - old_info = self.package_source_parse(self.apiurl, target_project, target_package) + old_info = self.package_source_parse(target_project, target_package) except urllib2.HTTPError: self.logger.error('failed to checkout %s/%s' % (target_project, target_package)) @@ -80,7 +81,7 @@ class CheckSource(ReviewBot.ReviewBot): os.rename(source_package, target_package) shutil.rmtree(os.path.join(target_package, '.osc')) - new_info = self.package_source_parse(self.apiurl, source_project, source_package, source_revision) + new_info = self.package_source_parse(source_project, source_package, source_revision) if new_info['name'] != target_package: shutil.rmtree(dir) self.review_messages['declined'] = "A package submitted as %s has to build as 'Name: %s' - found Name '%s'" % (target_package, target_package, new_info['name']) @@ -127,7 +128,13 @@ class CheckSource(ReviewBot.ReviewBot): if self.review_team is not None: self.add_review(self.request, by_group=self.review_team, msg='Please review sources') - if self.repo_checker is not None: + if self.only_changes(): + self.logger.debug('only .changes modifications') + if not self.dryrun: + osc.core.change_review_state(self.apiurl, str(self.request.reqid), 'accepted', + by_group=self.staging_group, + message='skipping the staging process since only .changes modifications') + elif self.repo_checker is not None: self.add_review(self.request, by_user=self.repo_checker, msg='Please review build success') return True @@ -155,7 +162,7 @@ class CheckSource(ReviewBot.ReviewBot): sys.stdout = _stdout return result - def package_source_parse(self, apiurl, project, package, revision=None): + def package_source_parse(self, project, package, revision=None): query = {'view': 'info', 'parse': 1} if revision: query['rev'] = revision @@ -178,6 +185,19 @@ class CheckSource(ReviewBot.ReviewBot): return ret + def only_changes(self): + u = osc.core.makeurl(self.apiurl, ['request', self.request.reqid], + {'cmd': 'diff', 'view': 'xml'}) + try: + diff = ET.parse(osc.core.http_POST(u)).getroot() + for f in diff.findall('action/sourcediff/files/file/*[@name]'): + if not f.get('name').endswith('.changes'): + return False + return True + except: + pass + return False + def check_action_add_role(self, request, action): # Decline add_role request (assumed the bot acting on requests to Factory or similar). message = 'Roles to packages are granted in the devel project, not in %s.' % action.tgt_project @@ -225,6 +245,7 @@ class CommandLineInterface(ReviewBot.CommandLineInterface): parser.add_option('--devel-whitelist', dest='devel_whitelist_file', metavar='FILE', help='file containing whitelisted projects (one per line)') parser.add_option('--review-team', dest='review_team', metavar='GROUP', help='review team group added to requests with > 8 diff') parser.add_option('--repo-checker', dest='repo_checker', metavar='USER', help='repo checker user added after accepted review') + parser.add_option('--staging-group', metavar='GROUP', help='group used by staging process') parser.add_option('--skip-add-reviews', dest='skip_add_reviews', action='store_true', default=False, help='skip adding review after completing checks') return parser @@ -240,6 +261,8 @@ class CommandLineInterface(ReviewBot.CommandLineInterface): bot.review_team = self.options.review_team if self.options.repo_checker: bot.repo_checker = self.options.repo_checker + if self.options.staging_group: + bot.staging_group = self.options.staging_group bot.skip_add_reviews = self.options.skip_add_reviews return bot