Rev 3292: Refactor internals of knit implementations to implement get_parents_with_ghosts in terms of get_parent_map. in http://people.ubuntu.com/~robertc/baz2.0/versioned_files

Robert Collins robertc at robertcollins.net
Thu Mar 20 00:43:35 GMT 2008


At http://people.ubuntu.com/~robertc/baz2.0/versioned_files

------------------------------------------------------------
revno: 3292
revision-id:robertc at robertcollins.net-20080320004325-ee5fzf6ax6cmjgfx
parent: robertc at robertcollins.net-20080319044803-nrd67fw9e9786k3f
committer: Robert Collins <robertc at robertcollins.net>
branch nick: versionedfile.apicleanup
timestamp: Thu 2008-03-20 11:43:25 +1100
message:
  Refactor internals of knit implementations to implement get_parents_with_ghosts in terms of get_parent_map.
modified:
  bzrlib/_knit_load_data_c.pyx   knit_c.pyx-20070509143944-u42gy8w387a10m0j-1
  bzrlib/_knit_load_data_py.py   _knit_load_data_py.p-20070629000948-9a0nh4s118bi5y8n-1
  bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
  bzrlib/symbol_versioning.py    symbol_versioning.py-20060105104851-9ecf8af605d15a80
  bzrlib/tests/interversionedfile_implementations/test_join.py test_join.py-20060302012326-9b5e9b0f0a03fedc
  bzrlib/tests/test_knit.py      test_knit.py-20051212171302-95d4c00dd5f11f2b
  bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
=== modified file 'bzrlib/_knit_load_data_c.pyx'
--- a/bzrlib/_knit_load_data_c.pyx	2007-10-10 21:18:06 +0000
+++ b/bzrlib/_knit_load_data_c.pyx	2008-03-20 00:43:25 +0000
@@ -171,7 +171,7 @@
                 Py_INCREF(parent)
             PyList_Append(parents, parent)
             parent_str = next + 1
-        return parents
+        return tuple(parents)
 
     cdef int process_one_record(self, char *start, char *end) except -1:
         """Take a simple string and split it into an index record."""

=== modified file 'bzrlib/_knit_load_data_py.py'
--- a/bzrlib/_knit_load_data_py.py	2007-07-05 19:39:28 +0000
+++ b/bzrlib/_knit_load_data_py.py	2008-03-20 00:43:25 +0000
@@ -90,6 +90,6 @@
                              options.split(','),
                              pos,
                              size,
-                             parents,
+                             tuple(parents),
                              index)
         # end kndx._cache_version

=== modified file 'bzrlib/knit.py'
--- a/bzrlib/knit.py	2008-03-19 04:39:04 +0000
+++ b/bzrlib/knit.py	2008-03-20 00:43:25 +0000
@@ -1260,14 +1260,7 @@
 
     def get_parent_map(self, version_ids):
         """See VersionedFile.get_parent_map."""
-        result = {}
-        lookup = self._index.get_parents_with_ghosts
-        for version_id in version_ids:
-            try:
-                result[version_id] = tuple(lookup(version_id))
-            except (KeyError, RevisionNotPresent):
-                pass
-        return result
+        return self._index.get_parent_map(version_ids)
 
     def get_ancestry(self, versions, topo_sorted=True):
         """See VersionedFile.get_ancestry."""
@@ -1576,7 +1569,7 @@
                 assert isinstance(line, str), \
                     'content must be utf-8 encoded: %r' % (line,)
                 lines.append(line)
-                self._cache_version(version_id, options, pos, size, parents)
+                self._cache_version(version_id, options, pos, size, tuple(parents))
             if not self._need_to_create:
                 self._transport.append_bytes(self._filename, ''.join(lines))
             else:
