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