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