"""git_sources.kind + path: local-directory source discriminator Revision ID: 0007 Revises: 0006 Create Date: 2026-08-26 Phase 38 (local-directory-sources story, A13 — additive, reversible columns; the phase-35 table is extended, not duplicated): * ``git_sources.kind`` — TEXT NOT NULL with server default ``'git'`` and check constraint ``ck_git_sources_kind`` (``kind IN ('git', 'local')``). Existing rows read as ``kind='git'``; git rows keep ``url``, local rows carry an existing directory under ``path`` (walked directly — no clone/pull). * ``git_sources.path`` — TEXT, nullable (NULL for git rows). Made unique by the plain unique index ``uq_git_sources_path`` — mirrors 0006's ``uq_git_sources_url`` choice for ``url`` (Postgres treats NULLs as distinct under a unique index, and the API enforces local-only paths anyway). """ from __future__ import annotations import sqlalchemy as sa from alembic import op revision = "0007" down_revision = "0006" branch_labels = None depends_on = None def upgrade() -> None: op.add_column( "git_sources", sa.Column("kind", sa.Text(), server_default=sa.text("'git'"), nullable=False), ) op.create_check_constraint( "ck_git_sources_kind", "git_sources", "kind IN ('git', 'local')" ) op.add_column("git_sources", sa.Column("path", sa.Text(), nullable=True)) op.create_index("uq_git_sources_path", "git_sources", ["path"], unique=True) def downgrade() -> None: op.drop_index("uq_git_sources_path", table_name="git_sources") op.drop_constraint("ck_git_sources_kind", table_name="git_sources", type_="check") op.drop_column("git_sources", "path") op.drop_column("git_sources", "kind")