[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