diff --git a/runbot_merge/__manifest__.py b/runbot_merge/__manifest__.py index 8b1f11be..2aeca524 100644 --- a/runbot_merge/__manifest__.py +++ b/runbot_merge/__manifest__.py @@ -1,6 +1,6 @@ { 'name': 'merge bot', - 'version': '1.4', + 'version': '1.5', 'depends': ['contacts', 'website'], 'data': [ 'security/security.xml', diff --git a/runbot_merge/migrations/13.0.1.5/pre-migration.py b/runbot_merge/migrations/13.0.1.5/pre-migration.py new file mode 100644 index 00000000..85e0c67a --- /dev/null +++ b/runbot_merge/migrations/13.0.1.5/pre-migration.py @@ -0,0 +1,22 @@ +def migrate(cr, version): + """ copy required status filters from an m2m to branches to a domain + """ + cr.execute(""" + ALTER TABLE runbot_merge_repository_status + ADD COLUMN branch_filter varchar + """) + cr.execute(''' + SELECT status_id, array_agg(branch_id) + FROM runbot_merge_repository_status_branch + GROUP BY status_id + ''') + for st, brs in cr.fetchall(): + cr.execute(""" + UPDATE runbot_merge_repository_status + SET branch_filter = %s + WHERE id = %s + """, [ + repr([('id', 'in', brs)]), + st + ]) + cr.execute("DROP TABLE runbot_merge_repository_status_branch") diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py index 55de5ca3..218df00a 100644 --- a/runbot_merge/models/pull_requests.py +++ b/runbot_merge/models/pull_requests.py @@ -236,14 +236,18 @@ class StatusConfiguration(models.Model): context = fields.Char(required=True) repo_id = fields.Many2one('runbot_merge.repository', required=True, ondelete='cascade') - branch_ids = fields.Many2many('runbot_merge.branch', 'runbot_merge_repository_status_branch', 'status_id', 'branch_id') + branch_filter = fields.Char(help="branches this status applies to") + # FIXME: migrate branch_ids -> branch_filter = [('id', 'in', branch_ids.ids)] prs = fields.Boolean(string="Applies to pull requests", default=True) stagings = fields.Boolean(string="Applies to stagings", default=True) def _for_branch(self, branch): assert branch._name == 'runbot_merge.branch', \ f'Expected branch, got {branch}' - return self.filtered(lambda st: not st.branch_ids or branch in st.branch_ids) + return self.filtered(lambda st: ( + not st.branch_filter + or branch.filtered_domain(ast.literal_eval(st.branch_filter)) + )) def _for_pr(self, pr): assert pr._name == 'runbot_merge.pull_requests', \ f'Expected pull request, got {pr}' diff --git a/runbot_merge/tests/test_by_branch.py b/runbot_merge/tests/test_by_branch.py index ea688f8b..768ab293 100644 --- a/runbot_merge/tests/test_by_branch.py +++ b/runbot_merge/tests/test_by_branch.py @@ -14,7 +14,7 @@ def repo(env, project, make_repo, users, setreviewers): # require the lint status on master (0, 0, { 'context': 'lint', - 'branch_ids': [(4, project.branch_ids.id, False)] + 'branch_filter': [('id', '=', project.branch_ids.id)] }), (0, 0, {'context': 'pr', 'stagings': False}), (0, 0, {'context': 'staging', 'prs': False}), diff --git a/runbot_merge/views/mergebot.xml b/runbot_merge/views/mergebot.xml index a4624709..0a987a4f 100644 --- a/runbot_merge/views/mergebot.xml +++ b/runbot_merge/views/mergebot.xml @@ -64,7 +64,7 @@ - +