Rev 4073: Get BzrDir.cloning_metadir working. in http://people.ubuntu.com/~robertc/baz2.0/branch.roundtrips
Robert Collins
robertc at robertcollins.net
Tue Mar 3 03:27:56 GMT 2009
At http://people.ubuntu.com/~robertc/baz2.0/branch.roundtrips
------------------------------------------------------------
revno: 4073
revision-id: robertc at robertcollins.net-20090303032751-ubyfhezgjul6y5ic
parent: robertc at robertcollins.net-20090303013422-cibt4toffn1f6i0h
committer: Robert Collins <robertc at robertcollins.net>
branch nick: branch.roundtrips
timestamp: Tue 2009-03-03 14:27:51 +1100
message:
Get BzrDir.cloning_metadir working.
=== modified file 'NEWS'
--- a/NEWS 2009-03-03 01:06:25 +0000
+++ b/NEWS 2009-03-03 03:27:51 +0000
@@ -140,6 +140,8 @@
plugins to have hooks called on non-stacked instances.
(Robert Collins, #334187)
+ * ``BzrDir.cloning_metadir`` now has a RPC call. (Robert Collins)
+
* ``BzrDirFormat.__str__`` now uses the human readable description
rather than the sometimes-absent disk label. (Robert Collins)
=== modified file 'bzrlib/bzrdir.py'
--- a/bzrlib/bzrdir.py 2009-03-03 01:06:25 +0000
+++ b/bzrlib/bzrdir.py 2009-03-03 03:27:51 +0000
@@ -2086,6 +2086,7 @@
def __init__(self):
self._workingtree_format = None
self._branch_format = None
+ self._repository_format = None
def __eq__(self, other):
if other.__class__ is not self.__class__:
@@ -2155,7 +2156,7 @@
def __return_repository_format(self):
"""Circular import protection."""
- if getattr(self, '_repository_format', None):
+ if self._repository_format:
return self._repository_format
from bzrlib.repository import RepositoryFormat
return RepositoryFormat.get_default_format()
=== modified file 'bzrlib/remote.py'
--- a/bzrlib/remote.py 2009-03-03 01:06:25 +0000
+++ b/bzrlib/remote.py 2009-03-03 03:27:51 +0000
@@ -112,7 +112,6 @@
raise errors.UnexpectedSmartServerResponse(response)
if response == ('no',):
raise errors.NotBranchError(path=transport.base)
- self._ensure_real()
def _ensure_real(self):
"""Ensure that there is a _real_bzrdir set.
@@ -134,9 +133,36 @@
self._next_open_branch_result = None
return BzrDir.break_lock(self)
- def cloning_metadir(self, stacked=False):
+ def _vfs_cloning_metadir(self, require_stacking=False):
self._ensure_real()
- return self._real_bzrdir.cloning_metadir(stacked)
+ return self._real_bzrdir.cloning_metadir(
+ require_stacking=require_stacking)
+
+ def cloning_metadir(self, require_stacking=False):
+ medium = self._client._medium
+ if medium._is_remote_before((1, 13)):
+ return self._vfs_cloning_metadir(require_stacking=require_stacking)
+ verb = 'BzrDir.cloning_metadir'
+ if require_stacking:
+ stacking = 'True'
+ else:
+ stacking = 'False'
+ path = self._path_for_remote_call(self._client)
+ try:
+ response = self._call(verb, path, stacking)
+ except errors.UnknownSmartMethod:
+ return self._vfs_cloning_metadir(require_stacking=require_stacking)
+ if len(response) != 3:
+ raise errors.UnexpectedSmartServerResponse(response)
+ control_name, repo_name, branch_name = response
+ format = bzrdir.network_format_registry.get(control_name)
+ if repo_name:
+ format.repository_format = repository.network_format_registry.get(
+ repo_name)
+ if branch_name:
+ format.set_branch_format(
+ branch.network_format_registry.get(branch_name))
+ return format
def create_repository(self, shared=False):
# as per meta1 formats - just delegate to the format object which may
=== modified file 'bzrlib/smart/bzrdir.py'
--- a/bzrlib/smart/bzrdir.py 2009-02-26 06:01:21 +0000
+++ b/bzrlib/smart/bzrdir.py 2009-03-03 03:27:51 +0000
@@ -18,7 +18,7 @@
from bzrlib import branch, errors, repository
-from bzrlib.bzrdir import BzrDir, BzrDirFormat
+from bzrlib.bzrdir import BzrDir, BzrDirFormat, BzrDirMetaFormat1
from bzrlib.smart.request import (
FailedSmartServerResponse,
SmartServerRequest,
@@ -53,6 +53,12 @@
class SmartServerRequestBzrDir(SmartServerRequest):
+ def do(self, path, *args):
+ """Open a BzrDir at path, and return self.do_bzrdir_request(*args)."""
+ self._bzrdir = BzrDir.open_from_transport(
+ self.transport_from_client_path(path))
+ return self.do_bzrdir_request(*args)
+
def _boolean_to_yes_no(self, a_boolean):
if a_boolean:
return 'yes'
@@ -80,6 +86,30 @@
return '/'.join(segments)
+class SmartServerBzrDirRequestCloningMetaDir(SmartServerRequestBzrDir):
+
+ def do_bzrdir_request(self, require_stacking):
+ """Get the format that should be used when cloning from this dir."""
+ if require_stacking == "True":
+ require_stacking = True
+ else:
+ require_stacking = False
+ control_format = self._bzrdir.cloning_metadir(
+ require_stacking=require_stacking)
+ control_name = control_format.network_name()
+ # XXX: Should be a method that tells us this, or delegated to the
+ # format, or something.
+ if isinstance(control_format, BzrDirMetaFormat1):
+ branch_name = control_format.get_branch_format().network_name()
+ repository_name = control_format.repository_format.network_name()
+ else:
+ # Only MetaDir has delegated formats today.
+ branch_name = ''
+ repository_name = ''
+ return SuccessfulSmartServerResponse((control_name, repository_name,
+ branch_name))
+
+
class SmartServerRequestCreateBranch(SmartServerRequestBzrDir):
def do(self, path, network_name):
=== modified file 'bzrlib/smart/request.py'
--- a/bzrlib/smart/request.py 2009-03-02 07:55:18 +0000
+++ b/bzrlib/smart/request.py 2009-03-03 03:27:51 +0000
@@ -408,6 +408,9 @@
request_handlers.register_lazy(
'Branch.unlock', 'bzrlib.smart.branch', 'SmartServerBranchRequestUnlock')
request_handlers.register_lazy(
+ 'BzrDir.cloning_metadir', 'bzrlib.smart.bzrdir',
+ 'SmartServerBzrDirRequestCloningMetaDir')
+request_handlers.register_lazy(
'BzrDir.create_branch', 'bzrlib.smart.bzrdir', 'SmartServerRequestCreateBranch')
request_handlers.register_lazy(
'BzrDir.create_repository', 'bzrlib.smart.bzrdir', 'SmartServerRequestCreateRepository')
=== modified file 'bzrlib/tests/blackbox/test_branch.py'
--- a/bzrlib/tests/blackbox/test_branch.py 2009-03-02 03:38:07 +0000
+++ b/bzrlib/tests/blackbox/test_branch.py 2009-03-03 03:27:51 +0000
@@ -273,7 +273,7 @@
# being too low. If rpc_count increases, more network roundtrips have
# become necessary for this use case. Please do not adjust this number
# upwards without agreement from bzr's network support maintainers.
- self.assertEqual(99, rpc_count)
+ self.assertEqual(95, rpc_count)
def test_branch_from_trivial_branch_streaming_acceptance(self):
self.setup_smart_server_with_call_log()
@@ -289,7 +289,7 @@
# being too low. If rpc_count increases, more network roundtrips have
# become necessary for this use case. Please do not adjust this number
# upwards without agreement from bzr's network support maintainers.
- self.assertEqual(25, rpc_count)
+ self.assertEqual(21, rpc_count)
class TestRemoteBranch(TestCaseWithSFTPServer):
=== modified file 'bzrlib/tests/branch_implementations/test_push.py'
--- a/bzrlib/tests/branch_implementations/test_push.py 2009-03-03 01:34:22 +0000
+++ b/bzrlib/tests/branch_implementations/test_push.py 2009-03-03 03:27:51 +0000
@@ -418,7 +418,6 @@
self.empty_branch.push(target)
self.assertEqual(
['BzrDir.open',
- 'get',
'BzrDir.open_branch',
'BzrDir.find_repositoryV3',
'Branch.get_stacked_on_url',
=== modified file 'bzrlib/tests/bzrdir_implementations/test_bzrdir.py'
--- a/bzrlib/tests/bzrdir_implementations/test_bzrdir.py 2009-03-03 01:06:25 +0000
+++ b/bzrlib/tests/bzrdir_implementations/test_bzrdir.py 2009-03-03 03:27:51 +0000
@@ -1169,8 +1169,6 @@
# All control formats must have a network name.
dir = self.make_bzrdir('.')
format = dir._format
- network_name = format.network_name()
- self.assertIsInstance(network_name, str)
# We want to test that the network_name matches the actual format on
# disk. For local control dirsthat means that using network_name as a
# key in the registry gives back the same format. For remote obects
@@ -1179,11 +1177,15 @@
if isinstance(format, bzrdir.RemoteBzrDirFormat):
dir._ensure_real()
real_dir = dir._real_bzrdir
+ network_name = format.network_name()
self.assertEqual(real_dir._format.network_name(), network_name)
else:
registry = bzrdir.network_format_registry
+ network_name = format.network_name()
looked_up_format = registry.get(network_name)
self.assertEqual(format.__class__, looked_up_format.__class__)
+ # The network name must be a byte string.
+ self.assertIsInstance(network_name, str)
def test_open_not_bzrdir(self):
# test the formats specific behaviour for no-content or similar dirs.
=== modified file 'bzrlib/tests/test_remote.py'
--- a/bzrlib/tests/test_remote.py 2009-02-26 06:01:21 +0000
+++ b/bzrlib/tests/test_remote.py 2009-03-03 03:27:51 +0000
@@ -349,6 +349,43 @@
AssertionError, client_medium._remember_remote_is_before, (1, 9))
+class TestBzrDirCloningMetaDir(TestRemote):
+
+ def test_backwards_compat(self):
+ self.setup_smart_server_with_call_log()
+ a_dir = self.make_bzrdir('.')
+ self.reset_smart_call_log()
+ verb = 'BzrDir.cloning_metadir'
+ self.disable_verb(verb)
+ format = a_dir.cloning_metadir()
+ call_count = len([call for call in self.hpss_calls if
+ call[0].method == verb])
+ self.assertEqual(1, call_count)
+
+ def test_current_server(self):
+ transport = self.get_transport('.')
+ transport = transport.clone('quack')
+ self.make_bzrdir('quack')
+ client = FakeClient(transport.base)
+ reference_bzrdir_format = bzrdir.format_registry.get('default')()
+ control_name = reference_bzrdir_format.network_name()
+ client.add_expected_call(
+ 'BzrDir.cloning_metadir', ('quack/', 'False'),
+ 'success', (control_name, '', '')),
+ a_bzrdir = RemoteBzrDir(transport, remote.RemoteBzrDirFormat(),
+ _client=client)
+ result = a_bzrdir.cloning_metadir()
+ # We should have got a reference control dir with default branch and
+ # repository formats.
+ # This pokes a little, just to be sure.
+ self.assertEqual(bzrdir.BzrDirMetaFormat1, type(result))
+ self.assertEqual(reference_bzrdir_format.repository_format,
+ result._repository_format)
+ self.assertEqual(reference_bzrdir_format.get_branch_format(),
+ result._branch_format)
+ client.finished_test()
+
+
class TestBzrDirOpenBranch(TestRemote):
def test_branch_present(self):
=== modified file 'bzrlib/tests/test_smart.py'
--- a/bzrlib/tests/test_smart.py 2009-03-02 07:13:41 +0000
+++ b/bzrlib/tests/test_smart.py 2009-03-03 03:27:51 +0000
@@ -38,7 +38,8 @@
)
from bzrlib.branch import Branch, BranchReferenceFormat
import bzrlib.smart.branch
-import bzrlib.smart.bzrdir
+import bzrlib.smart.bzrdir, bzrlib.smart.bzrdir as smart_dir
+import bzrlib.smart.packrepository
import bzrlib.smart.repository
from bzrlib.smart.request import (
FailedSmartServerResponse,
@@ -162,6 +163,24 @@
request.transport_from_client_path('foo/').base)
+class TestSmartServerBzrDirRequestCloningMetaDir(
+ tests.TestCaseWithMemoryTransport):
+ """Tests for BzrDir.cloning_metadir."""
+
+ def test_cloning_metadir(self):
+ """When there is a bzrdir present, the call succeeds."""
+ backing = self.get_transport()
+ dir = self.make_bzrdir('.')
+ local_result = dir.cloning_metadir()
+ request_class = smart_dir.SmartServerBzrDirRequestCloningMetaDir
+ request = request_class(backing)
+ expected = SuccessfulSmartServerResponse(
+ (local_result.network_name(),
+ local_result.repository_format.network_name(),
+ local_result.get_branch_format().network_name()))
+ self.assertEqual(expected, request.execute('', 'False'))
+
+
class TestSmartServerRequestCreateRepository(tests.TestCaseWithMemoryTransport):
"""Tests for BzrDir.create_repository."""
@@ -1176,6 +1195,9 @@
smart.request.request_handlers.get('BzrDirFormat.initialize'),
smart.bzrdir.SmartServerRequestInitializeBzrDir)
self.assertEqual(
+ smart.request.request_handlers.get('BzrDir.cloning_metadir'),
+ smart.bzrdir.SmartServerBzrDirRequestCloningMetaDir)
+ self.assertEqual(
smart.request.request_handlers.get('BzrDir.open_branch'),
smart.bzrdir.SmartServerRequestOpenBranch)
self.assertEqual(
More information about the bazaar-commits
mailing list