Rev 2402: Move fast id => path lookups down into DirState in http://bazaar.launchpad.net/%7Ebzr/bzr/dirstate

John Arbash Meinel john at arbash-meinel.com
Mon Feb 26 00:46:37 GMT 2007


At http://bazaar.launchpad.net/%7Ebzr/bzr/dirstate

------------------------------------------------------------
revno: 2402
revision-id: john at arbash-meinel.com-20070226004531-f5j0onpamaehk9ob
parent: john at arbash-meinel.com-20070225232832-0i66e7smyz5po931
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: dirstate
timestamp: Sun 2007-02-25 18:45:31 -0600
message:
  Move fast id => path lookups down into DirState
  It belongs there anyway, and it means all _get_entry(file_id) lookups
  will be improved, rather than just id2path.
modified:
  bzrlib/dirstate.py             dirstate.py-20060728012006-d6mvoihjb3je9peu-1
  bzrlib/tests/test_workingtree_4.py test_workingtree_4.p-20070223025758-531n3tznl3zacv2o-1
  bzrlib/workingtree_4.py        workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
-------------- next part --------------
=== modified file 'bzrlib/dirstate.py'
--- a/bzrlib/dirstate.py	2007-02-25 23:28:32 +0000
+++ b/bzrlib/dirstate.py	2007-02-26 00:45:31 +0000
@@ -360,6 +360,8 @@
            # insert a new dirblock
            self._ensure_block(block_index, entry_index, utf8path)
         self._dirblock_state = DirState.IN_MEMORY_MODIFIED
+        if self._id_index:
+            self._id_index.setdefault(entry_key[2], set()).add(entry_key)
 
     def _bisect(self, dir_name_list):
         """Bisect through the disk structure for specific rows.
@@ -1167,16 +1169,17 @@
                                           ' tree_index, file_id and path')
             return entry
         else:
-            for entry in self._iter_entries():
-                if entry[0][2] == fileid_utf8:
-                    if entry[1][tree_index][0] == 'r': # relocated
-                        # look up the real location directly by path
-                        return self._get_entry(tree_index,
-                            fileid_utf8=fileid_utf8,
-                            path_utf8=entry[1][tree_index][1])
-                    if entry[1][tree_index][0] == 'a': # absent
-                        # not in the tree at all.
-                        return None, None
+            possible_keys = self._get_id_index().get(fileid_utf8, None)
+            if not possible_keys:
+                return None, None
+            for key in possible_keys:
+                (block_index, entry_index, dir_present,
+                 file_present) = self._get_block_entry_index(key[0], key[1],
+                                                             tree_index)
+                if file_present:
+                    entry = self._dirblocks[block_index][1][entry_index]
+                    assert entry[1][tree_index][0] not in ('a', 'r')
+                    assert key == entry[0]
                     return entry
             return None, None
 
@@ -1490,6 +1493,7 @@
         self._header_state = DirState.IN_MEMORY_MODIFIED
         self._dirblock_state = DirState.IN_MEMORY_MODIFIED
         self._parents = list(parent_ids)
+        self._id_index = None
 
     def set_path_id(self, path, new_id):
         """Change the id of path to new_id in the current working tree.
@@ -1513,6 +1517,8 @@
         self.update_minimal(('', '', new_id), 'd',
             path_utf8='', packed_stat=entry[1][0][4])
         self._dirblock_state = DirState.IN_MEMORY_MODIFIED
+        if self._id_index is not None:
+            self._id_index.setdefault(new_id, set()).add(entry[0])
 
     def set_parent_trees(self, trees, ghosts):
         """Set the parent trees for the dirstate.
@@ -1733,6 +1739,7 @@
                 self._make_absent(current_old)
                 current_old = advance(old_iterator)
         self._dirblock_state = DirState.IN_MEMORY_MODIFIED
+        self._id_index = None
 
     def _make_absent(self, current_old):
         """Mark current_old - an entry - as absent for tree 0.

=== modified file 'bzrlib/tests/test_workingtree_4.py'
--- a/bzrlib/tests/test_workingtree_4.py	2007-02-25 22:07:48 +0000
+++ b/bzrlib/tests/test_workingtree_4.py	2007-02-26 00:45:31 +0000
@@ -421,16 +421,18 @@
 
     def test_id2path(self):
         tree = self.make_workingtree('tree')
-        self.build_tree(['tree/a'])
+        self.build_tree(['tree/a', 'tree/b'])
         tree.add(['a'], ['a-id'])
         self.assertEqual(u'a', tree.id2path('a-id'))
         self.assertIs(None, tree.id2path('a'))
         tree.commit('a')
+        tree.add(['b'], ['b-id'])
 
         tree.rename_one('a', u'b\xb5rry')
         self.assertEqual(u'b\xb5rry', tree.id2path('a-id'))
         tree.commit(u'b\xb5rry')
         tree.unversion(['a-id'])
         self.assertEqual(None, tree.id2path('a-id'))
-        self.assertEqual(None, tree.id2path('b-id'))
+        self.assertEqual('b', tree.id2path('b-id'))
+        self.assertEqual(None, tree.id2path('c-id'))
 

=== modified file 'bzrlib/workingtree_4.py'
--- a/bzrlib/workingtree_4.py	2007-02-25 23:28:32 +0000
+++ b/bzrlib/workingtree_4.py	2007-02-26 00:45:31 +0000
@@ -346,18 +346,11 @@
         file_id = osutils.safe_file_id(file_id)
         state = self.current_dirstate()
         possible_dir_name_ids = state._get_id_index().get(file_id, None)
-        if not possible_dir_name_ids:
+        entry = self._get_entry(file_id=file_id)
+        if entry == (None, None):
             return None
-        for dir_name_id in possible_dir_name_ids:
-            (block_index, entry_index, dir_present,
-             file_present) = state._get_block_entry_index(dir_name_id[0],
-                                                          dir_name_id[1], 0)
-            if file_present:
-                entry = state._dirblocks[block_index][1][entry_index]
-                assert entry[1][0][0] not in ('a', 'r')
-                path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])
-                return path_utf8.decode('utf8')
-        return None
+        path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])
+        return path_utf8.decode('utf8')
 
     @needs_read_lock
     def __iter__(self):



More information about the bazaar-commits mailing list