Rev 4472: Start tracking the number of children that need a given text. in http://bazaar.launchpad.net/~jameinel/bzr/1.17-rework-annotate
John Arbash Meinel
john at arbash-meinel.com
Thu Jun 18 21:18:19 BST 2009
At http://bazaar.launchpad.net/~jameinel/bzr/1.17-rework-annotate
------------------------------------------------------------
revno: 4472
revision-id: john at arbash-meinel.com-20090618201759-0ik06w0f4pxf5qqt
parent: john at arbash-meinel.com-20090618200843-1gnawhm2x9ng8nyr
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.17-rework-annotate
timestamp: Thu 2009-06-18 15:17:59 -0500
message:
Start tracking the number of children that need a given text.
-------------- next part --------------
=== modified file 'bzrlib/_annotator_py.py'
--- a/bzrlib/_annotator_py.py 2009-06-18 20:08:43 +0000
+++ b/bzrlib/_annotator_py.py 2009-06-18 20:17:59 +0000
@@ -37,9 +37,30 @@
self._vf = vf
self._parent_map = {}
self._text_cache = {}
+ # Map from key => number of nexts that will be built from this key
+ self._num_needed_children = {}
self._annotations_cache = {}
self._heads_provider = None
+ def _get_needed_keys(self, key):
+ graph = _mod_graph.Graph(self._vf)
+ parent_map = {}
+ # We need 1 extra copy of the node we will be looking at when we are
+ # done
+ self._num_needed_children[key] = 1
+ for key, parent_keys in graph.iter_ancestry([key]):
+ if parent_keys is None:
+ continue
+ parent_map[key] = parent_keys
+ for parent_key in parent_keys:
+ if parent_key in self._num_needed_children:
+ self._num_needed_children[parent_key] += 1
+ else:
+ self._num_needed_children[parent_key] = 1
+ self._parent_map.update(parent_map)
+ keys = parent_map.keys()
+ return keys
+
def _get_needed_texts(self, key):
"""Get the texts we need to properly annotate key.
@@ -49,11 +70,7 @@
matcher object we are using. Currently it is always 'lines' but
future improvements may change this to a simple text string.
"""
- graph = _mod_graph.Graph(self._vf)
- parent_map = dict((k, v) for k, v in graph.iter_ancestry([key])
- if v is not None)
- self._parent_map.update(parent_map)
- keys = parent_map.keys()
+ keys = self._get_needed_keys(key)
for record in self._vf.get_record_stream(keys, 'topological', True):
this_key = record.key
lines = osutils.chunks_to_lines(record.get_bytes_as('chunked'))
=== modified file 'bzrlib/tests/test__annotator.py'
--- a/bzrlib/tests/test__annotator.py 2009-06-18 20:02:22 +0000
+++ b/bzrlib/tests/test__annotator.py 2009-06-18 20:17:59 +0000
@@ -74,6 +74,9 @@
self.addCleanup(self.repo.unlock)
vf = self.repo.texts
self.vf = vf
+ # This assumes nothing special happens during __init__, which may be
+ # valid
+ self.ann = self.module.Annotator(self.vf)
self.repo.start_write_group()
try:
self.vf.add_lines(self.fa_key, [], ['simple\n', 'content\n'])
@@ -158,74 +161,71 @@
def test_annotate_missing(self):
self.make_simple_text()
- ann = self.module.Annotator(self.vf)
self.assertRaises(errors.RevisionNotPresent,
- ann.annotate, ('not', 'present'))
+ self.ann.annotate, ('not', 'present'))
def test_annotate_simple(self):
self.make_simple_text()
- ann = self.module.Annotator(self.vf)
- self.assertAnnotateEqual([(self.fa_key,)]*2, ann, self.fa_key)
+ self.assertAnnotateEqual([(self.fa_key,)]*2, self.ann, self.fa_key)
self.assertAnnotateEqual([(self.fa_key,), (self.fb_key,)],
- ann, self.fb_key)
+ self.ann, self.fb_key)
def test_annotate_merge_text(self):
self.make_merge_text()
- ann = self.module.Annotator(self.vf)
self.assertAnnotateEqual([(self.fa_key,), (self.fc_key,),
(self.fb_key,), (self.fd_key,)],
- ann, self.fd_key)
+ self.ann, self.fd_key)
def test_annotate_common_merge_text(self):
self.make_common_merge_text()
- ann = self.module.Annotator(self.vf)
self.assertAnnotateEqual([(self.fa_key,), (self.fb_key, self.fc_key)],
- ann, self.fd_key)
+ self.ann, self.fd_key)
def test_annotate_many_way_common_merge_text(self):
self.make_many_way_common_merge_text()
- ann = self.module.Annotator(self.vf)
self.assertAnnotateEqual([(self.fa_key,),
(self.fb_key, self.fc_key, self.fe_key)],
- ann, self.ff_key)
+ self.ann, self.ff_key)
def test_annotate_merge_and_restored(self):
self.make_merge_and_restored_text()
- ann = self.module.Annotator(self.vf)
self.assertAnnotateEqual([(self.fa_key,), (self.fa_key, self.fc_key)],
- ann, self.fd_key)
+ self.ann, self.fd_key)
def test_annotate_flat_simple(self):
self.make_simple_text()
- ann = self.module.Annotator(self.vf)
self.assertEqual([(self.fa_key, 'simple\n'),
(self.fa_key, 'content\n'),
- ], ann.annotate_flat(self.fa_key))
+ ], self.ann.annotate_flat(self.fa_key))
self.assertEqual([(self.fa_key, 'simple\n'),
(self.fb_key, 'new content\n'),
- ], ann.annotate_flat(self.fb_key))
+ ], self.ann.annotate_flat(self.fb_key))
def test_annotate_flat_merge_and_restored_text(self):
self.make_merge_and_restored_text()
- ann = self.module.Annotator(self.vf)
# fc is a simple dominator of fa
self.assertEqual([(self.fa_key, 'simple\n'),
(self.fc_key, 'content\n'),
- ], ann.annotate_flat(self.fd_key))
+ ], self.ann.annotate_flat(self.fd_key))
def test_annotate_common_merge_text(self):
self.make_common_merge_text()
- ann = self.module.Annotator(self.vf)
# there is no common point, so we just pick the lexicographical lowest
# and 'b-id' comes before 'c-id'
self.assertEqual([(self.fa_key, 'simple\n'),
(self.fb_key, 'new content\n'),
- ], ann.annotate_flat(self.fd_key))
+ ], self.ann.annotate_flat(self.fd_key))
def test_annotate_many_way_common_merge_text(self):
self.make_many_way_common_merge_text()
- ann = self.module.Annotator(self.vf)
self.assertEqual([(self.fa_key, 'simple\n'),
(self.fb_key, 'new content\n')],
- ann.annotate_flat(self.ff_key))
-
+ self.ann.annotate_flat(self.ff_key))
+
+
+ def test_needed_keys(self):
+ self.make_simple_text()
+ keys = self.ann._get_needed_keys(self.fb_key)
+ self.assertEqual([self.fa_key, self.fb_key], sorted(keys))
+ self.assertEqual({self.fa_key: 1, self.fb_key: 1},
+ self.ann._num_needed_children)
More information about the bazaar-commits
mailing list