mercurial/branchmap.py
changeset 18118 e70ff1e599f4
parent 18117 526e7ec5c96e
child 18120 88990d3e3d75
--- a/mercurial/branchmap.py	Thu Dec 20 13:37:37 2012 +0100
+++ b/mercurial/branchmap.py	Wed Dec 19 14:46:57 2012 +0100
@@ -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)