diff --git a/runbot_merge/controllers/__init__.py b/runbot_merge/controllers/__init__.py index cc0838bb..2e697589 100644 --- a/runbot_merge/controllers/__init__.py +++ b/runbot_merge/controllers/__init__.py @@ -157,6 +157,10 @@ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ) def handle_pr(env, event): + pr = event['pull_request'] + squash = pr['commits'] == 1 + r = pr['base']['repo']['full_name'] + if event['action'] in [ 'assigned', 'unassigned', 'review_requested', 'review_request_removed', 'labeled', 'unlabeled' @@ -167,14 +171,19 @@ def handle_pr(env, event): event['pull_request']['base']['repo']['full_name'], event['pull_request']['number'], ) + if pr := env['runbot_merge.pull_requests'].search_fetch([ + ('repository.name', '=', r), + ('number', '=', pr['number']), + ('squash', '!=', squash), + ]): + pr.squash = squash + return Response( status=200, mimetype="text/plain", response="Not setup to receive action.", ) - pr = event['pull_request'] - r = pr['base']['repo']['full_name'] b = pr['base']['ref'] repo = env['runbot_merge.repository'].search([('name', '=', r)]) @@ -234,7 +243,7 @@ def handle_pr(env, event): if source_branch != branch: if branch != pr_obj.target: updates['target'] = branch.id - updates['squash'] = pr['commits'] == 1 + updates['squash'] = squash if 'title' in event['changes'] or 'body' in event['changes']: updates['message'] = utils.make_message(pr) @@ -330,7 +339,7 @@ def handle_pr(env, event): pr_obj.head, pr['head']['sha'], event['sender']['login'], - pr['commits'] == 1 + squash, ) if pr['base']['ref'] != pr_obj.target.name: env['runbot_merge.fetch_job'].create({ @@ -343,10 +352,14 @@ def handle_pr(env, event): 'reviewed_by': False, 'error': False, 'head': pr['head']['sha'], - 'squash': pr['commits'] == 1, + 'squash': squash, }) return Response(mimetype="text/plain", response=f'Updated to {pr_obj.head}') + if event['action'] not in ('closed', 'reopened'): + if pr_obj.squash != squash: + pr_obj.squash = squash + if event['action'] == 'ready_for_review': pr_obj.draft = False return Response(mimetype="text/plain", response=f'Updated {pr_obj.display_name} to ready') diff --git a/runbot_merge/data/merge_cron.xml b/runbot_merge/data/merge_cron.xml index a728acc5..b780e11c 100644 --- a/runbot_merge/data/merge_cron.xml +++ b/runbot_merge/data/merge_cron.xml @@ -65,6 +65,17 @@ 50 + + Warn on PRs which are approved and have no merge method or squash + + code + model._check_merge_method_configuration(True) + 6 + hours + -1 + + 50 + Impact commit statuses on PRs and stagings diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py index 85c2b9d1..1012f281 100644 --- a/runbot_merge/models/pull_requests.py +++ b/runbot_merge/models/pull_requests.py @@ -893,7 +893,7 @@ For your own safety I've ignored *everything in your entire comment*. self.batch_id.skipchecks = True self.reviewed_by = author if not (self.squash or self.merge_method): - self.env.ref('runbot_merge.check_linked_prs_status')._trigger() + self.env.ref('runbot_merge.check_merge_method')._trigger() for p in self.batch_id.prs - self: if not p.reviewed_by: @@ -1165,7 +1165,7 @@ For your own safety I've ignored *everything in your entire comment*. format_args={'user': login, 'pr': self}, ) if not (self.squash or self.merge_method): - self.env.ref('runbot_merge.check_linked_prs_status')._trigger() + self.env.ref('runbot_merge.check_merge_method')._trigger() return None def _pr_acl(self, user) -> ACL: @@ -1516,6 +1516,7 @@ For your own safety I've ignored *everything in your entire comment*. if commit: self.env.cr.commit() + def _check_merge_method_configuration(self, commit=False): # send feedback for multi-commit PRs without a merge_method (which # we've not warned yet) methods = ''.join(