Rev 2185: Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference. in http://bazaar.launchpad.net/~bzr/bzr/hpss

Robert Collins robertc at robertcollins.net
Thu Mar 29 03:15:19 BST 2007


At http://bazaar.launchpad.net/~bzr/bzr/hpss

------------------------------------------------------------
revno: 2185
revision-id: robertc at robertcollins.net-20070329021404-5fcofqw7m3znip04
parent: robertc at robertcollins.net-20070329015852-akojjr51k9273rp7
committer: Robert Collins <robertc at robertcollins.net>
branch nick: hpss
timestamp: Thu 2007-03-29 12:14:04 +1000
message:
  Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
modified:
  bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
  bzrlib/smart/bzrdir.py         bzrdir.py-20061122024551-ol0l0o0oofsu9b3t-1
  bzrlib/tests/repository_implementations/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
  bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
  bzrlib/tests/test_smart.py     test_smart.py-20061122024551-ol0l0o0oofsu9b3t-2
=== modified file 'bzrlib/remote.py'
--- a/bzrlib/remote.py	2007-03-27 11:33:12 +0000
+++ b/bzrlib/remote.py	2007-03-29 02:14:04 +0000
@@ -74,8 +74,8 @@
                 _found=True)
 
     def create_repository(self, shared=False):
-        return RemoteRepository(
-            self, self._real_bzrdir.create_repository(shared=shared))
+        self._real_bzrdir.create_repository(shared=shared)
+        return self.open_repository()
 
     def create_branch(self):
         real_branch = self._real_bzrdir.create_branch()
@@ -109,8 +109,12 @@
             'unexpected response code %s' % (response,)
         if response[0] == 'norepository':
             raise errors.NoRepositoryPresent(self)
+        assert len(response) == 4, 'incorrect response length %s' % (response,)
         if response[1] == '':
-            return RemoteRepository(self)
+            format = RemoteRepositoryFormat()
+            format.rich_root_data = response[2] == 'True'
+            format.support_tree_reference = response[3] == 'True'
+            return RemoteRepository(self, format)
         else:
             raise errors.NoRepositoryPresent(self)
 
@@ -150,10 +154,16 @@
 
 
 class RemoteRepositoryFormat(repository.RepositoryFormat):
-    """Format for repositories accessed over rpc.
+    """Format for repositories accessed over a SmartClient.
 
     Instances of this repository are represented by RemoteRepository
     instances.
+
+    The RemoteRepositoryFormat is parameterised during construction
+    to reflect the capabilities of the real, remote format. Specifically
+    the attributes rich_root_data and support_tree_reference are set
+    on a per instance basis, and are not set (and should not be) at
+    the class level.
     """
 
     _matchingbzrdir = RemoteBzrDirFormat
@@ -172,7 +182,14 @@
     def __eq__(self, other):
         return self.__class__ == other.__class__
 
-    rich_root_data = False
+    def check_conversion_target(self, target_format):
+        if self.rich_root_data and not target_format.rich_root_data:
+            raise errors.BadConversionTarget(
+                'Does not support rich root data.', target_format)
+        if (self.support_tree_reference and
+            not getattr(target_format, 'support_tree_reference', False)):
+            raise errors.BadConversionTarget(
+                'Does not support nested trees', target_format)
 
 
 class RemoteRepository(object):
@@ -182,10 +199,11 @@
     the transport.
     """
 
