Merge lp:~garyvdm/bzr/PublicStackedParentsProvider into lp:~bzr/bzr/trunk-old

Proposed by Gary van der Merwe
Status: Superseded
Proposed branch: lp:~garyvdm/bzr/PublicStackedParentsProvider
Merge into: lp:~bzr/bzr/trunk-old
Diff against target: 195 lines
To merge this branch: bzr merge lp:~garyvdm/bzr/PublicStackedParentsProvider

This proposal supersedes a proposal from 2009-05-27.

This proposal has been superseded by a proposal from 2009-05-29.

To post a comment you must log in.
Revision history for this message
Gary van der Merwe (garyvdm) wrote : Posted in a previous version of this proposal

The patch make StackedParentsProvider a public api. It also adds a test to check that overlaping revisions from the different providers are handled correctly.

Revision history for this message
John A Meinel (jameinel) wrote : Posted in a previous version of this proposal

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Gary van der Merwe wrote:
> Gary van der Merwe has proposed merging lp:~garyvdm/bzr/PublicStackedParentsProvider into lp:bzr.
>
> Requested reviews:
> bzr-core (bzr-core)
>
> The patch make StackedParentsProvider a public api. It also adds a test to check that overlaping revisions from the different providers are handled correctly.
>
     def __repr__(self):
- - return "_StackedParentsProvider(%r)" % self._parent_providers
+ return "StackedParentsProvider(%r)" % self._parent_providers

^- we generally try to do:

return "%s(%r)" % (self.__class__.__name__, self._parent_providers)

so that you don't have to update these things, and so that child classes
automatically get named the right thing, too.

We might want to add:

@deprecated((0,1, 16)
def _StackedParentsProvider(*args, **kwargs):
  return StackedParentsProvider(*args, **kwargs)

I realize we don't *need* to by our contract rules. But where we can, it
is a lot nicer to start giving deprecation warnings, rather than causing
existing code to just start breaking.

John
=:->

 Review: approve

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkoeZFMACgkQJdeBCYSNAANTBQCcCGnzpFlAqI74sq5veUieoEOP
5BgAn2Jk/pRDdA+Vh/2ZUDS35bRo8kiC
=12aX
-----END PGP SIGNATURE-----

Revision history for this message
John A Meinel (jameinel) wrote :

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Gary van der Merwe wrote:
> Gary van der Merwe has proposed merging lp:~garyvdm/bzr/PublicStackedParentsProvider into lp:bzr.

The only thing I would mention is that we should add a single test that
exercises the deprecated function. So that we

1) Know that the deprecation warning is emitted
2) Know that the api still works.

