gabriel / musehub public

0020_promote_commit_meta_columns.py file-level

at main · View file ↗ · Intel ↗

History
1 files
1 commits
0 hotspots
0 🧊 dead
0 💥 blast risk
sha256:9 Merge 'fix/assignee-sigil-inline' into 'dev' — proposal: Assignee sigil… · gabriel · Jun 7, 2026
1 """Promote all commit_meta fields to first-class columns; drop commit_meta.
2
3 Revision ID: 0020
4 Revises: 0019
5 """
6 from __future__ import annotations
7
8 from alembic import op
9 import sqlalchemy as sa
10
11 revision = "0020"
12 down_revision = "0019"
13 branch_labels = None
14 depends_on = None
15
16
17 def upgrade() -> None:
18 op.add_column("musehub_commits", sa.Column("signature", sa.Text(), nullable=True, server_default=""))
19 op.add_column("musehub_commits", sa.Column("signer_public_key", sa.Text(), nullable=True, server_default=""))
20 op.add_column("musehub_commits", sa.Column("signer_key_id", sa.String(255), nullable=True, server_default=""))
21 op.add_column("musehub_commits", sa.Column("toolchain_id", sa.String(255), nullable=True, server_default=""))
22 op.add_column("musehub_commits", sa.Column("sem_ver_bump", sa.String(10), nullable=True, server_default="none"))
23 op.add_column("musehub_commits", sa.Column("breaking_changes", sa.JSON(), nullable=True))
24 op.add_column("musehub_commits", sa.Column("reviewed_by", sa.JSON(), nullable=True))
25 op.add_column("musehub_commits", sa.Column("test_runs", sa.Integer(), nullable=True, server_default="0"))
26 op.add_column("musehub_commits", sa.Column("prompt_hash", sa.String(255), nullable=True, server_default=""))
27
28 # Backfill from commit_meta JSON
29 op.execute("""
30 UPDATE musehub_commits SET
31 signature = COALESCE(commit_meta->>'signature', ''),
32 signer_public_key = COALESCE(commit_meta->>'signer_public_key', ''),
33 signer_key_id = COALESCE(commit_meta->>'signer_key_id', ''),
34 toolchain_id = COALESCE(commit_meta->>'toolchain_id', ''),
35 sem_ver_bump = COALESCE(NULLIF(commit_meta->>'sem_ver_bump', ''), 'none'),
36 breaking_changes = COALESCE((commit_meta->'breaking_changes')::json, '[]'::json),
37 reviewed_by = COALESCE((commit_meta->'reviewed_by')::json, '[]'::json),
38 test_runs = COALESCE((commit_meta->>'test_runs')::int, 0),
39 prompt_hash = COALESCE(commit_meta->>'prompt_hash', '')
40 WHERE commit_meta IS NOT NULL
41 """)
42
43 op.drop_column("musehub_commits", "commit_meta")
44
45
46 def downgrade() -> None:
47 from sqlalchemy import text
48 op.add_column("musehub_commits", sa.Column("commit_meta", sa.JSON(), nullable=False, server_default="{}"))
49 for col in ("prompt_hash", "test_runs", "reviewed_by", "breaking_changes",
50 "sem_ver_bump", "toolchain_id", "signer_key_id", "signer_public_key", "signature"):
51 op.execute(text(f"ALTER TABLE musehub_commits DROP COLUMN IF EXISTS {col}"))