[PATCH 02 of 10 V2] branchmap: store branchcache in a dedicated object
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Sun Dec 23 19:53:34 CST 2012
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1356137082 -3600
# Node ID 79db6d40bcedd40c7f27c009459dfe7820893802
# Parent 6fb3b8c61775ca53cdd1c69505295fb51c265883
branchmap: store branchcache in a dedicated object
Value and key of branchcache would benefit from being hold by the same object.
Moreover some logic (update, write, validation) could be move on such object.
The creation of this object is the first step toward this move. The result will
clarify branchcache related code and hide most of the detail in the class
itself. This encapsulation will greatly helps implementation of branchcache for
filtered view of the repo.
diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py
--- a/mercurial/branchmap.py
+++ b/mercurial/branchmap.py
@@ -7,17 +7,17 @@
from node import bin, hex, nullid, nullrev
import encoding
def read(repo):
- partial = {}
+ partial = branchcache()
try:
f = repo.opener("cache/branchheads")
lines = f.read().split('\n')
f.close()
except (IOError, OSError):
- return {}, nullid, nullrev
+ return branchcache(), nullid, nullrev
try:
last, lrev = lines.pop(0).split(" ", 1)
last, lrev = bin(last), int(lrev)
if lrev >= len(repo) or repo[lrev].node() != last:
@@ -35,11 +35,11 @@ def read(repo):
except KeyboardInterrupt:
raise
except Exception, inst:
if repo.ui.debugflag:
repo.ui.warn(str(inst), '\n')
- partial, last, lrev = {}, nullid, nullrev
+ partial, last, lrev = branchcache(), nullid, nullrev
return partial, last, lrev
def write(repo, branches, tip, tiprev):
try:
f = repo.opener("cache/branchheads", "w", atomictemp=True)
@@ -141,5 +141,9 @@ def updatecache(repo):
if lrev < tiprev:
ctxgen = (repo[r] for r in cl.revs(lrev + 1, tiprev))
update(repo, partial, ctxgen)
repo._branchcache = partial
repo._branchcachetip = tip
+
+class branchcache(dict):
+ """A dict like object that hold branches heads cache"""
+
diff --git a/mercurial/discovery.py b/mercurial/discovery.py
--- a/mercurial/discovery.py
+++ b/mercurial/discovery.py
@@ -191,12 +191,13 @@ def _headssummary(repo, remote, outgoing
for branch in remotebranches - touchedbranches:
del headssum[branch]
# D. Update newmap with outgoing changes.
# This will possibly add new heads and remove existing ones.
- newmap = dict((branch, heads[1]) for branch, heads in headssum.iteritems()
- if heads[0] is not None)
+ newmap = branchmap.branchcache((branch, heads[1])
+ for branch, heads in headssum.iteritems()
+ if heads[0] is not None)
branchmap.update(repo, newmap, missingctx)
for branch, newheads in newmap.iteritems():
headssum[branch][1][:] = newheads
return headssum
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -664,11 +664,11 @@ class localrepository(object):
def branchmap(self):
'''returns a dictionary {branch: [branchheads]}'''
if self.changelog.filteredrevs:
# some changeset are excluded we can't use the cache
- bmap = {}
+ bmap = branchmap.branchcache()
branchmap.update(self, bmap, (self[r] for r in self))
return bmap
else:
branchmap.updatecache(self)
return self._branchcache
@@ -2493,11 +2493,11 @@ class localrepository(object):
rbheads.extend(bheads)
if rbheads:
rtiprev = max((int(self.changelog.rev(node))
for node in rbheads))
- self._branchcache = rbranchmap
+ self._branchcache = branchmap.branchcache(rbranchmap)
rtipnode = self._branchcachetip = self[rtiprev].node()
branchmap.write(self, self._branchcache, rtipnode, rtiprev)
self.invalidate()
return len(self.heads()) + 1
finally:
More information about the Mercurial-devel
mailing list