[FIX] runbot_merge: 1.9 version & migration

Forgot to bump the version when creating the migration. Also convert
the migration to a single sql query, although the migration will never
run because I ran the query manually to fix things up after finding
out the data was "dirty" since the new code (assuming only modern
statuses) was merged without running the migration.

Thankfully it looks like the impact was not too severe (because the
legacy statuses should only be present on very old commits / PRs), I
don't remember when I deployed the update but apparently just a pair
of PRs got affected, because their `previous_failure` was the old
style and thus broke the "new failure" check.
This commit is contained in:
Xavier Morel 2024-01-16 09:42:57 +01:00
parent 994cea467c
commit 1cb31cf2c2
2 changed files with 17 additions and 21 deletions

View File

@ -1,6 +1,6 @@
{ {
'name': 'merge bot', 'name': 'merge bot',
'version': '1.8', 'version': '1.9',
'depends': ['contacts', 'website'], 'depends': ['contacts', 'website'],
'data': [ 'data': [
'security/security.xml', 'security/security.xml',

View File

@ -9,28 +9,24 @@ def migrate(cr, version):
# style is like commit statuses, with the contexts at the toplevel # style is like commit statuses, with the contexts at the toplevel
# and the status info below. # and the status info below.
cr.execute(""" cr.execute("""
UPDATE runbot_merge UPDATE runbot_merge_pull_requests
SET previous_failure = '{}' SET previous_failure = '{}'
WHERE previous_failure::jsonb ? 'state' WHERE previous_failure::jsonb ? 'state'
""") """)
# Getting this into postgres native manipulations seems a bit too
# complicated, and not really necessary.
cr.execute(""" cr.execute("""
SELECT id, statuses::json WITH new_statuses (id, statuses) AS (
FROM runbot_merge_commit SELECT id, json_object_agg(
WHERE jsonb_path_match(statuses::jsonb, '$.*.type() != "object"') key,
""") CASE WHEN jsonb_typeof(value) = 'string'
updated = [ THEN jsonb_build_object('state', value, 'target_url', null, 'description', null)
(id, { ELSE value
k: {'state': r, 'target_url': None, 'description': None} END
for k, r in st.items() ) AS statuses
}) FROM runbot_merge_commit
for id, st in cr.fetchall() CROSS JOIN LATERAL jsonb_each(statuses::jsonb) s
] WHERE jsonb_path_match(statuses::jsonb, '$.*.type() != "object"')
execute_values(cr._obj, """ GROUP BY id
UPDATE runbot_merge_commit c )
SET c.statuses = data.st UPDATE runbot_merge_commit SET statuses = new_statuses.statuses FROM new_statuses WHERE runbot_merge_commit.id = new_statuses.id
FROM (VALUES %s) AS data (id, st) """)
WHERE c.id = data.id
""", updated)