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