Patchwork [07,of,10] branchmap: extract read logic from repo

login
register
mail settings
Submitter Pierre-Yves David
Date Dec. 19, 2012, 1:53 p.m.
Message ID <2ca3a4c5731b87f7c544.1355925203@crater1.logilab.fr>
Download mbox | patch
Permalink /patch/197/
State Superseded, archived
Commit e70ff1e599f4e06fd6cd76a99e38d9793ebb0473
Headers show

Comments

Pierre-Yves David - Dec. 19, 2012, 1:53 p.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1355924817 -3600
# Node ID 2ca3a4c5731b87f7c544bc497c4477e9a572006a
# Parent  1c902599a39b55fc6794aa56e9a366fbb9e02f47
branchmap: extract read logic from repo

Patch

diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py
--- a/mercurial/branchmap.py
+++ b/mercurial/branchmap.py
@@ -3,13 +3,45 @@ 
 # Copyright 2005-2007 Matt Mackall <mpm at selenic.com>
 #
 # 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)
         f.write("%s %s\n" % (hex(tip), tiprev))
         for label, nodes in branches.iteritems():
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -2,11 +2,11 @@ 
 #
 # Copyright 2005-2007 Matt Mackall <mpm at selenic.com>
 #
 # 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
 import changelog, dirstate, filelog, manifest, context, bookmarks, phases
 import lock, transaction, store, encoding, base85
 import scmutil, util, extensions, hook, error, revset
@@ -653,11 +653,11 @@  class localrepository(object):
         if self._branchcache is not None and self._branchcachetip == tip:
             return
 
         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
 
         catip = self._cachabletip()
@@ -710,43 +710,10 @@  class localrepository(object):
         for bn, heads in self.branchmap().iteritems():
             bt[bn] = self._branchtip(heads)
         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
         heads missing, this function updates partial to be correct.
         """