This would be something like:
+
+ def test_stacked_parents_provider_overlapping(self):
+ # rev2 is availible in both providers.
+ # 1
+ # |
+ # 2
+ parents1 = _mod_graph.DictParentsProvider({'rev2': ['rev1']})
+ parents2 = _mod_graph.DictParentsProvider({'rev2': ['rev1']})
+ stacked = self.callDeprecated(deprecated_in(1, 16, 0),
+ _mod_graph._StackedParentsProvider(
...
+ self.assertEqual({'rev2': ['rev1']},
+ stacked.get_parent_map(['rev2']))

  Review: approve

Sorry I forgot to mention that before, but with that change, I think we
should land it.

John
=:->
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkofnqwACgkQJdeBCYSNAAN7ggCgllDFqwDus82fkVKnXUsXHzMI
trAAn3aZTmfxX/LF0AoWOt8Ps6h6gKBu
=HegE
-----END PGP SIGNATURE-----

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'bzrlib/bzrdir.py'
--- bzrlib/bzrdir.py 2009-05-23 04:55:52 +0000
+++ bzrlib/bzrdir.py 2009-05-29 08:35:09 +0000
@@ -2699,7 +2699,7 @@
2699 del ie.text_id2699 del ie.text_id
27002700
2701 def get_parent_map(self, revision_ids):2701 def get_parent_map(self, revision_ids):
2702 """See graph._StackedParentsProvider.get_parent_map"""2702 """See graph.StackedParentsProvider.get_parent_map"""
2703 return dict((revision_id, self.revisions[revision_id])2703 return dict((revision_id, self.revisions[revision_id])
2704 for revision_id in revision_ids2704 for revision_id in revision_ids
2705 if revision_id in self.revisions)2705 if revision_id in self.revisions)
27062706
=== modified file 'bzrlib/graph.py'
--- bzrlib/graph.py 2009-05-23 04:55:52 +0000
+++ bzrlib/graph.py 2009-05-29 08:35:09 +0000
@@ -20,10 +20,10 @@
20 debug,20 debug,
21 errors,21 errors,
22 revision,22 revision,
23 symbol_versioning,
24 trace,23 trace,
25 tsort,24 tsort,
26 )25 )
26from bzrlib.symbol_versioning import deprecated_function, deprecated_in
2727
28STEP_UNIQUE_SEARCHER_EVERY = 528STEP_UNIQUE_SEARCHER_EVERY = 5
2929
@@ -60,18 +60,25 @@
60 return 'DictParentsProvider(%r)' % self.ancestry60 return 'DictParentsProvider(%r)' % self.ancestry
6161
62 def get_parent_map(self, keys):62 def get_parent_map(self, keys):
63 """See _StackedParentsProvider.get_parent_map"""63 """See StackedParentsProvider.get_parent_map"""
64 ancestry = self.ancestry64 ancestry = self.ancestry
65 return dict((k, ancestry[k]) for k in keys if k in ancestry)65 return dict((k, ancestry[k]) for k in keys if k in ancestry)
6666
6767@deprecated_function(deprecated_in((0, 1, 16)))
68class _StackedParentsProvider(object):68def _StackedParentsProvider(*args, **kwargs):
6969 return StackedParentsProvider(*args, **kwargs)
70
71class StackedParentsProvider(object):
72 """A parents provider which stacks (or unions) multiple providers.
73
74 The providers are queries in the order of the provided parent_providers.
75 """
76
70 def __init__(self, parent_providers):77 def __init__(self, parent_providers):
71 self._parent_providers = parent_providers78 self._parent_providers = parent_providers
7279
73 def __repr__(self):80 def __repr__(self):
74 return "_StackedParentsProvider(%r)" % self._parent_providers81 return "%s(%r)" % (self.__class__.__name__, self._parent_providers)
7582
76 def get_parent_map(self, keys):83 def get_parent_map(self, keys):
77 """Get a mapping of keys => parents84 """Get a mapping of keys => parents
@@ -148,7 +155,7 @@
148 return dict(self._cache)155 return dict(self._cache)
149156
150 def get_parent_map(self, keys):157 def get_parent_map(self, keys):
151 """See _StackedParentsProvider.get_parent_map."""158 """See StackedParentsProvider.get_parent_map."""
152 cache = self._cache159 cache = self._cache
153 if cache is None:160 if cache is None:
154 cache = self._get_parent_map(keys)161 cache = self._get_parent_map(keys)
155162
=== modified file 'bzrlib/index.py'
--- bzrlib/index.py 2009-03-24 01:53:42 +0000
+++ bzrlib/index.py 2009-05-29 08:35:09 +0000
@@ -1192,7 +1192,7 @@
1192 ', '.join(map(repr, self._indices)))1192 ', '.join(map(repr, self._indices)))
11931193
1194 def get_parent_map(self, keys):1194 def get_parent_map(self, keys):
1195 """See graph._StackedParentsProvider.get_parent_map"""1195 """See graph.StackedParentsProvider.get_parent_map"""
1196 search_keys = set(keys)1196 search_keys = set(keys)
1197 if NULL_REVISION in search_keys:1197 if NULL_REVISION in search_keys:
1198 search_keys.discard(NULL_REVISION)1198 search_keys.discard(NULL_REVISION)
11991199
=== modified file 'bzrlib/remote.py'
--- bzrlib/remote.py 2009-05-10 23:45:33 +0000
+++ bzrlib/remote.py 2009-05-29 08:35:09 +0000
@@ -1566,7 +1566,7 @@
1566 providers.insert(0, other)1566 providers.insert(0, other)
1567 providers.extend(r._make_parents_provider() for r in1567 providers.extend(r._make_parents_provider() for r in
1568 self._fallback_repositories)1568 self._fallback_repositories)
1569 return graph._StackedParentsProvider(providers)1569 return graph.StackedParentsProvider(providers)
15701570
1571 def _serialise_search_recipe(self, recipe):1571 def _serialise_search_recipe(self, recipe):
1572 """Serialise a graph search recipe.1572 """Serialise a graph search recipe.
15731573
=== modified file 'bzrlib/repofmt/knitrepo.py'
--- bzrlib/repofmt/knitrepo.py 2009-04-09 20:23:07 +0000
+++ bzrlib/repofmt/knitrepo.py 2009-05-29 08:35:09 +0000
@@ -54,7 +54,7 @@
54 return 'KnitParentsProvider(%r)' % self._knit54 return 'KnitParentsProvider(%r)' % self._knit
5555
56 def get_parent_map(self, keys):56 def get_parent_map(self, keys):
57 """See graph._StackedParentsProvider.get_parent_map"""57 """See graph.StackedParentsProvider.get_parent_map"""
58 parent_map = {}58 parent_map = {}
59 for revision_id in keys:59 for revision_id in keys:
60 if revision_id is None:60 if revision_id is None:
@@ -85,7 +85,7 @@
85 return 'KnitsParentsProvider(%r)' % self._knit85 return 'KnitsParentsProvider(%r)' % self._knit
8686
87 def get_parent_map(self, keys):87 def get_parent_map(self, keys):
88 """See graph._StackedParentsProvider.get_parent_map"""88 """See graph.StackedParentsProvider.get_parent_map"""
89 parent_map = self._knit.get_parent_map(89 parent_map = self._knit.get_parent_map(
90 [self._prefix + (key,) for key in keys])90 [self._prefix + (key,) for key in keys])
91 result = {}91 result = {}
9292
=== modified file 'bzrlib/repository.py'
--- bzrlib/repository.py 2009-05-12 04:54:04 +0000
+++ bzrlib/repository.py 2009-05-29 08:35:09 +0000
@@ -2379,7 +2379,7 @@
2379 return self.control_files.get_transaction()2379 return self.control_files.get_transaction()
23802380
2381 def get_parent_map(self, revision_ids):2381 def get_parent_map(self, revision_ids):
2382 """See graph._StackedParentsProvider.get_parent_map"""2382 """See graph.StackedParentsProvider.get_parent_map"""
2383 # revisions index works in keys; this just works in revisions2383 # revisions index works in keys; this just works in revisions
2384 # therefore wrap and unwrap2384 # therefore wrap and unwrap
2385 query_keys = []2385 query_keys = []
@@ -2408,7 +2408,7 @@
2408 parents_provider = self._make_parents_provider()2408 parents_provider = self._make_parents_provider()
2409 if (other_repository is not None and2409 if (other_repository is not None and
2410 not self.has_same_location(other_repository)):2410 not self.has_same_location(other_repository)):
2411 parents_provider = graph._StackedParentsProvider(2411 parents_provider = graph.StackedParentsProvider(
2412 [parents_provider, other_repository._make_parents_provider()])2412 [parents_provider, other_repository._make_parents_provider()])
2413 return graph.Graph(parents_provider)2413 return graph.Graph(parents_provider)
24142414
24152415
=== modified file 'bzrlib/tests/test_graph.py'
--- bzrlib/tests/test_graph.py 2009-03-24 23:19:12 +0000
+++ bzrlib/tests/test_graph.py 2009-05-29 08:35:09 +0000
@@ -661,10 +661,11 @@
661 self.assertEqual((set(['e']), set(['f', 'g'])),661 self.assertEqual((set(['e']), set(['f', 'g'])),
662 graph.find_difference('e', 'f'))662 graph.find_difference('e', 'f'))
663663
664
664 def test_stacked_parents_provider(self):665 def test_stacked_parents_provider(self):
665 parents1 = _mod_graph.DictParentsProvider({'rev2': ['rev3']})666 parents1 = _mod_graph.DictParentsProvider({'rev2': ['rev3']})
666 parents2 = _mod_graph.DictParentsProvider({'rev1': ['rev4']})667 parents2 = _mod_graph.DictParentsProvider({'rev1': ['rev4']})
667 stacked = _mod_graph._StackedParentsProvider([parents1, parents2])668 stacked = _mod_graph.StackedParentsProvider([parents1, parents2])
668 self.assertEqual({'rev1':['rev4'], 'rev2':['rev3']},669 self.assertEqual({'rev1':['rev4'], 'rev2':['rev3']},
669 stacked.get_parent_map(['rev1', 'rev2']))670 stacked.get_parent_map(['rev1', 'rev2']))
670 self.assertEqual({'rev2':['rev3'], 'rev1':['rev4']},671 self.assertEqual({'rev2':['rev3'], 'rev1':['rev4']},
@@ -673,6 +674,17 @@
673 stacked.get_parent_map(['rev2', 'rev2']))674 stacked.get_parent_map(['rev2', 'rev2']))
674 self.assertEqual({'rev1':['rev4']},675 self.assertEqual({'rev1':['rev4']},
675 stacked.get_parent_map(['rev1', 'rev1']))676 stacked.get_parent_map(['rev1', 'rev1']))
677
678 def test_stacked_parents_provider_overlapping(self):
679 # rev2 is availible in both providers.
680 # 1
681 # |
682 # 2
683 parents1 = _mod_graph.DictParentsProvider({'rev2': ['rev1']})
684 parents2 = _mod_graph.DictParentsProvider({'rev2': ['rev1']})
685 stacked = _mod_graph.StackedParentsProvider([parents1, parents2])
686 self.assertEqual({'rev2': ['rev1']},
687 stacked.get_parent_map(['rev2']))
676688
677 def test_iter_topo_order(self):689 def test_iter_topo_order(self):
678 graph = self.make_graph(ancestry_1)690 graph = self.make_graph(ancestry_1)
679691
=== modified file 'bzrlib/versionedfile.py'
--- bzrlib/versionedfile.py 2009-04-29 17:02:36 +0000
+++ bzrlib/versionedfile.py 2009-05-29 08:35:09 +0000
@@ -40,7 +40,7 @@
40 revision,40 revision,
41 ui,41 ui,
42 )42 )
43from bzrlib.graph import DictParentsProvider, Graph, _StackedParentsProvider43from bzrlib.graph import DictParentsProvider, Graph, StackedParentsProvider
44from bzrlib.transport.memory import MemoryTransport44from bzrlib.transport.memory import MemoryTransport
45""")45""")
46from bzrlib.inter import InterObject46from bzrlib.inter import InterObject
@@ -1333,7 +1333,7 @@
1333 result[revision.NULL_REVISION] = ()1333 result[revision.NULL_REVISION] = ()
1334 self._providers = self._providers[:1] + self.fallback_versionedfiles1334 self._providers = self._providers[:1] + self.fallback_versionedfiles
1335 result.update(1335 result.update(
1336 _StackedParentsProvider(self._providers).get_parent_map(keys))1336 StackedParentsProvider(self._providers).get_parent_map(keys))
1337 for key, parents in result.iteritems():1337 for key, parents in result.iteritems():
1338 if parents == ():1338 if parents == ():
1339 result[key] = (revision.NULL_REVISION,)1339 result[key] = (revision.NULL_REVISION,)