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)
--- /dev/null
+.. 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.
)
-class GraphWithLoopTest(InvalidRevisionMapTest):
+class GraphWithLoopTest(DownIterateTest, InvalidRevisionMapTest):
def test_revision_map_solitary_loop(self):
map_ = RevisionMap(
lambda: [
)
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: [