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