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