From patchwork Sun Dec 14 18:34:24 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [5, of, 6] branchcache: let localrepo own the revbranchcache instance, save on close From: Mads Kiilerich X-Patchwork-Id: 7091 Message-Id: <186394f5dbf37adf268f.1418582064@ssl.google-analytics.com> To: mercurial-devel@selenic.com Date: Sun, 14 Dec 2014 19:34:24 +0100 # HG changeset patch # User Mads Kiilerich # Date 1418581984 -3600 # Sun Dec 14 19:33:04 2014 +0100 # Node ID 186394f5dbf37adf268fa034fc897201fd2dbe0d # Parent a84099ef1a332eb93bc9287d74c64af7e510f90e branchcache: let localrepo own the revbranchcache instance, save on close This seems to be the best of way of making a shared branchcache available everywhere, also to read-only operations like revsets. diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py --- a/mercurial/branchmap.py +++ b/mercurial/branchmap.py @@ -234,15 +234,14 @@ cl = repo.changelog # collect new branch entries newbranches = {} - cache = revbranchcache(repo) - getbranchinfoutf8 = cache.branchinfoutf8 + getbranchinfoutf8 = repo.revbranchcache.branchinfoutf8 for r in revgen: branchutf8, closesbranch = getbranchinfoutf8(r) branch = encoding.tolocal(branchutf8) newbranches.setdefault(branch, []).append(r) if closesbranch: self._closednodes.add(cl.node(r)) - cache.save() + repo.revbranchcache.save() # fetch current topological heads to speed up filtering topoheads = set(cl.headrevs()) diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -298,7 +298,8 @@ self.filteredrevcache = {} def close(self): - pass + if hasunfilteredcache(self, 'revbranchcache'): + self.revbranchcache.save() def _restrictcapabilities(self, caps): # bundle2 is not ready for prime time, drop it unless explicitly @@ -728,6 +729,11 @@ repo = (remote and remote.local()) and remote or self return repo[key].branch() + @unfilteredpropertycache + def revbranchcache(self): + """persistent cache of revision branch names""" + return branchmap.revbranchcache(self) + def known(self, nodes): nm = self.changelog.nodemap pc = self._phasecache diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py --- a/mercurial/statichttprepo.py +++ b/mercurial/statichttprepo.py @@ -90,6 +90,12 @@ def canpush(self): return False +class statichttprevbranchcache(object): + def __init__(self, repo): + self.branchinfoutf8 = repo.changelog.branchinfoutf8 + def save(self): + pass + class statichttprepository(localrepo.localrepository): supported = localrepo.localrepository._basesupported @@ -141,6 +147,7 @@ self._branchcaches = {} self.encodepats = None self.decodepats = None + self.revbranchcache = statichttprevbranchcache(self) def _restrictcapabilities(self, caps): caps = super(statichttprepository, self)._restrictcapabilities(caps)