]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
ensure downrev/dependencies in tuple form before using "in"
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 20 Jan 2021 16:40:52 +0000 (11:40 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 20 Jan 2021 16:43:46 +0000 (11:43 -0500)
Fixed regression where new "loop detection" feature introduced in
:ticket:`757` produced false positives for revision names that have
overlapping substrings between revision number and down revision and/or
dependency, if the downrev/dependency were not in sequence form.

Fixes: #784
Change-Id: I9f31298c91ee2d3c1c63fd1f52bf8e0309b6ad88

alembic/script/revision.py
docs/build/unreleased/784.rst [new file with mode: 0644]
tests/test_revision.py

index c75d1c0e643403a05d5e70d076a1a55fa96a174c..75249b4a6530ef931f2925e69e28b71aa209834d 100644 (file)
@@ -1037,9 +1037,11 @@ class Revision(object):
     def __init__(
         self, revision, down_revision, dependencies=None, branch_labels=None
     ):
-        if down_revision and revision in down_revision:
+        if down_revision and revision in util.to_tuple(down_revision):
             raise LoopDetected(revision)
-        elif dependencies is not None and revision in dependencies:
+        elif dependencies is not None and revision in util.to_tuple(
+            dependencies
+        ):
             raise DependencyLoopDetected(revision)
 
         self.verify_rev_id(revision)
diff --git a/docs/build/unreleased/784.rst b/docs/build/unreleased/784.rst
new file mode 100644 (file)
index 0000000..c85ba3c
--- /dev/null
@@ -0,0 +1,8 @@
+.. change::
+    :tags: bug, versioning, regression
+    :tickets: 784
+
+    Fixed regression where new "loop detection" feature introduced in
+    :ticket:`757` produced false positives for revision names that have
+    overlapping substrings between revision number and down revision and/or
+    dependency, if the downrev/dependency were not in sequence form.
index 767baa6e60d6788d412a92c911b947dd941f5f59..3a6e9562a45c3517b5def1aacac4cc3ed331499c 100644 (file)
@@ -1288,7 +1288,7 @@ class InvalidRevisionMapTest(TestBase):
         )
 
 
-class GraphWithLoopTest(InvalidRevisionMapTest):
+class GraphWithLoopTest(DownIterateTest, InvalidRevisionMapTest):
     def test_revision_map_solitary_loop(self):
         map_ = RevisionMap(
             lambda: [
@@ -1297,6 +1297,22 @@ class GraphWithLoopTest(InvalidRevisionMapTest):
         )
         self._assert_raises_revision_map_loop(map_, "a")
 
+    def test_revision_map_no_loop_w_overlapping_substrings(self):
+        r1 = Revision("user_foo", None)
+        r2 = Revision("user", "user_foo")
+
+        self.map = RevisionMap(lambda: [r1, r2])
+
+        self._assert_iteration("heads", None, ["user", "user_foo"])
+
+    def test_revision_map_no_loop_w_overlapping_substrings_dependencies(self):
+        r1 = Revision("user_foo", None)
+        r2 = Revision("user", None, dependencies="user_foo")
+
+        self.map = RevisionMap(lambda: [r1, r2])
+
+        self._assert_iteration("heads", None, ["user", "user_foo"])
+
     def test_revision_map_base_loop(self):
         map_ = RevisionMap(
             lambda: [