"""Add musehub_reflog_entries table Stores branch reflog entries shared from a Muse CLI client via the wire protocol (muse#54 item 4). Entries are immutable history, so the natural key is a content hash of every field (entry_id) rather than a mutable (repo_id, branch) pointer — re-pushing the same entry is a true no-op. Revision ID: 0080 Revises: 0079 """ from __future__ import annotations from typing import Sequence, Union from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision: str = '0080' down_revision: Union[str, None] = '0079' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table('musehub_reflog_entries', sa.Column('entry_id', sa.String(length=128), nullable=False), sa.Column('repo_id', sa.String(length=128), nullable=False), sa.Column('branch', sa.String(length=500), nullable=False), sa.Column('old_id', sa.String(length=128), nullable=False), sa.Column('new_id', sa.String(length=128), nullable=False), sa.Column('author', sa.String(length=255), nullable=False), sa.Column('operation', sa.Text(), nullable=False), sa.Column('timestamp', sa.DateTime(timezone=True), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.ForeignKeyConstraint(['repo_id'], ['musehub_repos.repo_id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('entry_id'), ) op.create_index(op.f('ix_musehub_reflog_entries_repo_id'), 'musehub_reflog_entries', ['repo_id'], unique=False) op.create_index('ix_musehub_reflog_entries_repo_branch', 'musehub_reflog_entries', ['repo_id', 'branch'], unique=False) def downgrade() -> None: op.drop_index('ix_musehub_reflog_entries_repo_branch', table_name='musehub_reflog_entries') op.drop_index(op.f('ix_musehub_reflog_entries_repo_id'), table_name='musehub_reflog_entries') op.drop_table('musehub_reflog_entries')