# HG changeset patch # User Pierre-Yves David # Date 1490322029 -3600 # Node ID 2ba541e1ea01a41df449058422775f3c8b9ec784 # Parent 6b19998242ed74565dd9459200c2fc6edd9d7fb4 stablerange: add warming of the subrange Note that this means we build standard stable subrange for all changesets in the repository this is significantly more than what we were computing before and result is significantly more ranges being computed. diff -r 6b19998242ed -r 2ba541e1ea01 hgext3rd/evolve/stablerange.py --- a/hgext3rd/evolve/stablerange.py Fri Mar 24 11:04:38 2017 +0100 +++ b/hgext3rd/evolve/stablerange.py Fri Mar 24 03:20:29 2017 +0100 @@ -8,6 +8,7 @@ # GNU General Public License version 2 or any later version. import collections +import heapq import math from mercurial import ( @@ -181,8 +182,44 @@ def warmup(self, repo, heads): """warm the cache up to 'heads'""" repo = repo.unfiltered() - for r in repo.revs("::%ld", heads): + # subrange should be warmed from head to range to be able to benefit + # from revsfromrange cache. otherwise each merge will trigger its own + # stablesort. + # + # we use the revnumber as an approximation for depth + ui = repo.ui + + revs = repo.revs("::%ld", heads) + nbrevs = len(revs) + rangeheap = [] + for idx, r in enumerate(revs): + if not idx % 1000: + ui.progress(_("filling depth cache"), idx, total=nbrevs) + # warm up depth self.depthrev(repo, r) + rangeheap.append((-r, (r, 0))) + ui.progress(_("filling depth cache"), None, total=nbrevs) + + heappop = heapq.heappop + heappush = heapq.heappush + heapify = heapq.heapify + + original = set(rangeheap) + seen = 0 + heapify(rangeheap) + while rangeheap: + value = heappop(rangeheap) + if value in original: + if not seen % 1000: + ui.progress(_("filling stablerange cache"), seen, total=nbrevs) + seen += 1 + original.remove(value) # might have been added from other source + __, rangeid = value + if self._subrangescache.get(rangeid) is None: + for sub in self.subranges(repo, rangeid): + if self._subrangescache.get(sub) is None: + heappush(rangeheap, (-sub[0], sub)) + ui.progress(_("filling stablerange cache"), None, total=nbrevs) def depthrev(self, repo, rev): repo = repo.unfiltered()