Rev 5377: Replace the generic VersionedFiles.make_mpdiffs interface. in http://bazaar.launchpad.net/~jameinel/bzr/2.3-send-mem-614576

John Arbash Meinel john at arbash-meinel.com
Tue Aug 10 19:55:28 BST 2010


At http://bazaar.launchpad.net/~jameinel/bzr/2.3-send-mem-614576

------------------------------------------------------------
revno: 5377
revision-id: john at arbash-meinel.com-20100810185520-2xswt7vw2y43f0j5
parent: john at arbash-meinel.com-20100810180754-jf7zhjlkoaxpqsrr
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.3-send-mem-614576
timestamp: Tue 2010-08-10 13:55:20 -0500
message:
  Replace the generic VersionedFiles.make_mpdiffs interface.
  
  So far, I don't see a decrease in peak memory for bzr.dev vs bzr 2.2, but
  I'll keep poking at it.
-------------- next part --------------
=== modified file 'bzrlib/versionedfile.py'
--- a/bzrlib/versionedfile.py	2010-08-10 18:07:54 +0000
+++ b/bzrlib/versionedfile.py	2010-08-10 18:55:20 +0000
@@ -289,6 +289,10 @@
             # This record should be ready to diff, since we requested
             # content in 'topological' order
             parent_keys = self.parent_map.pop(record.key)
+            # If a VersionedFile claims 'no-graph' support, then it may return
+            # None for any parent request, so we replace it with an empty tuple
+            if parent_keys is None:
+                parent_keys = ()
             parent_lines = []
             for p in parent_keys:
                 # Alternatively we could check p not in self.needed_keys, but
@@ -476,6 +480,10 @@
 
     def make_mpdiffs(self, version_ids):
         """Create multiparent diffs for specified versions."""
+        # XXX: Can't use _MPDiffGenerator just yet. This is because version_ids
+        #      is a list of strings, not keys. And while self.get_record_stream
+        #      is supported, it takes *keys*, while self.get_parent_map() takes
+        #      strings... *sigh*
         knit_versions = set()
         knit_versions.update(version_ids)
         parent_map = self.get_parent_map(version_ids)
@@ -1175,47 +1183,9 @@
 
     def make_mpdiffs(self, keys):
         """Create multiparent diffs for specified keys."""
-        keys_order = tuple(keys)
-        keys = frozenset(keys)
-        knit_keys = set(keys)
-        parent_map = self.get_parent_map(keys)
-        for parent_keys in parent_map.itervalues():
-            if parent_keys:
-                knit_keys.update(parent_keys)
-        missing_keys = keys - set(parent_map)
-        if missing_keys:
-            raise errors.RevisionNotPresent(list(missing_keys)[0], self)
-        # We need to filter out ghosts, because we can't diff against them.
-        maybe_ghosts = knit_keys - keys
-        ghosts = maybe_ghosts - set(self.get_parent_map(maybe_ghosts))
-        knit_keys.difference_update(ghosts)
-        lines = {}
-        chunks_to_lines = osutils.chunks_to_lines
-        for record in self.get_record_stream(knit_keys, 'topological', True):
-            lines[record.key] = chunks_to_lines(record.get_bytes_as('chunked'))
-            # line_block_dict = {}
-            # for parent, blocks in record.extract_line_blocks():
-            #   line_blocks[parent] = blocks
-            # line_blocks[record.key] = line_block_dict
-        diffs = []
-        for key in keys_order:
-            target = lines[key]
-            parents = parent_map[key] or []
-            # Note that filtering knit_keys can lead to a parent difference
-            # between the creation and the application of the mpdiff.
-            parent_lines = [lines[p] for p in parents if p in knit_keys]
-            if len(parent_lines) > 0:
-                # XXX: _extract_blocks is not usefully defined anywhere... It
-                #       was meant to extract the left-parent diff without
-                #       having to recompute it for Knit content (pack-0.92,
-                #       etc)
-                left_parent_blocks = self._extract_blocks(key, parent_lines[0],
-                    target)
-            else:
-                left_parent_blocks = None
-            diffs.append(multiparent.MultiParent.from_lines(target,
-                parent_lines, left_parent_blocks))
-        return diffs
+        import pdb; pdb.set_trace()
+        generator = _MPDiffGenerator(self, keys)
+        return generator.compute_diffs()
 
     def get_annotator(self):
         return annotate.Annotator(self)



More information about the bazaar-commits mailing list