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