Mercurial > evolve
changeset 3253:8dcb9e929a57
stablerange: fallback to a more naive approach to find subrange
As suspected, using "bheads" was bit good enough in some case and we have to
fall back to the approach used in "basic".
On the evolve repo (about 3K changeset) this approach is about 60% slower than
the previous (wrong) code.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sun, 10 Dec 2017 00:20:06 +0100 |
parents | d57400a0f4c3 |
children | 00e20077bccf |
files | hgext3rd/evolve/stablerange.py |
diffstat | 1 files changed, 18 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext3rd/evolve/stablerange.py Sat Dec 09 22:49:07 2017 +0100 +++ b/hgext3rd/evolve/stablerange.py Sun Dec 10 00:20:06 2017 +0100 @@ -570,7 +570,6 @@ def _slicesrangeatmerge(self, repo, rangeid, globalindex): localindex = globalindex - rangeid[1] - cl = repo.changelog result = [] allrevs = self.revsfromrange(repo, rangeid) @@ -581,19 +580,24 @@ # revision we needs result.append((bottomrevs[-1], rangeid[1])) else: - parentrevs = cl.parentrevs - parents = self._parents - bheads = set(bottomrevs) - du = bheads.difference_update - for r in bottomrevs: - du(parents(r, parentrevs)) - seen = 0 - for r in bottomrevs: - seen += 1 - # XXX bheads might not be a good enough criteria - if r in bheads: - result.append((r, self.depthrev(repo, r) - seen)) - seen = 0 + head = None + headrange = None + skip = None + for rev in bottomrevs[::-1]: + if head is None: + head = rev + headrange = self.revsfromrange(repo, (head, 0)) + skip = self.depthrev(repo, rev) - 1 + elif rev != headrange[skip - 1]: + result.append((head, skip)) + head = rev + headrange = self.revsfromrange(repo, (head, 0)) + skip = self.depthrev(repo, rev) - 1 + else: + skip -= 1 + result.append((head, skip)) + + result.reverse() # top part is trivial top = (rangeid[0], globalindex)