Rev 3324: * ``VersionedFile.iter_parents`` is now deprecated in favour of in http://people.ubuntu.com/~robertc/baz2.0/versioned_files
Robert Collins
robertc at robertcollins.net
Tue Apr 8 03:31:45 BST 2008
At http://people.ubuntu.com/~robertc/baz2.0/versioned_files
------------------------------------------------------------
revno: 3324
revision-id: robertc at robertcollins.net-20080408023132-krhhq7sn52hff1tc
parent: robertc at robertcollins.net-20080408020125-lhp1vvxigfubw8db
committer: Robert Collins <robertc at robertcollins.net>
branch nick: api-cleanup
timestamp: Tue 2008-04-08 12:31:32 +1000
message:
* ``VersionedFile.iter_parents`` is now deprecated in favour of
``get_parent_map`` which can be used to instantiate a Graph on a
VersionedFile. (Robert Collins)
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/knit.py knit.py-20051212171256-f056ac8f0fbe1bd9
bzrlib/tests/test_knit.py test_knit.py-20051212171302-95d4c00dd5f11f2b
bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
bzrlib/versionedfile.py versionedfile.py-20060222045106-5039c71ee3b65490
=== modified file 'NEWS'
--- a/NEWS 2008-04-08 00:57:07 +0000
+++ b/NEWS 2008-04-08 02:31:32 +0000
@@ -157,6 +157,10 @@
* ``VersionedFile.has_ghost`` is now deprecated, as it is both expensive
and unused outside of a single test. (Robert Collins)
+ * ``VersionedFile.iter_parents`` is now deprecated in favour of
+ ``get_parent_map`` which can be used to instantiate a Graph on a
+ VersionedFile. (Robert Collins)
+
* ``VersionedFileStore`` no longer uses the transaction parameter given
to most methods; amongst other things this means that the
get_weave_or_empty method no longer guarantees errors on a missing weave
=== modified file 'bzrlib/knit.py'
--- a/bzrlib/knit.py 2008-04-07 21:52:08 +0000
+++ b/bzrlib/knit.py 2008-04-08 02:31:32 +0000
@@ -1253,17 +1253,6 @@
pb.update('Walking content.', total, total)
- def iter_parents(self, version_ids):
- """Iterate through the parents for many version ids.
-
- :param version_ids: An iterable yielding version_ids.
- :return: An iterator that yields (version_id, parents). Requested
- version_ids not present in the versioned file are simply skipped.
- The order is undefined, allowing for different optimisations in
- the underlying implementation.
- """
- return self._index.iter_parents(version_ids)
-
def num_versions(self):
"""See VersionedFile.num_versions()."""
return self._index.num_versions()
@@ -1528,28 +1517,6 @@
parents, (method, noeol))
return result
- def iter_parents(self, version_ids):
- """Iterate through the parents for many version ids.
-
- :param version_ids: An iterable yielding version_ids.
- :return: An iterator that yields (version_id, parents). Requested
- version_ids not present in the versioned file are simply skipped.
- The order is undefined, allowing for different optimisations in
- the underlying implementation.
- """
- parent_map = self.get_parent_map(version_ids)
- parent_map_set = set(parent_map)
- unknown_existence = set()
- for parents in parent_map.itervalues():
- unknown_existence.update(parents)
- unknown_existence.difference_update(parent_map_set)
- present_parents = set(self.get_parent_map(unknown_existence))
- present_parents.update(parent_map_set)
- for version_id, parents in parent_map.iteritems():
- parents = tuple(parent for parent in parents
- if parent in present_parents)
- yield version_id, parents
-
def num_versions(self):
return len(self._history)
@@ -1872,35 +1839,6 @@
else:
return 'fulltext'
- def iter_parents(self, version_ids):
- """Iterate through the parents for many version ids.
-
- :param version_ids: An iterable yielding version_ids.
- :return: An iterator that yields (version_id, parents). Requested
- version_ids not present in the versioned file are simply skipped.
- The order is undefined, allowing for different optimisations in
- the underlying implementation.
- """
- if self._parents:
- all_nodes = set(self._get_entries(self._version_ids_to_keys(version_ids)))
- all_parents = set()
- present_parents = set()
- for node in all_nodes:
- all_parents.update(node[3][0])
- # any node we are querying must be present
- present_parents.add(node[1])
- unknown_parents = all_parents.difference(present_parents)
- present_parents.update(self._present_keys(unknown_parents))
- for node in all_nodes:
- parents = []
- for parent in node[3][0]:
- if parent in present_parents:
- parents.append(parent[0])
- yield node[1][0], tuple(parents)
- else:
- for node in self._get_entries(self._version_ids_to_keys(version_ids)):
- yield node[1][0], ()
-
def num_versions(self):
return len(list(self._graph_index.iter_all_entries()))
@@ -2433,23 +2371,6 @@
"""Get all the versions in the stream."""
return self._by_version.keys()
- def iter_parents(self, version_ids):
- """Iterate through the parents for many version ids.
-
- :param version_ids: An iterable yielding version_ids.
- :return: An iterator that yields (version_id, parents). Requested
- version_ids not present in the versioned file are simply skipped.
- The order is undefined, allowing for different optimisations in
- the underlying implementation.
- """
- result = []
- for version in version_ids:
- try:
- result.append((version, self._by_version[version][2]))
- except KeyError:
- pass
- return result
-
class _KnitData(object):
"""Manage extraction of data from a KnitAccess, caching and decompressing.
=== modified file 'bzrlib/tests/test_knit.py'
--- a/bzrlib/tests/test_knit.py 2008-04-04 00:06:58 +0000
+++ b/bzrlib/tests/test_knit.py 2008-04-08 02:31:32 +0000
@@ -680,36 +680,6 @@
self.assertRaises(RevisionNotPresent,
index.get_ancestry_with_ghosts, ["e"])
- def test_iter_parents(self):
- transport = MockTransport()
- index = self.get_knit_index(transport, "filename", "w", create=True)
- # no parents
- index.add_version('r0', ['option'], (None, 0, 1), [])
- # 1 parent
- index.add_version('r1', ['option'], (None, 0, 1), ['r0'])
- # 2 parents
- index.add_version('r2', ['option'], (None, 0, 1), ['r1', 'r0'])
- # XXX TODO a ghost
- # cases: each sample data individually:
- self.assertEqual(set([('r0', ())]),
- set(index.iter_parents(['r0'])))
- self.assertEqual(set([('r1', ('r0', ))]),
- set(index.iter_parents(['r1'])))
- self.assertEqual(set([('r2', ('r1', 'r0'))]),
- set(index.iter_parents(['r2'])))
- # no nodes returned for a missing node
- self.assertEqual(set(),
- set(index.iter_parents(['missing'])))
- # 1 node returned with missing nodes skipped
- self.assertEqual(set([('r1', ('r0', ))]),
- set(index.iter_parents(['ghost1', 'r1', 'ghost'])))
- # 2 nodes returned
- self.assertEqual(set([('r0', ()), ('r1', ('r0', ))]),
- set(index.iter_parents(['r0', 'r1'])))
- # 2 nodes returned, missing skipped
- self.assertEqual(set([('r0', ()), ('r1', ('r0', ))]),
- set(index.iter_parents(['a', 'r0', 'b', 'r1', 'c'])))
-
def test_num_versions(self):
transport = MockTransport([
_KnitIndex.HEADER
@@ -2482,40 +2452,6 @@
('tip', 'no-eol,line-delta', (None, 0, 100), ['parent'])])
self.assertEqual([], self.caught_entries)
- def test_iter_parents(self):
- index1 = self.make_g_index('1', 1, [
- # no parents
- (('r0', ), 'N0 100', ([], )),
- # 1 parent
- (('r1', ), '', ([('r0', )], ))])
- index2 = self.make_g_index('2', 1, [
- # 2 parents
- (('r2', ), 'N0 100', ([('r1', ), ('r0', )], )),
- ])
- combined_index = CombinedGraphIndex([index1, index2])
- index = KnitGraphIndex(combined_index)
- # XXX TODO a ghost
- # cases: each sample data individually:
- self.assertEqual(set([('r0', ())]),
- set(index.iter_parents(['r0'])))
- self.assertEqual(set([('r1', ('r0', ))]),
- set(index.iter_parents(['r1'])))
- self.assertEqual(set([('r2', ('r1', 'r0'))]),
- set(index.iter_parents(['r2'])))
- # no nodes returned for a missing node
- self.assertEqual(set(),
- set(index.iter_parents(['missing'])))
- # 1 node returned with missing nodes skipped
- self.assertEqual(set([('r1', ('r0', ))]),
- set(index.iter_parents(['ghost1', 'r1', 'ghost'])))
- # 2 nodes returned
- self.assertEqual(set([('r0', ()), ('r1', ('r0', ))]),
- set(index.iter_parents(['r0', 'r1'])))
- # 2 nodes returned, missing skipped
- self.assertEqual(set([('r0', ()), ('r1', ('r0', ))]),
- set(index.iter_parents(['a', 'r0', 'b', 'r1', 'c'])))
-
-
class TestNoParentsGraphIndexKnit(KnitTests):
"""Tests for knits using KnitGraphIndex with no parents."""
@@ -2733,18 +2669,6 @@
('tip', 'no-eol,line-delta', (None, 0, 100), [])])
self.assertEqual([], self.caught_entries)
- def test_iter_parents(self):
- index = self.two_graph_index()
- self.assertEqual(set([
- ('tip', ()), ('tail', ()), ('parent', ()), ('separate', ())
- ]),
- set(index.iter_parents(['tip', 'tail', 'ghost', 'parent', 'separate'])))
- self.assertEqual(set([('tip', ())]),
- set(index.iter_parents(['tip'])))
- self.assertEqual(set(),
- set(index.iter_parents([])))
-
-
class TestPackKnits(KnitTests):
"""Tests that use a _PackAccess and KnitGraphIndex."""
@@ -2799,11 +2723,6 @@
set(result),
set(index.get_ancestry(ancestry_versions, False)))
- def assertIterParents(self, knit, versions, parent_versions, result):
- """Check the result of an iter_parents call on knit."""
- index = self.get_index(knit, knit.get_data_stream(versions))
- self.assertEqual(result, index.iter_parents(parent_versions))
-
def assertGetMethod(self, knit, versions, version, result):
index = self.get_index(knit, knit.get_data_stream(versions))
self.assertEqual(result, index.get_method(version))
@@ -2874,19 +2793,6 @@
# we thunk across.
self.assertGetMethod(knit, ['c'], 'b', 'fulltext')
- def test_iter_parents(self):
- knit = self.make_knit_with_4_versions_2_dags()
- self.assertIterParents(knit, ['a'], ['a'], [('a', ())])
- self.assertIterParents(knit, ['a', 'b'], ['a', 'b'],
- [('a', ()), ('b', ())])
- self.assertIterParents(knit, ['a', 'b', 'c'], ['a', 'b', 'c'],
- [('a', ()), ('b', ()), ('c', ('b', 'a'))])
- self.assertIterParents(knit, ['a', 'b', 'c', 'd'],
- ['a', 'b', 'c', 'd'],
- [('a', ()), ('b', ()), ('c', ('b', 'a')), ('d', ('e', 'f'))])
- self.assertIterParents(knit, ['c'], ['a', 'b', 'c'],
- [('c', ('b', 'a'))])
-
def test_get_options(self):
knit = self.make_knit_with_4_versions_2_dags()
self.assertGetOptions(knit, 'a', ['no-eol', 'fulltext'])
=== modified file 'bzrlib/tests/test_versionedfile.py'
--- a/bzrlib/tests/test_versionedfile.py 2008-04-08 02:01:25 +0000
+++ b/bzrlib/tests/test_versionedfile.py 2008-04-08 02:31:32 +0000
@@ -533,23 +533,25 @@
# XXX TODO a ghost
# cases: each sample data individually:
self.assertEqual(set([('r0', ())]),
- set(f.iter_parents(['r0'])))
+ set(self.applyDeprecated(one_four, f.iter_parents, ['r0'])))
self.assertEqual(set([('r1', ('r0', ))]),
- set(f.iter_parents(['r1'])))
+ set(self.applyDeprecated(one_four, f.iter_parents, ['r1'])))
self.assertEqual(set([('r2', ('r1', 'r0'))]),
- set(f.iter_parents(['r2'])))
+ set(self.applyDeprecated(one_four, f.iter_parents, ['r2'])))
# no nodes returned for a missing node
self.assertEqual(set(),
- set(f.iter_parents(['missing'])))
+ set(self.applyDeprecated(one_four, f.iter_parents, ['missing'])))
# 1 node returned with missing nodes skipped
self.assertEqual(set([('r1', ('r0', ))]),
- set(f.iter_parents(['ghost1', 'r1', 'ghost'])))
+ set(self.applyDeprecated(one_four, f.iter_parents, ['ghost1', 'r1',
+ 'ghost'])))
# 2 nodes returned
self.assertEqual(set([('r0', ()), ('r1', ('r0', ))]),
- set(f.iter_parents(['r0', 'r1'])))
+ set(self.applyDeprecated(one_four, f.iter_parents, ['r0', 'r1'])))
# 2 nodes returned, missing skipped
self.assertEqual(set([('r0', ()), ('r1', ('r0', ))]),
- set(f.iter_parents(['a', 'r0', 'b', 'r1', 'c'])))
+ set(self.applyDeprecated(one_four, f.iter_parents,
+ ['a', 'r0', 'b', 'r1', 'c'])))
def test_iter_lines_added_or_present_in_versions(self):
# test that we get at least an equalset of the lines added by
=== modified file 'bzrlib/versionedfile.py'
--- a/bzrlib/versionedfile.py 2008-04-08 02:01:25 +0000
+++ b/bzrlib/versionedfile.py 2008-04-08 02:31:32 +0000
@@ -348,18 +348,28 @@
None means retrieve all versions.
"""
if version_ids is None:
- return dict(self.iter_parents(self.versions()))
- result = {}
- pending = set(version_ids)
- while pending:
- this_iteration = pending
- pending = set()
- for version, parents in self.iter_parents(this_iteration):
- result[version] = parents
- for parent in parents:
- if parent in result:
- continue
- pending.add(parent)
+ result = self.get_parent_map(self.versions())
+ else:
+ result = {}
+ pending = set(version_ids)
+ while pending:
+ this_iteration = pending
+ pending = set()
+ parents = self.get_parent_map(this_iteration)
+ for version, parents in parents.iteritems():
+ result[version] = parents
+ for parent in parents:
+ if parent in result:
+ continue
+ pending.add(parent)
+ references = set()
+ for parents in result.itervalues():
+ references.update(parents)
+ existing_parents = self.get_parent_map(references)
+ for key, parents in result.iteritems():
+ present_parents = [parent for parent in parents if parent in
+ existing_parents]
+ result[key] = tuple(present_parents)
return result
@deprecated_method(one_four)
@@ -463,6 +473,7 @@
"""
raise NotImplementedError(self.iter_lines_added_or_present_in_versions)
+ @deprecated_method(one_four)
def iter_parents(self, version_ids):
"""Iterate through the parents for many version ids.
More information about the bazaar-commits
mailing list