@@ -1631,6 +1624,16 @@
         """
         return self._cache[version_id][1]
 
+    def get_parent_map(self, version_ids):
+        """Passed through to by KnitVersionedFile.get_parent_map."""
+        result = {}
+        for version_id in version_ids:
+            try:
+                result[version_id] = tuple(self._cache[version_id][4])
+            except KeyError:
+                pass
+        return result
+
     def get_parents(self, version_id):
         """Return parents of specified version ignoring ghosts."""
         return [parent for parent in self._cache[version_id][4] 
@@ -1638,7 +1641,10 @@
 
     def get_parents_with_ghosts(self, version_id):
         """Return parents of specified version with ghosts."""
-        return self._cache[version_id][4] 
+        try:
+            return self.get_parent_map([version_id])[version_id]
+        except KeyError:
+            raise RevisionNotPresent(version_id, self)
 
     def check_versions_present(self, version_ids):
         """Check that all specified versions are present."""
@@ -1929,6 +1935,18 @@
             options.append('no-eol')
         return options
 
+    def get_parent_map(self, version_ids):
+        """Passed through to by KnitVersionedFile.get_parent_map."""
+        nodes = self._get_entries(self._version_ids_to_keys(version_ids))
+        result = {}
+        if self._parents:
+            for node in nodes:
+                result[node[1][0]] = self._keys_to_version_ids(node[3][0])
+        else:
+            for node in nodes:
+                result[node[1][0]] = ()
+        return result
+
     def get_parents(self, version_id):
         """Return parents of specified version ignoring ghosts."""
         parents = list(self.iter_parents([version_id]))
@@ -1939,11 +1957,10 @@
 
     def get_parents_with_ghosts(self, version_id):
         """Return parents of specified version with ghosts."""
-        nodes = list(self._get_entries(self._version_ids_to_keys([version_id]),
-            check_present=True))
-        if not self._parents:
-            return ()
-        return self._keys_to_version_ids(nodes[0][3][0])
+        try:
+            return self.get_parent_map([version_id])[version_id]
+        except KeyError:
+            raise RevisionNotPresent(version_id, self)
 
     def check_versions_present(self, version_ids):
         """Check that all specified versions are present."""
@@ -2367,12 +2384,24 @@
         except KeyError:
             return self.backing_index.get_options(version_id)
 
+    def get_parent_map(self, version_ids):
+        """Passed through to by KnitVersionedFile.get_parent_map."""
+        result = {}
+        pending_ids = set()
+        for version_id in version_ids:
+            try:
+                result[version_id] = self._by_version[version_id][2]
+            except KeyError:
+                pending_ids.add(version_id)
+        result.update(self.backing_index.get_parent_map(pending_ids))
+        return result
+
     def get_parents_with_ghosts(self, version_id):
         """Return parents of specified version with ghosts."""
         try:
-            return self._by_version[version_id][2]
+            return self.get_parent_map([version_id])[version_id]
         except KeyError:
-            return self.backing_index.get_parents_with_ghosts(version_id)
+            raise RevisionNotPresent(version_id, self)
 
     def get_position(self, version_id):
         """Return details needed to access the version.

=== modified file 'bzrlib/symbol_versioning.py'
--- a/bzrlib/symbol_versioning.py	2008-03-18 05:56:06 +0000
+++ b/bzrlib/symbol_versioning.py	2008-03-20 00:43:25 +0000
@@ -45,6 +45,7 @@
            'one_one',
            'one_two',
            'one_three',
+           'one_four',
            ]
 
 from warnings import warn

=== modified file 'bzrlib/tests/interversionedfile_implementations/test_join.py'
--- a/bzrlib/tests/interversionedfile_implementations/test_join.py	2008-03-19 04:39:04 +0000
+++ b/bzrlib/tests/interversionedfile_implementations/test_join.py	2008-03-20 00:43:25 +0000
@@ -248,7 +248,7 @@
         self.assertEqual(['base', 'notbase'], source.get_ancestry_with_ghosts(['notbase']))
         self.assertEqual(['base'], source.get_parents_with_ghosts('notbase'))
         self.assertEqual({'notbase':('base',)}, source.get_parent_map(['notbase']))
-        self.assertEqual({'notbase':['base']}, source.get_graph_with_ghosts())
+        self.assertEqual({'notbase':('base',)}, source.get_graph_with_ghosts())
         self.assertTrue(source.has_ghost('base'))
 
         # if we add something that is fills out what is a ghost, then 
@@ -265,8 +265,8 @@
         # we have _with_ghost apis to give us ghost information.
         self.assertEqual(['base', 'notbase'], target.get_ancestry_with_ghosts(['notbase']))
         self.assertEqual(['base'], target.get_parents_with_ghosts('notbase'))
-        self.assertEqual({'base':[],
-                          'notbase':['base'],
+        self.assertEqual({'base':(),
+                          'notbase':('base',),
                           },
                          target.get_graph_with_ghosts())
         self.assertFalse(target.has_ghost('base'))

=== modified file 'bzrlib/tests/test_knit.py'
--- a/bzrlib/tests/test_knit.py	2008-03-19 04:39:04 +0000
+++ b/bzrlib/tests/test_knit.py	2008-03-20 00:43:25 +0000
@@ -554,7 +554,7 @@
             "version option 0 1 .%s :" % (utf8_revision_id,)
             ])
         index = self.get_knit_index(transport, "filename", "r")
