# HG changeset patch # User Pierre-Yves David # Date 1513555861 -3600 # Node ID 3194aec207ae9a29399af7004ff0171e9addfec8 # Parent eadbe24a93f83824fcd950ff320cecfb1f642da7 stablerange: add a base class for on disk stored stablerange class diff -r eadbe24a93f8 -r 3194aec207ae hgext3rd/evolve/stablerangecache.py --- a/hgext3rd/evolve/stablerangecache.py Thu Dec 21 02:13:19 2017 +0100 +++ b/hgext3rd/evolve/stablerangecache.py Mon Dec 18 01:11:01 2017 +0100 @@ -1,5 +1,7 @@ import abc +import heapq import sqlite3 +import time import weakref from mercurial import ( @@ -10,6 +12,7 @@ from . import ( exthelper, + genericcaches, stablerange, ) @@ -17,6 +20,57 @@ eh = exthelper.exthelper() eh.merge(stablerange.eh) + +class stablerangeondiskbase(stablerange.stablerangecached, + genericcaches.changelogsourcebase): + """combine the generic stablerange cache usage with generic changelog one + """ + + def _updatefrom(self, repo, data): + """compute the rev of one revision, assert previous revision has an hot cache + """ + repo = repo.unfiltered() + ui = repo.ui + + rangeheap = [] + for r in data: + rangeheap.append((r, 0)) + total = len(data) + + heappop = heapq.heappop + heappush = heapq.heappush + heapify = heapq.heapify + + original = set(rangeheap) + seen = 0 + # progress report is showing up in the profile for small and fast + # repository so we only update it every so often + progress_each = 100 + progress_last = time.time() + heapify(rangeheap) + while rangeheap: + rangeid = heappop(rangeheap) + if rangeid in original: + if not seen % progress_each: + # if a lot of time passed, report more often + progress_new = time.time() + if (1 < progress_each) and (0.1 < progress_new - progress_last): + progress_each /= 10 + ui.progress(_("filling stablerange cache"), seen, total=total) + progress_last = progress_new + seen += 1 + original.remove(rangeid) # might have been added from other source + rangeid = rangeid + if self._getsub(rangeid) is None: + for sub in self.subranges(repo, rangeid): + if self._getsub(sub) is None: + heappush(rangeheap, sub) + ui.progress(_("filling stablerange cache"), None, total=total) + + def clear(self, reset=False): + super(stablerangeondiskbase, self).clear() + self._subrangescache.clear() + ############################# ### simple sqlite caching ### #############################