Rev 3776: Add development4 which has a parent_id to basename index on CHKInventory objects. in http://people.ubuntu.com/~robertc/baz2.0/repository

Robert Collins robertc at robertcollins.net
Fri Nov 14 01:28:45 GMT 2008


At http://people.ubuntu.com/~robertc/baz2.0/repository

------------------------------------------------------------
revno: 3776
revision-id: robertc at robertcollins.net-20081114012840-thsjm2g2xvtkk397
parent: robertc at robertcollins.net-20081114001623-vfblxa8k3vhg127a
committer: Robert Collins <robertc at robertcollins.net>
branch nick: repository
timestamp: Fri 2008-11-14 12:28:40 +1100
message:
  Add development4 which has a parent_id to basename index on CHKInventory objects.
modified:
  bzrlib/bzrdir.py               bzrdir.py-20060131065624-156dfea39c4387cb
  bzrlib/chk_serializer.py       chk_serializer.py-20081002064345-2tofdfj2eqq01h4b-1
  bzrlib/inventory.py            inventory.py-20050309040759-6648b84ca2005b37
  bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
  bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
  bzrlib/tests/test_inv.py       testinv.py-20050722220913-1dc326138d1a5892
  bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
  bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
=== modified file 'bzrlib/bzrdir.py'
--- a/bzrlib/bzrdir.py	2008-11-06 23:00:22 +0000
+++ b/bzrlib/bzrdir.py	2008-11-14 01:28:40 +0000
@@ -3112,7 +3112,7 @@
     )
 format_registry.register_metadir('development3',
     'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment3',
-    help='1.6 with B+Tree based index and a CHK index. '
+    help='1.9 with CHK Inventories. '
         'Please read '
         'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
         'before use.',
@@ -3123,7 +3123,29 @@
     )
 format_registry.register_metadir('development3-subtree',
     'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment3Subtree',
-    help='1.6.1-subtree with B+Tree based index and a CHK index. '
+    help='1.9-subtree with CHK Inventories. '
+        'Please read '
+        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
+        'before use.',
+    branch_format='bzrlib.branch.BzrBranchFormat7',
+    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
+    hidden=True,
+    experimental=True,
+    )
+format_registry.register_metadir('development4',
+    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment4',
+    help='1.9 with CHK inventories with parent_id index. '
+        'Please read '
+        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
+        'before use.',
+    branch_format='bzrlib.branch.BzrBranchFormat7',
+    tree_format='bzrlib.workingtree.WorkingTreeFormat4',
+    hidden=True,
+    experimental=True,
+    )
+format_registry.register_metadir('development4-subtree',
+    'bzrlib.repofmt.pack_repo.RepositoryFormatPackDevelopment4Subtree',
+    help='1.9-subtree with CHK Inventories with parent_id index. '
         'Please read '
         'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
         'before use.',

=== modified file 'bzrlib/chk_serializer.py'
--- a/bzrlib/chk_serializer.py	2008-11-12 04:47:37 +0000
+++ b/bzrlib/chk_serializer.py	2008-11-14 01:28:40 +0000
@@ -46,8 +46,9 @@
         else:
             return xml6.Serializer_v6._unpack_entry(self, elt)
 
-    def __init__(self, node_size):
+    def __init__(self, node_size, parent_id_basename_index):
         self.maximum_size = node_size
+        self.parent_id_basename_index = parent_id_basename_index
 
 
 class CHKSerializer(xml5.Serializer_v5):
@@ -57,9 +58,12 @@
     revision_format_num = None
     support_altered_by_hack = False
 
-    def __init__(self, node_size):
+    def __init__(self, node_size, parent_id_basename_index):
         self.maximum_size = node_size
-
-
-chk_serializer_subtree = CHKSerializerSubtree(4096)
-chk_serializer = CHKSerializer(4096)
+        self.parent_id_basename_index = parent_id_basename_index
+
+
+chk_serializer_subtree = CHKSerializerSubtree(4096, False)
+chk_serializer = CHKSerializer(4096, False)
+chk_serializer_subtree_parent_id = CHKSerializerSubtree(4096, True)
+chk_serializer_parent_id = CHKSerializer(4096, True)

=== modified file 'bzrlib/inventory.py'
--- a/bzrlib/inventory.py	2008-11-13 04:06:26 +0000
+++ b/bzrlib/inventory.py	2008-11-14 01:28:40 +0000
@@ -1422,14 +1422,22 @@
             raise ValueError("not a serialised CHKInventory: %r" % bytes)
         result.revision_id = lines[1][13:]
         result.root_id = lines[2][9:]
-        result.id_to_entry = chk_map.CHKMap(chk_store, (lines[3][13:],))
+        if lines[3].startswith('parent_id_to_basename:'):
+            next = 4
+            result.parent_id_to_basename = chk_map.CHKMap(
+                chk_store, (lines[3][23:],))
+        else:
+            next = 3
+            result.parent_id_to_basename = None
+        result.id_to_entry = chk_map.CHKMap(chk_store, (lines[next][13:],))
         if (result.revision_id,) != expected_revision_id:
             raise ValueError("Mismatched revision id and expected: %r, %r" %
                 (result.revision_id, expected_revision_id))
         return result
 
     @classmethod
-    def from_inventory(klass, chk_store, inventory, maximum_size=0):
+    def from_inventory(klass, chk_store, inventory, maximum_size=0,
+        parent_id_basename_index=False):
         """Create a CHKInventory from an existing inventory.
 
         The content of inventory is copied into the chk_store, and a
@@ -1437,16 +1445,37 @@
 
         :param chk_store: A CHK capable VersionedFiles instance.
         :param inventory: The inventory to copy.
+        :param maximum_size: The CHKMap node size limit.
+        :param parent_id_basename_index: If True create and use a
+            parent_id,basename->file_id index.
         """
         result = CHKInventory()
         result.revision_id = inventory.revision_id
         result.root_id = inventory.root.file_id
         result.id_to_entry = chk_map.CHKMap(chk_store, None)
         result.id_to_entry._root_node.set_maximum_size(maximum_size)
-        delta = []
+        file_id_delta = []
+        if parent_id_basename_index:
+            result.parent_id_to_basename = chk_map.CHKMap(chk_store, None)
+            result.parent_id_to_basename._root_node.set_maximum_size(
+                maximum_size)
+            result.parent_id_to_basename._root_node._key_width = 2
+            parent_id_delta = []
+        else:
+            result.parent_id_to_basename = None
         for path, entry in inventory.iter_entries():
-            delta.append((None, (entry.file_id,), result._entry_to_bytes(entry)))
-        result.id_to_entry.apply_delta(delta)
+            file_id_delta.append((None, (entry.file_id,),
+                result._entry_to_bytes(entry)))
+            if parent_id_basename_index:
+                if entry.parent_id is not None:
+                    parent_id = entry.parent_id
+                else:
+                    parent_id = ''
+                parent_id_delta.append((None,
+                    (parent_id, entry.name.encode('utf8')), entry.file_id))
+        result.id_to_entry.apply_delta(file_id_delta)
+        if parent_id_basename_index:
+            result.parent_id_to_basename.apply_delta(parent_id_delta)
         result.id_to_entry._save()
         return result
 
@@ -1583,6 +1612,9 @@
         lines = ["chkinventory:\n"]
         lines.append("revision_id: %s\n" % self.revision_id)
         lines.append("root_id: %s\n" % self.root_id)
+        if self.parent_id_to_basename is not None:
+            lines.append('parent_id_to_basename: %s\n' %
+                self.parent_id_to_basename.key())
         lines.append("id_to_entry: %s\n" % self.id_to_entry.key())
         return lines
 

=== modified file 'bzrlib/repofmt/pack_repo.py'
--- a/bzrlib/repofmt/pack_repo.py	2008-11-14 00:16:23 +0000
+++ b/bzrlib/repofmt/pack_repo.py	2008-11-14 01:28:40 +0000
@@ -2102,8 +2102,10 @@
         :seealso: add_inventory, for the contract.
         """
         # make inventory
+        serializer = self._format._serializer
         result = CHKInventory.from_inventory(self.chk_bytes, inv,
-            maximum_size=self._format._serializer.maximum_size)
+            maximum_size=serializer.maximum_size,
+            parent_id_basename_index=serializer.parent_id_basename_index)
         inv_lines = result.to_lines()
         return self._inventory_add_lines(revision_id, parents,
             inv_lines, check_content=False)
@@ -2859,7 +2861,7 @@
     def get_format_description(self):
         """See RepositoryFormat.get_format_description()."""
         return ("Development repository format, currently the same as "
-            "1.6.1 with B+Trees and chk support.\n")
+            "1.9 with B+Trees and chk support.\n")
 
     def check_conversion_target(self, target_format):
         pass
@@ -2910,4 +2912,91 @@
     def get_format_description(self):
         """See RepositoryFormat.get_format_description()."""
         return ("Development repository format, currently the same as "
-            "1.6.1-subtree with B+Tree and chk support.\n")
+            "1.9-subtree with B+Tree and chk support.\n")
+
+
+class RepositoryFormatPackDevelopment4(RepositoryFormatPack):
+    """A no-subtrees development repository.
+
+    This format should be retained until the second release after bzr 1.11.
+
+    This is pack-1.9 with CHKMap based inventories.
+    """
+
+    repository_class = CHKInventoryRepository
+    _commit_builder_class = PackCommitBuilder
+    _serializer = chk_serializer.chk_serializer_parent_id
+    supports_external_lookups = True
+    # What index classes to use
+    index_builder_class = BTreeBuilder
+    index_class = BTreeGraphIndex
+    supports_chks = True
+    _commit_inv_deltas = True
+
+    def _get_matching_bzrdir(self):
+        return bzrdir.format_registry.make_bzrdir('development4')
+
+    def _ignore_setting_bzrdir(self, format):
+        pass
+
+    _matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
+
+    def get_format_string(self):
+        """See RepositoryFormat.get_format_string()."""
+        return "Bazaar development format 4 (needs bzr.dev from before 1.10)\n"
+
+    def get_format_description(self):
+        """See RepositoryFormat.get_format_description()."""
+        return ("Development repository format, currently the same as "
+            "1.9 with B+Trees and chk support.\n")
+
+    def check_conversion_target(self, target_format):
+        pass
+
+
+class RepositoryFormatPackDevelopment4Subtree(RepositoryFormatPack):
+    """A subtrees development repository.
+
+    This format should be retained until the second release after bzr 1.11.
+
+    1.9-subtree[as it might have been] with CHKMap based inventories.
+    """
+
+    repository_class = CHKInventoryRepository
+    _commit_builder_class = PackRootCommitBuilder
+    rich_root_data = True
+    supports_tree_reference = True
+    _serializer = chk_serializer.chk_serializer_subtree_parent_id
+    supports_external_lookups = True
+    # What index classes to use
+    index_builder_class = BTreeBuilder
+    index_class = BTreeGraphIndex
+    supports_chks = True
+    _commit_inv_deltas = True
+
+    def _get_matching_bzrdir(self):
+        return bzrdir.format_registry.make_bzrdir(
+            'development4-subtree')
+
+    def _ignore_setting_bzrdir(self, format):
+        pass
+
+    _matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
+
+    def check_conversion_target(self, target_format):
+        if not target_format.rich_root_data:
+            raise errors.BadConversionTarget(
+                'Does not support rich root data.', target_format)
+        if not getattr(target_format, 'supports_tree_reference', False):
+            raise errors.BadConversionTarget(
+                'Does not support nested trees', target_format)
+            
+    def get_format_string(self):
+        """See RepositoryFormat.get_format_string()."""
+        return ("Bazaar development format 4 with subtree support "
+            "(needs bzr.dev from before 1.10)\n")
+
+    def get_format_description(self):
+        """See RepositoryFormat.get_format_description()."""
+        return ("Development repository format, currently the same as "
+            "1.9-subtree with B+Tree and chk support.\n")

=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2008-11-13 01:08:47 +0000
+++ b/bzrlib/repository.py	2008-11-14 01:28:40 +0000
@@ -2515,6 +2515,17 @@
     'bzrlib.repofmt.pack_repo',
     'RepositoryFormatPackDevelopment3Subtree',
     )
+format_registry.register_lazy(
+    "Bazaar development format 4 (needs bzr.dev from before 1.10)\n",
+    'bzrlib.repofmt.pack_repo',
+    'RepositoryFormatPackDevelopment4',
+    )
+format_registry.register_lazy(
+    ("Bazaar development format 4 with subtree support "
+        "(needs bzr.dev from before 1.10)\n"),
+    'bzrlib.repofmt.pack_repo',
+    'RepositoryFormatPackDevelopment4Subtree',
+    )
 
 
 class InterRepository(InterObject):

=== modified file 'bzrlib/tests/test_inv.py'
--- a/bzrlib/tests/test_inv.py	2008-11-13 03:49:55 +0000
+++ b/bzrlib/tests/test_inv.py	2008-11-14 01:28:40 +0000
@@ -15,7 +15,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 
-from bzrlib import errors, inventory, osutils
+from bzrlib import errors, chk_map, inventory, osutils
 from bzrlib.inventory import (CHKInventory, Inventory, ROOT_ID, InventoryFile,
     InventoryDirectory, InventoryEntry, TreeReference)
 from bzrlib.tests import TestCase, TestCaseWithTransport
@@ -435,3 +435,31 @@
             ('TREE_ROOT', 'TREE_ROOT'), (u'file', u'file'), ('file', 'file'),
             (False, True))],
             list(inv_1.iter_changes(inv_2)))
+
+    def test_parent_id_to_basename_index_off_by_default(self):
+        inv = Inventory()
+        inv.revision_id = "revid"
+        inv.root.revision = "rootrev"
+        chk_bytes = self.get_chk_bytes()
+        chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
+        self.assertEqual(None, chk_inv.parent_id_to_basename)
+
+    def test_parent_id_to_basename_index_enabled(self):
+        inv = Inventory()
+        inv.revision_id = "revid"
+        inv.root.revision = "rootrev"
+        inv.add(InventoryFile("fileid", "file", inv.root.file_id))
+        inv["fileid"].revision = "filerev"
+        inv["fileid"].executable = True
+        inv["fileid"].text_sha1 = "ffff"
+        inv["fileid"].text_size = 1
+        # get fresh objects.
+        chk_bytes = self.get_chk_bytes()
+        tmp_inv = CHKInventory.from_inventory(chk_bytes, inv,
+            parent_id_basename_index=True)
+        bytes = ''.join(tmp_inv.to_lines())
+        chk_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
+        self.assertIsInstance(chk_inv.parent_id_to_basename, chk_map.CHKMap)
+        self.assertEqual(
+            {('', ''): 'TREE_ROOT', ('TREE_ROOT', 'file'): 'fileid'},
+            dict(chk_inv.parent_id_to_basename.iteritems()))

=== modified file 'bzrlib/tests/test_pack_repository.py'
--- a/bzrlib/tests/test_pack_repository.py	2008-11-13 01:08:47 +0000
+++ b/bzrlib/tests/test_pack_repository.py	2008-11-14 01:28:40 +0000
@@ -729,6 +729,16 @@
                   "with subtree support (needs bzr.dev from before 1.10)\n",
               format_supports_external_lookups=True,
               index_class=BTreeGraphIndex),
+         dict(format_name='development4',
+              format_string="Bazaar development format 4 "
+                  "(needs bzr.dev from before 1.10)\n",
+              format_supports_external_lookups=True,
+              index_class=BTreeGraphIndex),
+         dict(format_name='development4-subtree',
+              format_string="Bazaar development format 4 "
+                  "with subtree support (needs bzr.dev from before 1.10)\n",
+              format_supports_external_lookups=True,
+              index_class=BTreeGraphIndex),
          ]
     adapter = tests.TestScenarioApplier()
     # name of the scenario is the format name

=== modified file 'bzrlib/tests/test_repository.py'
--- a/bzrlib/tests/test_repository.py	2008-11-12 04:47:37 +0000
+++ b/bzrlib/tests/test_repository.py	2008-11-14 01:28:40 +0000
@@ -690,6 +690,22 @@
         self.assertEqual(4096, inv.id_to_entry._root_node.maximum_size)
 
 
+class TestDevelopment4(TestCaseWithTransport):
+
+    def test_inventories_use_chk_map_with_parent_base_dict(self):
+        tree = self.make_branch_and_tree('repo', format="development4")
+        revid = tree.commit("foo")
+        tree.lock_read()
+        self.addCleanup(tree.unlock)
+        inv = tree.branch.repository.get_inventory(revid)
+        self.assertNotEqual(None, inv.parent_id_to_basename)
+        inv.parent_id_to_basename._ensure_root()
+        inv.id_to_entry._ensure_root()
+        self.assertEqual(4096, inv.id_to_entry._root_node.maximum_size)
+        self.assertEqual(4096,
+            inv.parent_id_to_basename._root_node.maximum_size)
+
+
 class TestDevelopment3FindRevisionOutsideSet(TestCaseWithTransport):
     """Tests for _find_revision_outside_set."""
 




More information about the bazaar-commits mailing list