[MERGE][BUG #214894] Repo.get_parent_map() correctness with mismatched servers
Andrew Bennetts
andrew at canonical.com
Thu May 1 00:38:54 BST 2008
John Arbash Meinel wrote:
[...]
> The attached patch fixes some compatibility issues.
>
> I don't have a test for it, because of the required configuration necessary to
> provoke this bug.
Here's a test for it. Thanks for explaining to me what the problem was.
The only change from your patch is the new test; the fix itself is untouched.
-Andrew.
-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: andrew.bennetts at canonical.com-20080430233632-\
# 0hrshmlsdhdkiwcq
# target_branch: http://bazaar-vcs.org/bzr/bzr.dev
# testament_sha1: c024f3527a2b5db55abe0ff319bb3e17fe8e1830
# timestamp: 2008-05-01 09:36:48 +1000
# source_branch: http://people.ubuntu.com/~andrew/bzr/johns-bug
# base_revision_id: pqm at pqm.ubuntu.com-20080429014232-4b86ax5pwynnf11i
#
# Begin patch
=== modified file 'NEWS'
--- NEWS 2008-04-28 06:24:16 +0000
+++ NEWS 2008-04-29 20:02:28 +0000
@@ -38,6 +38,11 @@
* Fix error about "attempt to add line-delta in non-delta knit".
(Andrew Bennetts, #217701)
+ * Pushing a branch in "dirstate" format (Branch5) over bzr+ssh would break
+ if the remote server was < version 1.2. This was due to a bug in the
+ RemoteRepository.get_parent_map() fallback code.
+ (John Arbash Meinel, #214894)
+
* Set SO_REUSEADDR on server sockets of ``bzr serve`` to avoid problems
rebinding the socket when starting the server a second time.
(John Arbash Meinel, Martin Pool, #164288)
=== modified file 'bzrlib/remote.py'
--- bzrlib/remote.py 2008-04-21 05:51:56 +0000
+++ bzrlib/remote.py 2008-04-29 20:02:28 +0000
@@ -823,7 +823,21 @@
# :- its because we're working with a deprecated server anyway, and
# the user will almost certainly have seen a warning about the
# server version already.
- return self.get_revision_graph()
+ rg = self.get_revision_graph()
+ # There is an api discrepency between get_parent_map and
+ # get_revision_graph. Specifically, a "key:()" pair in
+ # get_revision_graph just means a node has no parents. For
+ # "get_parent_map" it means the node is a ghost. So fix up the
+ # graph to correct this.
+ # https://bugs.launchpad.net/bzr/+bug/214894
+ # There is one other "bug" which is that ghosts in
+ # get_revision_graph() are not returned at all. But we won't worry
+ # about that for now.
+ for node_id, parent_ids in rg.iteritems():
+ if parent_ids == ():
+ rg[node_id] = (NULL_REVISION,)
+ rg[NULL_REVISION] = ()
+ return rg
keys = set(keys)
if NULL_REVISION in keys:
=== modified file 'bzrlib/tests/test_remote.py'
--- bzrlib/tests/test_remote.py 2008-04-08 07:44:39 +0000
+++ bzrlib/tests/test_remote.py 2008-04-30 23:36:32 +0000
@@ -829,6 +829,7 @@
transport_path = 'quack'
repo, client = self.setup_fake_client_and_repository(
responses, transport_path)
+ self.assertTrue(client._medium._remote_is_at_least_1_2)
rev_id = 'revision-id'
expected_deprecations = [
'bzrlib.remote.RemoteRepository.get_revision_graph was deprecated '
@@ -842,6 +843,36 @@
('call_expecting_body', 'Repository.get_revision_graph',
('quack/', ''))],
client._calls)
+ # The medium is now marked as being connected to an older server
+ self.assertFalse(client._medium._remote_is_at_least_1_2)
+
+ def test_get_parent_map_fallback_parentless_node(self):
+ """get_parent_map falls back to get_revision_graph on old servers. The
+ results from get_revision_graph are tweaked to match the get_parent_map
+ API.
+
+ Specifically, a "key:()" pair from get_revision_graph means "no
+ parents" for that key, which in get_parent_map results should be
+ represented as XXX.
+
+ This is the test for https://bugs.launchpad.net/bzr/+bug/214894
+ """
+ rev_id = 'revision-id'
+ responses = [(('ok',), rev_id)]
+ transport_path = 'quack'
+ repo, client = self.setup_fake_client_and_repository(
+ responses, transport_path)
+ client._medium._remote_is_at_least_1_2 = False
+ expected_deprecations = [
+ 'bzrlib.remote.RemoteRepository.get_revision_graph was deprecated '
+ 'in version 1.4.']
+ parents = self.callDeprecated(
+ expected_deprecations, repo.get_parent_map, [rev_id])
+ self.assertEqual(
+ [('call_expecting_body', 'Repository.get_revision_graph',
+ ('quack/', ''))],
+ client._calls)
+ self.assertEqual({rev_id: ('null:',)}, parents)
def test_get_parent_map_unexpected_response(self):
responses = [
# Begin bundle
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
More information about the bazaar
mailing list