From 4b0797f008f6cd4b53d1a44fd1bc83c32537d90d Mon Sep 17 00:00:00 2001 From: Simon Bowly Date: Fri, 7 May 2021 11:21:55 +1000 Subject: [PATCH] Move empty downgrade revisions check to make it specific to branch filtering case as intended. Fixed regression in new versioning traversal where "alembic downgrade head" (or equivalent) fails instead of iterating no revisions. Fixes: #839 Change-Id: I9e8463ee067761ee4588c2ccc1b1009e2be97c38 --- alembic/script/revision.py | 10 +++++----- docs/build/unreleased/839.rst | 6 ++++++ tests/test_version_traversal.py | 29 ++++++++++++++++++++--------- 3 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 docs/build/unreleased/839.rst diff --git a/alembic/script/revision.py b/alembic/script/revision.py index 7fbd670a..ef03d2e5 100644 --- a/alembic/script/revision.py +++ b/alembic/script/revision.py @@ -1206,11 +1206,11 @@ class RevisionMap(object): ) ) - # Ensure we didn't throw everything away. - if len(roots) == 0: - raise RevisionError( - "Not a valid downgrade target from current heads" - ) + # Ensure we didn't throw everything away when filtering branches. + if len(roots) == 0: + raise RevisionError( + "Not a valid downgrade target from current heads" + ) heads = self.get_revisions(upper) diff --git a/docs/build/unreleased/839.rst b/docs/build/unreleased/839.rst new file mode 100644 index 00000000..85b0a482 --- /dev/null +++ b/docs/build/unreleased/839.rst @@ -0,0 +1,6 @@ +.. change:: + :tags: bug, versioning, regression + :tickets: 839 + + Fixed regression in new versioning traversal where "alembic downgrade head" + (or equivalent) fails instead of iterating no revisions. diff --git a/tests/test_version_traversal.py b/tests/test_version_traversal.py index f224731f..bdc7f658 100644 --- a/tests/test_version_traversal.py +++ b/tests/test_version_traversal.py @@ -58,6 +58,11 @@ class RevisionPathTest(MigrationTest): self.a.revision, [self.a.revision], [], {self.a.revision} ) + def test_downgrade_to_existing_head(self): + self._assert_downgrade( + self.e.revision, [self.e.revision], [], {self.e.revision} + ) + def test_upgrade_path(self): self._assert_upgrade( self.e.revision, @@ -511,15 +516,6 @@ class BranchedPathTest(MigrationTest): [self.c1.revision, self.c2.revision], ) - def test_not_a_downgrade(self): - assert_raises_message( - util.CommandError, - "Not a valid downgrade target from current heads", - self.env._downgrade_revs, - self.d2.revision, - [self.d1.revision, self.d2.revision], - ) - def test_upgrade_from_base(self): self._assert_upgrade( "base+1", [], [self.up_(self.a)], set([self.a.revision]) @@ -544,6 +540,21 @@ class BranchedPathTest(MigrationTest): [], ) + def test_downgrade_no_effect_branched(self): + """Added for good measure when there are multiple branches. """ + self._assert_downgrade( + self.c2.revision, + [self.d1.revision, self.c2.revision], + [], + set([self.d1.revision, self.c2.revision]), + ) + self._assert_downgrade( + self.d1.revision, + [self.d1.revision, self.c2.revision], + [], + set([self.d1.revision, self.c2.revision]), + ) + class BranchFromMergepointTest(MigrationTest): -- 2.47.2