-        self.assertEqual([utf8_revision_id],
+        self.assertEqual((utf8_revision_id,),
             index.get_parents_with_ghosts("version"))
 
     def test_read_ignore_corrupted_lines(self):
@@ -588,7 +588,7 @@
         self.assertEqual("1", index._version_list_to_index(["version"]))
         self.assertEqual((None, 3, 4), index.get_position("version"))
         self.assertEqual(["options3"], index.get_options("version"))
-        self.assertEqual(["parent", "other"],
+        self.assertEqual(("parent", "other"),
             index.get_parents_with_ghosts("version"))
 
     def test_read_compressed_parents(self):
@@ -634,10 +634,10 @@
         self.assertEqual([], index.get_graph())
 
         index.add_version("a", ["option"], (None, 0, 1), ["b"])
-        self.assertEqual([("a", ["b"])], index.get_graph())
+        self.assertEqual([("a", ("b",))], index.get_graph())
 
         index.add_version("c", ["option"], (None, 0, 1), ["d"])
-        self.assertEqual([("a", ["b"]), ("c", ["d"])],
+        self.assertEqual([("a", ("b",)), ("c", ("d",))],
             sorted(index.get_graph()))
 
     def test_get_ancestry(self):
@@ -771,7 +771,7 @@
         self.assertEqual(1, index.num_versions())
         self.assertEqual((None, 0, 1), index.get_position("a"))
         self.assertEqual(["option"], index.get_options("a"))
-        self.assertEqual(["b"], index.get_parents_with_ghosts("a"))
+        self.assertEqual(("b",), index.get_parents_with_ghosts("a"))
 
         index.add_version("a", ["opt"], (None, 1, 2), ["c"])
         self.assertEqual(("append_bytes",
@@ -781,7 +781,7 @@
         self.assertEqual(1, index.num_versions())
         self.assertEqual((None, 1, 2), index.get_position("a"))
         self.assertEqual(["opt"], index.get_options("a"))
-        self.assertEqual(["c"], index.get_parents_with_ghosts("a"))
+        self.assertEqual(("c",), index.get_parents_with_ghosts("a"))
 
         index.add_version("b", ["option"], (None, 2, 3), ["a"])
         self.assertEqual(("append_bytes",
@@ -791,7 +791,7 @@
         self.assertEqual(2, index.num_versions())
         self.assertEqual((None, 2, 3), index.get_position("b"))
         self.assertEqual(["option"], index.get_options("b"))
-        self.assertEqual(["a"], index.get_parents_with_ghosts("b"))
+        self.assertEqual(("a",), index.get_parents_with_ghosts("b"))
 
     def test_add_versions(self):
         transport = MockTransport([
@@ -816,8 +816,8 @@
         self.assertEqual((None, 2, 3), index.get_position("b"))
         self.assertEqual(["opt"], index.get_options("a"))
         self.assertEqual(["option"], index.get_options("b"))
-        self.assertEqual(["c"], index.get_parents_with_ghosts("a"))
-        self.assertEqual(["a"], index.get_parents_with_ghosts("b"))
+        self.assertEqual(("c",), index.get_parents_with_ghosts("a"))
+        self.assertEqual(("a",), index.get_parents_with_ghosts("b"))
 
     def test_add_versions_random_id_is_accepted(self):
         transport = MockTransport([
@@ -924,9 +924,9 @@
             ])
         index = self.get_knit_index(transport, "filename", "r")
 
-        self.assertEqual([], index.get_parents_with_ghosts("a"))
-        self.assertEqual(["a", "c"], index.get_parents_with_ghosts("b"))
-        self.assertEqual(["b", "a", "e"],
+        self.assertEqual((), index.get_parents_with_ghosts("a"))
+        self.assertEqual(("a", "c"), index.get_parents_with_ghosts("b"))
+        self.assertEqual(("b", "a", "e"),
             index.get_parents_with_ghosts("c"))
 
     def test_check_versions_present(self):
@@ -1601,7 +1601,7 @@
             ]
         expected_data_list = [
             # version, options, length, parents
-            ('text-a', ['fulltext'], 122, []),
+            ('text-a', ['fulltext'], 122, ()),
            ]
         for version_id, parents, lines in test_data:
             k1.add_lines(version_id, parents, split_lines(lines))
@@ -1630,7 +1630,7 @@
             ]
         expected_data_list = [
             # version, options, length, parents
-            ('text-m', ['line-delta'], 84, ['text-b', 'text-d']),
+            ('text-m', ['line-delta'], 84, ('text-b', 'text-d')),
             ]
         for version_id, parents, lines in test_data:
             k1.add_lines(version_id, parents, split_lines(lines))
@@ -1660,8 +1660,8 @@
         original_versions = k1.versions
         k1.versions = lambda: reversed(original_versions())
         expected_data_list = [
-            ('text-a', ['fulltext'], 122, []),
-            ('text-b', ['line-delta'], 84, ['text-a'])]
+            ('text-a', ['fulltext'], 122, ()),
+            ('text-b', ['line-delta'], 84, ('text-a',))]
         # now check the fulltext is first and the delta second
         format, data_list, _ = k1.get_data_stream(['text-a', 'text-b'])
         self.assertEqual('knit-plain', format)
@@ -1673,9 +1673,9 @@
         format, data_list, _ = k1.get_data_stream([
             'text-m', 'text-b', 'text-a'])
         self.assertEqual([
-            ('text-a', ['fulltext'], 122, []),
-            ('text-b', ['line-delta'], 84, ['text-a']),
-            ('text-m', ['line-delta'], 84, ['text-b', 'text-d']),
+            ('text-a', ['fulltext'], 122, ()),
+            ('text-b', ['line-delta'], 84, ('text-a',)),
+            ('text-m', ['line-delta'], 84, ('text-b', 'text-d')),
             ], data_list)
 
     def test_get_stream_ghost_parent(self):
@@ -1688,7 +1688,7 @@
         # Expected data
         expected_data_list = [
             # version, options, length, parents
-            ('text-b', ['line-delta'], 84, ['text-a', 'text-ghost']),
+            ('text-b', ['line-delta'], 84, ('text-a', 'text-ghost')),
             ]
         
         format, data_list, reader_callable = k1.get_data_stream(['text-b'])
@@ -1716,8 +1716,8 @@
         # behaviour.
         expected_data_list = [
             # version, options, length, parents
-            ('text-d', ['line-delta'], 84, ['text-c']),
-            ('text-b', ['line-delta'], 84, ['text-a']),
+            ('text-d', ['line-delta'], 84, ('text-c',)),
+            ('text-b', ['line-delta'], 84, ('text-a',)),
             ]
         # Note that even though we request the revision IDs in a particular
         # order, the data stream may return them in any order it likes.  In this
@@ -1758,11 +1758,11 @@
         # behaviour.
         expected_data_list = [
             # version, options, length, parents
-            ('text-a', ['fulltext'], 122, []),
-            ('text-b', ['line-delta'], 84, ['text-a']),
-            ('text-m', ['line-delta'], 84, ['text-b', 'text-d']),
-            ('text-c', ['fulltext'], 121, []),
-            ('text-d', ['line-delta'], 84, ['text-c']),
+            ('text-a', ['fulltext'], 122, ()),
+            ('text-b', ['line-delta'], 84, ('text-a',)),
+            ('text-m', ['line-delta'], 84, ('text-b', 'text-d')),
+            ('text-c', ['fulltext'], 121, ()),
+            ('text-d', ['line-delta'], 84, ('text-c',)),
             ]
         format, data_list, reader_callable = k1.get_data_stream(
             ['text-a', 'text-b', 'text-c', 'text-d', 'text-m'])
@@ -2185,9 +2185,9 @@
             'a-3 fulltext 0 0 1 :'
             )
         self.assertEqual(['a-1', 'a-2', 'a-3'], idx._history)
-        self.assertEqual({'a-1':('a-1', ['fulltext'], 0, 0, [], 0),
-                          'a-2':('a-2', ['fulltext'], 0, 0, ['a-1'], 1),
-                          'a-3':('a-3', ['fulltext'], 0, 0, ['a-2'], 2),
+        self.assertEqual({'a-1':('a-1', ['fulltext'], 0, 0, (), 0),
+                          'a-2':('a-2', ['fulltext'], 0, 0, ('a-1',), 1),
+                          'a-3':('a-3', ['fulltext'], 0, 0, ('a-2',), 2),
                          }, idx._cache)
 
     def test_add_versions_fails_clean(self):
@@ -2211,19 +2211,19 @@
 
         def generate_failure():
             """Add some entries and then raise an exception"""
-            yield ('a-2', ['fulltext'], (None, 0, 0), ['a-1'])
-            yield ('a-3', ['fulltext'], (None, 0, 0), ['a-2'])
+            yield ('a-2', ['fulltext'], (None, 0, 0), ('a-1',))
+            yield ('a-3', ['fulltext'], (None, 0, 0), ('a-2',))
             raise StopEarly()
 
         # Assert the pre-condition
         self.assertEqual(['a-1'], idx._history)
-        self.assertEqual({'a-1':('a-1', ['fulltext'], 0, 0, [], 0)}, idx._cache)
+        self.assertEqual({'a-1':('a-1', ['fulltext'], 0, 0, (), 0)}, idx._cache)
 
         self.assertRaises(StopEarly, idx.add_versions, generate_failure())
 
         # And it shouldn't be modified
         self.assertEqual(['a-1'], idx._history)
-        self.assertEqual({'a-1':('a-1', ['fulltext'], 0, 0, [], 0)}, idx._cache)
+        self.assertEqual({'a-1':('a-1', ['fulltext'], 0, 0, (), 0)}, idx._cache)
 
     def test_knit_index_ignores_empty_files(self):
         # There was a race condition in older bzr, where a ^C at the right time
@@ -2914,16 +2914,16 @@
 
     def test_iter_parents(self):
         knit = self.make_knit_with_4_versions_2_dags()
-        self.assertIterParents(knit, ['a'], ['a'], [('a', [])])
+        self.assertIterParents(knit, ['a'], ['a'], [('a', ())])
         self.assertIterParents(knit, ['a', 'b'], ['a', 'b'],
-            [('a', []), ('b', [])])
+            [('a', ()), ('b', ())])
         self.assertIterParents(knit, ['a', 'b', 'c'], ['a', 'b', 'c'],
-            [('a', []), ('b', []), ('c', ['b', 'a'])])
+            [('a', ()), ('b', ()), ('c', ('b', 'a'))])
         self.assertIterParents(knit, ['a', 'b', 'c', 'd'],
             ['a', 'b', 'c', 'd'],
-            [('a', []), ('b', []), ('c', ['b', 'a']), ('d', ['e', 'f'])])
+            [('a', ()), ('b', ()), ('c', ('b', 'a')), ('d', ('e', 'f'))])
         self.assertIterParents(knit, ['c'], ['a', 'b', 'c'],
-            [('c', ['b', 'a'])])
+            [('c', ('b', 'a'))])
 
     def test_get_options(self):
         knit = self.make_knit_with_4_versions_2_dags()
@@ -2932,9 +2932,9 @@
 
     def test_get_parents_with_ghosts(self):
         knit = self.make_knit_with_4_versions_2_dags()
-        self.assertGetParentsWithGhosts(knit, ['a'], 'a', [])
-        self.assertGetParentsWithGhosts(knit, ['c'], 'c', ['b', 'a'])
-        self.assertGetParentsWithGhosts(knit, ['d'], 'd', ['e', 'f'])
+        self.assertGetParentsWithGhosts(knit, ['a'], 'a', ())
+        self.assertGetParentsWithGhosts(knit, ['c'], 'c', ('b', 'a'))
+        self.assertGetParentsWithGhosts(knit, ['d'], 'd', ('e', 'f'))
 
     def test_get_position(self):
         knit = self.make_knit_with_4_versions_2_dags()

=== modified file 'bzrlib/tests/test_versionedfile.py'
--- a/bzrlib/tests/test_versionedfile.py	2008-03-19 04:48:03 +0000
+++ b/bzrlib/tests/test_versionedfile.py	2008-03-20 00:43:25 +0000
@@ -647,7 +647,7 @@
         # we have _with_ghost apis to give us ghost information.
         self.assertEqual([parent_id_utf8, 'notbxbfse'], vf.get_ancestry_with_ghosts(['notbxbfse']))
         self.assertEqual([parent_id_utf8], vf.get_parents_with_ghosts('notbxbfse'))
-        self.assertEqual({'notbxbfse':[parent_id_utf8]}, vf.get_graph_with_ghosts())
+        self.assertEqual({'notbxbfse':(parent_id_utf8,)}, vf.get_graph_with_ghosts())
         self.assertTrue(vf.has_ghost(parent_id_utf8))
         # if we add something that is a ghost of another, it should correct the
         # results of the prior apis
@@ -664,8 +664,8 @@
         self.assertEqual([parent_id_utf8, 'notbxbfse'],
             vf.get_ancestry_with_ghosts(['notbxbfse']))
         self.assertEqual([parent_id_utf8], vf.get_parents_with_ghosts('notbxbfse'))
-        self.assertEqual({parent_id_utf8:[],
-                          'notbxbfse':[parent_id_utf8],
+        self.assertEqual({parent_id_utf8:(),
+                          'notbxbfse':(parent_id_utf8,),
                           },
                          vf.get_graph_with_ghosts())
         self.assertFalse(vf.has_ghost(parent_id_utf8))



More information about the bazaar-commits mailing list