# HG changeset patch # User Brendan Cully # Date 1159560054 25200 # Node ID f3b939444c72d30d05735e0389aff3a4d2a6dd0f # Parent 705e30c0a230136c38cd9fdf91767e7601fb6dc9 Abstract manifest block parsing. diff -r 705e30c0a230 -r f3b939444c72 mercurial/manifest.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 diff -r 705e30c0a230 -r f3b939444c72 mercurial/verify.py --- 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():