-    def __init__(self, remote_bzrdir, real_repository=None, _client=None):
+    def __init__(self, remote_bzrdir, format, real_repository=None, _client=None):
         """Create a RemoteRepository instance.
         
         :param remote_bzrdir: The bzrdir hosting this repository.
+        :param format: The RemoteFormat object to use.
         :param real_repository: If not None, a local implementation of the
             repository logic for the repository, usually accessing the data
             via the VFS.
@@ -201,7 +219,7 @@
             self._client = client.SmartClient(self.bzrdir._medium)
         else:
             self._client = _client
-        self._format = RemoteRepositoryFormat()
+        self._format = format
         self._lock_mode = None
         self._lock_token = None
         self._lock_count = 0

=== modified file 'bzrlib/smart/bzrdir.py'
--- a/bzrlib/smart/bzrdir.py	2006-11-29 03:43:35 +0000
+++ b/bzrlib/smart/bzrdir.py	2007-03-29 02:14:04 +0000
@@ -44,7 +44,15 @@
                 segments = ['..'] * len(relpath.split('/'))
             else:
                 segments = []
-            return SmartServerResponse(('ok', '/'.join(segments)))
+            if repository.supports_rich_root():
+                rich_root = 'True'
+            else:
+                rich_root = 'False'
+            if repository._format.support_tree_reference:
+                tree_ref = 'True'
+            else:
+                tree_ref = 'False'
+            return SmartServerResponse(('ok', '/'.join(segments), rich_root, tree_ref))
         except errors.NoRepositoryPresent:
             return SmartServerResponse(('norepository', ))
 

=== modified file 'bzrlib/tests/repository_implementations/test_repository.py'
--- a/bzrlib/tests/repository_implementations/test_repository.py	2007-03-29 01:58:52 +0000
+++ b/bzrlib/tests/repository_implementations/test_repository.py	2007-03-29 02:14:04 +0000
@@ -207,25 +207,26 @@
                    revision_id=None,
                    pb=bzrlib.progress.DummyProgress())
 
-    def test_fetch_knit2(self):
+    def test_fetch_knit3(self):
+        # create a repository of the sort we are testing.
         tree_a = self.make_branch_and_tree('a', '')
         self.build_tree(['a/foo'])
         tree_a.add('foo', 'file1')
         tree_a.commit('rev1', rev_id='rev1')
-        # fetch with a default limit (grab everything)
+        # create a knit-3 based format to fetch into
         f = bzrdir.format_registry.make_bzrdir('dirstate-with-subtree')
         try:
             format = tree_a.branch.repository._format
             format.check_conversion_target(f.repository_format)
+            # if we cannot convert data to knit3, skip the test.
         except errors.BadConversionTarget, e:
             raise TestSkipped(str(e))
         self.get_transport().mkdir('b')
         b_bzrdir = f.initialize(self.get_url('b'))
-        repo = b_bzrdir.create_repository()
-        repo.fetch(tree_a.branch.repository,
-                   revision_id=None,
-                   pb=bzrlib.progress.DummyProgress())
-        rev1_tree = repo.revision_tree('rev1')
+        knit3_repo = b_bzrdir.create_repository()
+        # fetch with a default limit (grab everything)
+        knit3_repo.fetch(tree_a.branch.repository, revision_id=None)
+        rev1_tree = knit3_repo.revision_tree('rev1')
         lines = rev1_tree.get_file_lines(rev1_tree.inventory.root.file_id)
         self.assertEqual([], lines)
         b_branch = b_bzrdir.create_branch()
@@ -236,7 +237,7 @@
             raise TestSkipped("cannot make working tree with transport %r"
                               % b_bzrdir.transport)
         tree_b.commit('no change', rev_id='rev2')
-        rev2_tree = repo.revision_tree('rev2')
+        rev2_tree = knit3_repo.revision_tree('rev2')
         self.assertEqual('rev1', rev2_tree.inventory.root.revision)
 
     def test_get_revision_delta(self):

=== modified file 'bzrlib/tests/test_remote.py'
--- a/bzrlib/tests/test_remote.py	2007-03-27 13:02:49 +0000
+++ b/bzrlib/tests/test_remote.py	2007-03-29 02:14:04 +0000
@@ -146,7 +146,7 @@
 class TestBzrDirOpenBranch(tests.TestCase):
 
     def test_branch_present(self):
-        client = FakeClient([(('ok', ''), ), (('ok', ''), )])
+        client = FakeClient([(('ok', ''), ), (('ok', '', 'False', 'False'), )])
         transport = MemoryTransport()
         transport.mkdir('quack')
         transport = transport.clone('quack')
@@ -170,6 +170,35 @@
             [('call', 'BzrDir.open_branch', ('///quack/',))],
             client._calls)
 
+    def check_open_repository(self, rich_root, subtrees):
+        if rich_root:
+            rich_response = 'True'
+        else:
+            rich_response = 'False'
+        if subtrees:
+            subtree_response = 'True'
+        else:
+            subtree_response = 'False'
+        client = FakeClient([(('ok', '', rich_response, subtree_response), ),])
+        transport = MemoryTransport()
+        transport.mkdir('quack')
+        transport = transport.clone('quack')
+        bzrdir = RemoteBzrDir(transport, _client=client)
+        result = bzrdir.open_repository()
+        self.assertEqual(
+            [('call', 'BzrDir.find_repository', ('///quack/',))],
+            client._calls)
+        self.assertIsInstance(result, RemoteRepository)
+        self.assertEqual(bzrdir, result.bzrdir)
+        self.assertEqual(rich_root, result._format.rich_root_data)
+        self.assertEqual(subtrees, result._format.support_tree_reference)
+
+    def test_open_repository_sets_format_attributes(self):
+        self.check_open_repository(True, True)
+        self.check_open_repository(False, True)
+        self.check_open_repository(True, False)
+        self.check_open_repository(False, False)
+
 
 class TestBranchLastRevisionInfo(tests.TestCase):
 
@@ -571,4 +600,3 @@
 
         # The remote repo shouldn't be accessed.
         self.assertEqual([], client._calls)
-

=== modified file 'bzrlib/tests/test_smart.py'
--- a/bzrlib/tests/test_smart.py	2007-03-13 05:52:01 +0000
+++ b/bzrlib/tests/test_smart.py	2007-03-29 02:14:04 +0000
@@ -54,6 +54,7 @@
 
 
 class TestSmartServerRequestFindRepository(tests.TestCaseWithTransport):
+    """Tests for BzrDir.find_repository."""
 
     def test_no_repository(self):
         """When there is no repository to be found, ('norepository', ) is returned."""
@@ -69,27 +70,53 @@
         # the repository is at.
         backing = self.get_transport()
         request = smart.bzrdir.SmartServerRequestFindRepository(backing)
-        self.make_repository('.')
-        self.assertEqual(SmartServerResponse(('ok', '')),
-            request.execute(backing.local_abspath('')))
+        result = self._make_repository_and_result()
+        self.assertEqual(result, request.execute(backing.local_abspath('')))
         self.make_bzrdir('subdir')
         self.assertEqual(SmartServerResponse(('norepository', )),
             request.execute(backing.local_abspath('subdir')))
 
+    def _make_repository_and_result(self, shared=False, format=None):
+        """Convenience function to setup a repository.
+
+        :result: The SmartServerResponse to expect when opening it.
+        """
+        repo = self.make_repository('.', shared=shared, format=format)
+        if repo.supports_rich_root():
+            rich_root = 'True'
+        else:
+            rich_root = 'False'
+        if repo._format.support_tree_reference:
+            subtrees = 'True'
+        else:
+            subtrees = 'False'
+        return SmartServerResponse(('ok', '', rich_root, subtrees))
+
     def test_shared_repository(self):
         """When there is a shared repository, we get 'ok', 'relpath-to-repo'."""
         backing = self.get_transport()
         request = smart.bzrdir.SmartServerRequestFindRepository(backing)
-        self.make_repository('.', shared=True)
-        self.assertEqual(SmartServerResponse(('ok', '')),
-            request.execute(backing.local_abspath('')))
+        result = self._make_repository_and_result(shared=True)
+        self.assertEqual(result, request.execute(backing.local_abspath('')))
         self.make_bzrdir('subdir')
-        self.assertEqual(SmartServerResponse(('ok', '..')),
+        result2 = SmartServerResponse(result.args[0:1] + ('..', ) + result.args[2:])
+        self.assertEqual(result2,
             request.execute(backing.local_abspath('subdir')))
         self.make_bzrdir('subdir/deeper')
-        self.assertEqual(SmartServerResponse(('ok', '../..')),
+        result3 = SmartServerResponse(result.args[0:1] + ('../..', ) + result.args[2:])
+        self.assertEqual(result3,
             request.execute(backing.local_abspath('subdir/deeper')))
 
+    def test_rich_root_and_subtree_encoding(self):
+        """Test for the format attributes for rich root and subtree support."""
+        backing = self.get_transport()
+        request = smart.bzrdir.SmartServerRequestFindRepository(backing)
+        result = self._make_repository_and_result(format='dirstate-with-subtree')
+        # check the test will be valid
+        self.assertEqual('True', result.args[2])
+        self.assertEqual('True', result.args[3])
+        self.assertEqual(result, request.execute(backing.local_abspath('')))
+
 
 class TestSmartServerRequestInitializeBzrDir(tests.TestCaseWithTransport):
 



More information about the bazaar-commits mailing list