diff --git a/conftest.py b/conftest.py index 140a2b67..2bdf05cc 100644 --- a/conftest.py +++ b/conftest.py @@ -248,7 +248,7 @@ class DbDict(dict): '-d', db, '-i', module, '--max-cron-threads', '0', '--stop-after-init' - ]) + ], check=True) self[module] = db return db diff --git a/runbot_merge/__init__.py b/runbot_merge/__init__.py index 71babc13..0cfc4a5e 100644 --- a/runbot_merge/__init__.py +++ b/runbot_merge/__init__.py @@ -33,3 +33,11 @@ def enable_sentry(): logger.exception("DSN found, failed to enable sentry...") else: logger.info("DSN found, sentry enabled...") + +def _check_citext(cr): + cr.execute("select 1 from pg_extension where extname = 'citext'") + if not cr.rowcount: + try: + cr.execute('create extension citext') + except Exception: + raise AssertionError("runbot_merge needs the citext extension") diff --git a/runbot_merge/__manifest__.py b/runbot_merge/__manifest__.py index ba8809ba..976d0dd5 100644 --- a/runbot_merge/__manifest__.py +++ b/runbot_merge/__manifest__.py @@ -1,6 +1,6 @@ { 'name': 'merge bot', - 'version': '1.2', + 'version': '1.3', 'depends': ['contacts', 'website'], 'data': [ 'security/security.xml', @@ -12,4 +12,5 @@ 'views/templates.xml', ], 'post_load': 'enable_sentry', + 'pre_init_hook': '_check_citext', } diff --git a/runbot_merge/migrations/13.0.1.3/pre-migration.py b/runbot_merge/migrations/13.0.1.3/pre-migration.py new file mode 100644 index 00000000..d4e59b7e --- /dev/null +++ b/runbot_merge/migrations/13.0.1.3/pre-migration.py @@ -0,0 +1,2 @@ +def migrate(cr, version): + cr.execute("DROP INDEX runbot_merge_unique_gh_login") diff --git a/runbot_merge/models/res_partner.py b/runbot_merge/models/res_partner.py index 80417fc9..021cfc69 100644 --- a/runbot_merge/models/res_partner.py +++ b/runbot_merge/models/res_partner.py @@ -1,10 +1,15 @@ from email.utils import parseaddr from odoo import fields, models, tools, api +class CIText(fields.Char): + type = 'char' + column_type = ('citext', 'citext') + column_cast_from = ('varchar', 'text') + class Partner(models.Model): _inherit = 'res.partner' - github_login = fields.Char() + github_login = CIText() delegate_reviewer = fields.Many2many('runbot_merge.pull_requests') formatted_email = fields.Char(string="commit email", compute='_rfc5322_formatted') review_rights = fields.One2many('res.partner.review', 'partner_id') diff --git a/runbot_merge/tests/test_basic.py b/runbot_merge/tests/test_basic.py index 5443a4ba..ebdab3e2 100644 --- a/runbot_merge/tests/test_basic.py +++ b/runbot_merge/tests/test_basic.py @@ -2625,10 +2625,14 @@ class TestReviewing(object): prx = repo.make_pr(title='title', body='body', target='master', head=c1) repo.post_status(prx.head, 'success', 'legal/cla') repo.post_status(prx.head, 'success', 'ci/runbot') - prx.post_comment('hansen delegate=%s' % users['other'], config['role_reviewer']['token']) - prx.post_comment('hansen r+', config['role_user']['token']) + # flip case to check that github login is case-insensitive + other = ''.join(c.lower() if c.isupper() else c.upper() for c in users['other']) + prx.post_comment('hansen delegate=%s' % other, config['role_reviewer']['token']) env.run_crons() + with repo: + # check this is ignored + prx.post_comment('hansen r+', config['role_user']['token']) assert prx.user == users['user'] assert env['runbot_merge.pull_requests'].search([ ('repository.name', '=', repo.name), @@ -2636,6 +2640,7 @@ class TestReviewing(object): ]).state == 'validated' with repo: + # check this works prx.post_comment('hansen r+', config['role_other']['token']) assert env['runbot_merge.pull_requests'].search([ ('repository.name', '=', repo.name),