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