obsstore: make the invalid markers check wrap-able stable
authorPierre-Yves David <pierre-yves.david@fb.com>
Fri, 30 Jan 2015 18:49:33 +0000
branchstable
changeset 23973 18d431147cc1
parent 23972 c408bf3b32f8
child 23974 e484546a7c18
obsstore: make the invalid markers check wrap-able Some evolve user ignored the invalid markers for about two years and still have some of them in some repository. This lead to plain abort whenever mercurial try to open such repo. We need reinstall some way to clean this up in the evolve extension. For this purpose, we need the checker code wrap-able independently. This is scheduled for stable as this issue is blocking some evolve user.
mercurial/obsolete.py
--- a/mercurial/obsolete.py	Fri Jan 30 18:51:20 2015 +0100
+++ b/mercurial/obsolete.py	Fri Jan 30 18:49:33 2015 +0000
@@ -462,6 +462,16 @@
         """The flags field of the marker"""
         return self._data[2]
 
+def _checkinvalidmarkers(obsstore):
+    """search for marker with invalid data and raise error if needed
+
+    Exist as a separated function to allow the evolve extension for a more
+    subtle handling.
+    """
+    if node.nullid in obsstore.precursors:
+        raise util.Abort(_('bad obsolescence marker detected: '
+                           'invalid successors nullid'))
+
 class obsstore(object):
     """Store obsolete markers
 
@@ -598,9 +608,8 @@
             if parents is not None:
                 for p in parents:
                     self.children.setdefault(p, set()).add(mark)
-        if node.nullid in self.precursors:
-            raise util.Abort(_('bad obsolescence marker detected: '
-                               'invalid successors nullid'))
+        _checkinvalidmarkers(self)
+
     def relevantmarkers(self, nodes):
         """return a set of all obsolescence markers relevant to a set of nodes.