# HG changeset patch # User Pierre-Yves David # Date 1489880671 -3600 # Node ID 839e96521c5a62ecef2932b90fc82b0ca07d9d3f # Parent e0a25339ff17fef0fd3866ad6fa94079126e929a 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. diff -r e0a25339ff17 -r 839e96521c5a 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):