Abstract manifest block parsing.
authorBrendan Cully <brendan@kublai.com>
Fri, 29 Sep 2006 13:00:54 -0700
changeset 3196 f3b939444c72
parent 3195 705e30c0a230
child 3197 e18c3d08528d
Abstract manifest block parsing.
mercurial/manifest.py
mercurial/verify.py
--- a/mercurial/manifest.py	Fri Sep 29 13:00:36 2006 -0700
+++ b/mercurial/manifest.py	Fri Sep 29 13:00:54 2006 -0700
@@ -9,6 +9,7 @@
 from i18n import gettext as _
 from demandload import *
 demandload(globals(), "array bisect struct")
+demandload(globals(), "mdiff")
 
 class manifestdict(dict):
     def __init__(self, mapping=None, flags=None):
@@ -42,16 +43,25 @@
         revlog.__init__(self, opener, "00manifest.i", "00manifest.d",
                         defversion)
 
+    def parselines(self, lines):
+        for l in lines.splitlines(1):
+            yield l.split('\0')
+
+    def readdelta(self, node):
+        delta = mdiff.patchtext(self.delta(node))
+        deltamap = manifestdict()
+        for f, n in self.parselines(delta):
+            deltamap.rawset(f, n)
+        return deltamap
+            
     def read(self, node):
         if node == nullid: return manifestdict() # don't upset local cache
         if self.mapcache and self.mapcache[0] == node:
             return self.mapcache[1]
         text = self.revision(node)
         self.listcache = array.array('c', text)
-        lines = text.splitlines(1)
         mapping = manifestdict()
-        for l in lines:
-            (f, n) = l.split('\0')
+        for f, n in self.parselines(text):
             mapping.rawset(f, n)
         self.mapcache = (node, mapping)
         return mapping
--- a/mercurial/verify.py	Fri Sep 29 13:00:36 2006 -0700
+++ b/mercurial/verify.py	Fri Sep 29 13:00:54 2006 -0700
@@ -102,21 +102,15 @@
                     (short(n), short(p)))
 
         try:
-            delta = mdiff.patchtext(repo.manifest.delta(n))
+            for f, fn in repo.manifest.readdelta(n).iteritems():
+                filenodes.setdefault(f, {})[fn] = 1
         except KeyboardInterrupt:
             repo.ui.warn(_("interrupted"))
             raise
         except Exception, inst:
-            err(_("unpacking manifest %s: %s") % (short(n), inst))
+            err(_("reading delta for manifest %s: %s") % (short(n), inst))
             continue
 
-        try:
-            ff = [ l.split('\0') for l in delta.splitlines() ]
-            for f, fn in ff:
-                filenodes.setdefault(f, {})[bin(fn[:40])] = 1
-        except (ValueError, TypeError), inst:
-            err(_("broken delta in manifest %s: %s") % (short(n), inst))
-
     repo.ui.status(_("crosschecking files in changesets and manifests\n"))
 
     for m, c in neededmanifests.items():