Rev 4547: Start working on code that will use Repository._serializer.write_inventory_to_strig. in http://bazaar.launchpad.net/~jameinel/bzr/1.18-bundle-and-stack-393349

John Arbash Meinel john at arbash-meinel.com
Wed Jul 22 20:00:09 BST 2009


At http://bazaar.launchpad.net/~jameinel/bzr/1.18-bundle-and-stack-393349

------------------------------------------------------------
revno: 4547
revision-id: john at arbash-meinel.com-20090722190001-pmvwietxxfgdf214
parent: john at arbash-meinel.com-20090722172206-fl8qrdwhfj74ysvq
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.18-bundle-and-stack-393349
timestamp: Wed 2009-07-22 14:00:01 -0500
message:
  Start working on code that will use Repository._serializer.write_inventory_to_strig.
  The idea is that we upcast the CHK inventory back into an XML representation,
  and then we shove that into an mpdiff based bundle (same as current)
  The main reason is so that we can maintain cross-format compatibility
  for bundles.
-------------- next part --------------
=== modified file 'bzrlib/bundle/serializer/v4.py'
--- a/bzrlib/bundle/serializer/v4.py	2009-07-22 17:22:06 +0000
+++ b/bzrlib/bundle/serializer/v4.py	2009-07-22 19:00:01 +0000
@@ -325,9 +325,49 @@
             self._add_mp_records_keys('inventory', inv_vf,
                                       [(revid,) for revid in revision_order])
         else:
-            bork
+            self._add_inventory_mpdiffs_from_serializer(revision_order)
         self._add_revision_texts(revision_order)
 
+    def _add_inventory_mpdiffs_from_serializer(self, revision_order):
+        inventory_key_order = [(r,) for r in revision_order]
+        parent_map = self.repository.inventories.get_parent_map(
+                            inventory_key_order)
+        inv_to_str = self.repository._serializer.write_inventory_to_string
+        # Make sure that we grab the parent texts first
+        just_parents = set()
+        map(just_parents.update, parent_map.itervalues())
+        just_parents.difference_update(revision_order)
+        # Ignore ghost parents
+        if _mod_revision.NULL_REVISION in just_parents:
+            import pdb; pdb.set_trace()
+        present_parents = self.repository.inventories.get_parent_map(
+                            just_parents)
+        needed_inventories = list(present_parents) + inventory_key_order
+        needed_inventories = [k[-1] for k in needed_inventories]
+        all_lines = {}
+        for inv in self.repository.iter_inventories(needed_inventories):
+            revision_id = inv.revision_id
+            key = (revision_id,)
+            as_bytes = inv_to_str(inv)
+            # The sha1 is validated as the xml/textual form, not as the
+            # form-in-the-repository
+            sha1 = osutils.sha_string(as_bytes)
+            as_lines = osutils.split_lines(as_bytes)
+            all_lines[revision_id] = as_lines
+            if key in just_parents:
+                # We don't transmit those entries
+                continue
+            # Create an mpdiff for this text, and add it to the output
+            parent_keys = parent_map[key]
+            parent_ids = [k[-1] for k in parent_keys]
+            parent_lines = [all_lines[p_id] for p_id in parent_ids]
+            diff = multiparent.MultiParent.from_lines(
+                as_lines, parent_lines)
+            text = ''.join(diff.to_patch())
+            self.bundle.add_multiparent_record(text, sha1, parent_ids,
+                                               'inventory', revision_id, None)
+
+
     def _add_revision_texts(self, revision_order):
         parent_map = self.repository.get_parent_map(revision_order)
         revision_to_str = self.repository._serializer.write_revision_to_string

=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2009-07-02 23:10:53 +0000
+++ b/bzrlib/repository.py	2009-07-22 19:00:01 +0000
@@ -2190,6 +2190,7 @@
         """
         if ((None in revision_ids)
             or (_mod_revision.NULL_REVISION in revision_ids)):
+            import pdb; pdb.set_trace()
             raise ValueError('cannot get null revision inventory')
         return self._iter_inventories(revision_ids)
 

=== modified file 'bzrlib/tests/test_bundle.py'
--- a/bzrlib/tests/test_bundle.py	2009-05-06 05:36:28 +0000
+++ b/bzrlib/tests/test_bundle.py	2009-07-22 19:00:01 +0000
@@ -1429,6 +1429,63 @@
         return 'metaweave'
 
 
+class V4_2aBundleTester(V4BundleTester):
+
+    def bzrdir_format(self):
+        return '2a'
+
+    def test_inventories_as_xml_texts(self):
+        builder = self.make_branch_builder('source',
+                                           format=self.bzrdir_format())
+        builder.start_series()
+        builder.build_snapshot('a at cset-0-1', None, [
+            ('add', ('', 'root-id', 'directory', None)),
+            ('add', ('file', 'file-id', 'file', 'original content\n')),
+            ])
+        builder.build_snapshot('a at cset-0-2a', ['a at cset-0-1'], [
+            ('modify', ('file-id', 'new-content\n')),
+            ])
+        builder.build_snapshot('a at cset-0-2b', ['a at cset-0-1'], [
+            ('add', ('other-file', 'file2-id', 'file', 'file2-content\n')),
+            ])
+        builder.build_snapshot('a at cset-0-3', ['a at cset-0-2a', 'a at cset-0-2b'], [
+            ('add', ('other-file', 'file2-id', 'file', 'file2-content\n')),
+            ])
+        builder.finish_series()
+        self.b1 = builder.get_branch()
+        self.b1.lock_read()
+        self.addCleanup(self.b1.unlock)
+
+        sio = StringIO()
+        writer = v4.BundleWriteOperation('a at cset-0-1', 'a at cset-0-3',
+                                         self.b1.repository, sio)
+        writer.bundle.begin()
+        writer._add_inventory_mpdiffs_from_serializer(
+            ['a at cset-0-3'])
+        writer.bundle.end()
+        sio.seek(0)
+        reader = v4.BundleReader(sio, stream_input=False)
+        records = list(reader.iter_records())
+        self.assertEqual(1, len(records))
+        (bytes, metadata, repo_kind, revision_id,
+         file_id) = records[0]
+        self.assertIs(None, file_id)
+        self.assertEqual('a at cset-0-3', revision_id)
+        self.assertEqual('inventory', repo_kind)
+        self.assertEqual({'parents': ['a at cset-0-2a', 'a at cset-0-2b'],
+                          'sha1': 'c08b0f8cc256107f0229c98931d1d69c0e843196',
+                          'storage_kind': 'mpdiff',
+                         }, metadata)
+        # We should have an mpdiff that takes some lines from both parents.
+        self.assertEqualDiff(
+            'i 1\n'
+            '<inventory file_id="root-id" format="5"'
+                ' revision_id="a at cset-0-3">\n'
+            '\n'
+            'c 0 1 1 1\n'
+            'c 1 2 2 2\n', bytes)
+
+
 class MungedBundleTester(object):
 
     def build_test_bundle(self):



More information about the bazaar-commits mailing list