Rev 5730: _preload should also handle when some entries have already been expanded. in http://bazaar.launchpad.net/~jameinel/bzr/2.4-cheaper-iter-entries-by-dir
John Arbash Meinel
john at arbash-meinel.com
Tue Mar 22 11:16:11 UTC 2011
At http://bazaar.launchpad.net/~jameinel/bzr/2.4-cheaper-iter-entries-by-dir
------------------------------------------------------------
revno: 5730
revision-id: john at arbash-meinel.com-20110322111606-z527d9dyd4si7e00
parent: john at arbash-meinel.com-20110322110347-6syzog40fq3b8kl0
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.4-cheaper-iter-entries-by-dir
timestamp: Tue 2011-03-22 12:16:06 +0100
message:
_preload should also handle when some entries have already been expanded.
-------------- next part --------------
=== modified file 'bzrlib/inventory.py'
--- a/bzrlib/inventory.py 2011-03-22 11:03:47 +0000
+++ b/bzrlib/inventory.py 2011-03-22 11:16:06 +0000
@@ -2022,10 +2022,12 @@
parent_ie._children = {}
basename = basename.decode('utf-8')
if basename in parent_ie._children:
- raise ValueError('Data inconsistency detected.'
- ' Two entries with basename %r were found'
- ' in the parent entry {%s}'
- % (basename, parent_id))
+ existing_ie = parent_ie._children[basename]
+ if existing_ie != ie:
+ raise ValueError('Data inconsistency detected.'
+ ' Two entries with basename %r were found'
+ ' in the parent entry {%s}'
+ % (basename, parent_id))
if basename != ie.name:
raise ValueError('Data inconsistency detected.'
' In the parent_id_basename_to_file_id map, file_id'
=== modified file 'bzrlib/tests/test_inv.py'
--- a/bzrlib/tests/test_inv.py 2011-03-22 11:03:47 +0000
+++ b/bzrlib/tests/test_inv.py 2011-03-22 11:16:06 +0000
@@ -1223,7 +1223,7 @@
self.assertEqual(('tree\xce\xa9name', 'tree-root-id', 'tree-rev-id'),
inv._bytes_to_utf8name_key(bytes))
- def test__preload_handles_utf8(self):
+ def make_basic_utf8_inventory(self):
inv = Inventory()
inv.revision_id = "revid"
inv.root.revision = "rootrev"
@@ -1240,14 +1240,17 @@
chk_bytes = self.get_chk_bytes()
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
bytes = ''.join(chk_inv.to_lines())
- new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
+ return CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
+
+ def test__preload_handles_utf8(self):
+ new_inv = self.make_basic_utf8_inventory()
self.assertEqual({}, new_inv._fileid_to_entry_cache)
self.assertFalse(new_inv._fully_cached)
new_inv._preload_cache()
self.assertEqual(
- sorted([root_id, "fileid", "dirid", "childid"]),
+ sorted([new_inv.root_id, "fileid", "dirid", "childid"]),
sorted(new_inv._fileid_to_entry_cache.keys()))
- ie_root = new_inv._fileid_to_entry_cache[root_id]
+ ie_root = new_inv._fileid_to_entry_cache[new_inv.root_id]
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
sorted(ie_root._children.keys()))
ie_dir = new_inv._fileid_to_entry_cache['dirid']
@@ -1285,6 +1288,23 @@
ie_dir = new_inv._fileid_to_entry_cache['dirid']
self.assertEqual(['child'], sorted(ie_dir._children.keys()))
+ def test__preload_handles_partially_evaluated_inventory(self):
+ new_inv = self.make_basic_utf8_inventory()
+ ie = new_inv[new_inv.root_id]
+ self.assertIs(None, ie._children)
+ self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
+ sorted(ie.children.keys()))
+ # Accessing .children loads _children
+ self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
+ sorted(ie._children.keys()))
+ new_inv._preload_cache()
+ # No change
+ self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
+ sorted(ie._children.keys()))
+ ie_dir = new_inv["dirid"]
+ self.assertEqual([u'ch\xefld'],
+ sorted(ie_dir._children.keys()))
+
class TestCHKInventoryExpand(tests.TestCaseWithMemoryTransport):
More information about the bazaar-commits
mailing list