From 263560cc94040475cf5ca58b5282dd84cdda1423 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Thu, 8 Oct 2026 13:20:11 -0400 Subject: [PATCH] fix(migrations): 0035's revision id fits alembic_version (32 chars) (#5374) "0035_drop_plugin_catalog_settings" is 33 characters, and alembic_version.version_num is VARCHAR(32), so the upgrade failed with "value too long" (CI run 8800, integration). Renamed to 0035_drop_plugin_catalog. tests/test_migration_ids.py now checks every core and plugin revision id fits, in the unit lane, which never migrates. Co-Authored-By: Claude Opus 5.5 --- ...ettings.py => 0035_drop_plugin_catalog.py} | 4 +-- tests/test_migration_ids.py | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) rename steward/migrations/versions/{0035_drop_plugin_catalog_settings.py => 0035_drop_plugin_catalog.py} (89%) create mode 100644 tests/test_migration_ids.py diff --git a/steward/migrations/versions/0035_drop_plugin_catalog_settings.py b/steward/migrations/versions/0035_drop_plugin_catalog.py similarity index 89% rename from steward/migrations/versions/0035_drop_plugin_catalog_settings.py rename to steward/migrations/versions/0035_drop_plugin_catalog.py index 905d6e9..83c1962 100644 --- a/steward/migrations/versions/0035_drop_plugin_catalog_settings.py +++ b/steward/migrations/versions/0035_drop_plugin_catalog.py @@ -5,7 +5,7 @@ image and a third-party plugin is a folder the operator mounts, so nothing reads `plugins.index_url` or `plugins.repositories` any more. The removed feature takes its rows with it, as 0025 did for the http plugin. -Revision ID: 0035_drop_plugin_catalog_settings +Revision ID: 0035_drop_plugin_catalog Revises: 0034_user_time_zone Create Date: 2026-10-08 """ @@ -13,7 +13,7 @@ from typing import Sequence, Union from alembic import op import sqlalchemy as sa -revision: str = "0035_drop_plugin_catalog_settings" +revision: str = "0035_drop_plugin_catalog" down_revision: Union[str, None] = "0034_user_time_zone" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None diff --git a/tests/test_migration_ids.py b/tests/test_migration_ids.py new file mode 100644 index 0000000..7e40c55 --- /dev/null +++ b/tests/test_migration_ids.py @@ -0,0 +1,29 @@ +"""Every Alembic revision id fits alembic_version.version_num, a VARCHAR(32). + +A longer id passes every unit test and fails only when the upgrade writes it: +"value too long for type character varying(32)", and the app does not boot +(0035, #5374). The unit lane never migrates, so this reads the files. +""" +import pathlib +import re + +REPO = pathlib.Path(__file__).resolve().parents[1] +_REVISION = re.compile(r'^revision(?::[^=]*)?=\s*["\']([^"\']+)["\']', re.M) + + +def revision_ids() -> dict[str, str]: + files = [*(REPO / "steward/migrations/versions").glob("*.py"), + *(REPO / "plugins").glob("*/migrations/versions/*.py")] + found = {} + for path in files: + m = _REVISION.search(path.read_text()) + if m: + found[str(path.relative_to(REPO))] = m.group(1) + return found + + +def test_every_revision_id_fits_version_num(): + ids = revision_ids() + assert len(ids) >= 30, ids # core and plugin migrations were found, so the check is real + too_long = {path: rev for path, rev in ids.items() if len(rev) > 32} + assert not too_long, f"alembic_version.version_num is VARCHAR(32): {too_long}"