depth: extract code dedicated to depth of a merge in its own function
authorPierre-Yves David <pierre-yves.david@ens-lyon.org>
Sun, 19 Mar 2017 00:44:31 +0100
changeset 2126 839e96521c5a
parent 2125 e0a25339ff17
child 2127 e2770faac2df
depth: extract code dedicated to depth of a merge in its own function The merge case is more complicated than the regular one, we extract is for the sake of clarity.
hgext3rd/evolve/stablerange.py
--- a/hgext3rd/evolve/stablerange.py	Sat Mar 18 22:48:26 2017 +0100
+++ b/hgext3rd/evolve/stablerange.py	Sun Mar 19 00:44:31 2017 +0100
@@ -24,6 +24,7 @@
         self._depthcache = {}
 
     def depthrev(self, repo, rev):
+        repo = repo.unfiltered()
         cl = repo.changelog
         cache = self._depthcache
         nullrev = nodemod.nullrev
@@ -48,45 +49,7 @@
                     revdepth = parentdepth + 1
             else:
                 # merge case
-                depth_p1 = cache.get(p1)
-                depth_p2 = cache.get(p2)
-                missingparent = False
-                if depth_p1 is None:
-                    stack.append(p1)
-                    missingparent = True
-                if depth_p2 is None:
-                    stack.append(p2)
-                    missingparent = True
-                if missingparent:
-                    continue
-                # computin depth of a merge
-                # XXX the common ancestors heads could be cached
-                ancnodes = cl.commonancestorsheads(cl.node(p1), cl.node(p2))
-                ancrevs = [cl.rev(a) for a in ancnodes]
-                anyunkown = False
-                ancdepth = []
-                for r in ancrevs:
-                    d = cache.get(r)
-                    if d is None:
-                        anyunkown = True
-                        stack.append(r)
-                    ancdepth.append((r, d))
-                if anyunkown:
-                    continue
-                if not ancrevs:
-                    # unrelated branch, (no common root)
-                    revdepth = depth_p1 + depth_p2 + 1
-                elif len(ancrevs) == 1:
-                    # one unique branch point:
-                    # we can compute depth without any walk
-                    depth_anc = ancdepth[0][1]
-                    revdepth = depth_p1 + (depth_p2 - depth_anc) + 1
-                else:
-                    # multiple ancestors, we pick one that is
-                    # * the deepest (less changeset outside of it),
-                    # * lowest revs because more chance to have descendant of other "above"
-                    anc, revdepth = max(ancdepth, key=lambda x: (x[1], -x[0]))
-                    revdepth += len(cl.findmissingrevs(common=[anc], heads=[current]))
+                revdepth = self._depthmerge(cl, current, p1, p2, stack, cache)
             if revdepth is not None:
                 cache[current] = revdepth
                 stack.pop()
@@ -94,6 +57,51 @@
         # assert revdepth == actual_depth, (rev, revdepth, actual_depth)
         return revdepth
 
+    @staticmethod
+    def _depthmerge(cl, rev, p1, p2, stack, cache):
+        # sub method to simplify the main 'depthrev' one
+        revdepth = None
+        depth_p1 = cache.get(p1)
+        depth_p2 = cache.get(p2)
+        missingparent = False
+        if depth_p1 is None:
+            stack.append(p1)
+            missingparent = True
+        if depth_p2 is None:
+            stack.append(p2)
+            missingparent = True
+        if missingparent:
+            return None
+        # computin depth of a merge
+        # XXX the common ancestors heads could be cached
+        ancnodes = cl.commonancestorsheads(cl.node(p1), cl.node(p2))
+        ancrevs = [cl.rev(a) for a in ancnodes]
+        anyunkown = False
+        ancdepth = []
+        for r in ancrevs:
+            d = cache.get(r)
+            if d is None:
+                anyunkown = True
+                stack.append(r)
+            ancdepth.append((r, d))
+        if anyunkown:
+            return None
+        if not ancrevs:
+            # unrelated branch, (no common root)
+            revdepth = depth_p1 + depth_p2 + 1
+        elif len(ancrevs) == 1:
+            # one unique branch point:
+            # we can compute depth without any walk
+            depth_anc = ancdepth[0][1]
+            revdepth = depth_p1 + (depth_p2 - depth_anc) + 1
+        else:
+            # multiple ancestors, we pick one that is
+            # * the deepest (less changeset outside of it),
+            # * lowest revs because more chance to have descendant of other "above"
+            anc, revdepth = max(ancdepth, key=lambda x: (x[1], -x[0]))
+            revdepth += len(cl.findmissingrevs(common=[anc], heads=[rev]))
+        return revdepth
+
 @eh.reposetup
 def setupcache(ui, repo):