# HG changeset patch # User Pierre-Yves David # Date 1355924817 -3600 # Node ID e70ff1e599f4e06fd6cd76a99e38d9793ebb0473 # Parent 526e7ec5c96efc69d043cfc2de7db6c1fc04233e branchmap: extract read logic from repo diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py --- a/mercurial/branchmap.py +++ b/mercurial/branchmap.py @@ -5,9 +5,41 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -from node import hex +from node import bin, hex, nullid, nullrev import encoding +def read(repo): + partial = {} + try: + f = repo.opener("cache/branchheads") + lines = f.read().split('\n') + f.close() + except (IOError, OSError): + return {}, 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: + # invalidate the cache + raise ValueError('invalidating branch cache (tip differs)') + for l in lines: + if not l: + continue + node, label = l.split(" ", 1) + label = encoding.tolocal(label.strip()) + if not node in repo: + raise ValueError('invalidating branch cache because node '+ + '%s does not exist' % node) + partial.setdefault(label, []).append(bin(node)) + except KeyboardInterrupt: + raise + except Exception, inst: + if repo.ui.debugflag: + repo.ui.warn(str(inst), '\n') + partial, last, lrev = {}, nullid, nullrev + return partial, last, lrev + def write(repo, branches, tip, tiprev): try: f = repo.opener("cache/branchheads", "w", atomictemp=True) diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -4,7 +4,7 @@ # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -from node import bin, hex, nullid, nullrev, short +from node import hex, nullid, short from i18n import _ import peer, changegroup, subrepo, discovery, pushkey, obsolete, repoview import changelog, dirstate, filelog, manifest, context, bookmarks, phases @@ -671,7 +671,7 @@ oldtip = self._branchcachetip if oldtip is None or oldtip not in cl.nodemap: - partial, last, lrev = self._readbranchcache() + partial, last, lrev = branchmap.read(self) else: lrev = cl.rev(oldtip) partial = self._branchcache @@ -731,39 +731,6 @@ return bt @unfilteredmethod # Until we get a smarter cache management - def _readbranchcache(self): - partial = {} - try: - f = self.opener("cache/branchheads") - lines = f.read().split('\n') - f.close() - except (IOError, OSError): - return {}, nullid, nullrev - - try: - last, lrev = lines.pop(0).split(" ", 1) - last, lrev = bin(last), int(lrev) - if lrev >= len(self) or self[lrev].node() != last: - # invalidate the cache - raise ValueError('invalidating branch cache (tip differs)') - for l in lines: - if not l: - continue - node, label = l.split(" ", 1) - label = encoding.tolocal(label.strip()) - if not node in self: - raise ValueError('invalidating branch cache because node '+ - '%s does not exist' % node) - partial.setdefault(label, []).append(bin(node)) - except KeyboardInterrupt: - raise - except Exception, inst: - if self.ui.debugflag: - self.ui.warn(str(inst), '\n') - partial, last, lrev = {}, nullid, nullrev - return partial, last, lrev - - @unfilteredmethod # Until we get a smarter cache management def _updatebranchcache(self, partial, ctxgen): """Given a branchhead cache, partial, that may have extra nodes or be missing heads, and a generator of nodes that are at least a superset of