Mercurial > public > mercurial-scm > hg-stable
diff mercurial/branchmap.py @ 18121:f8a13f061a8a
branchmap: extract updatebranchcache from repo
author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
---|---|
date | Thu, 20 Dec 2012 14:45:17 +0100 |
parents | 88990d3e3d75 |
children | 79db6d40bced |
line wrap: on
line diff
--- a/mercurial/branchmap.py Wed Dec 19 14:49:06 2012 +0100 +++ b/mercurial/branchmap.py Thu Dec 20 14:45:17 2012 +0100 @@ -111,3 +111,35 @@ if not nodes: del partial[branch] +def updatecache(repo): + repo = repo.unfiltered() # Until we get a smarter cache management + cl = repo.changelog + tip = cl.tip() + if repo._branchcache is not None and repo._branchcachetip == tip: + return + + oldtip = repo._branchcachetip + if oldtip is None or oldtip not in cl.nodemap: + partial, last, lrev = read(repo) + else: + lrev = cl.rev(oldtip) + partial = repo._branchcache + + catip = repo._cacheabletip() + # if lrev == catip: cache is already up to date + # if lrev > catip: we have uncachable element in `partial` can't write + # on disk + if lrev < catip: + ctxgen = (repo[r] for r in cl.revs(lrev + 1, catip)) + update(repo, partial, ctxgen) + write(repo, partial, cl.node(catip), catip) + lrev = catip + # If cacheable tip were lower than actual tip, we need to update the + # cache up to tip. This update (from cacheable to actual tip) is not + # written to disk since it's not cacheable. + tiprev = len(repo) - 1 + if lrev < tiprev: + ctxgen = (repo[r] for r in cl.revs(lrev + 1, tiprev)) + update(repo, partial, ctxgen) + repo._branchcache = partial + repo._branchcachetip = tip