22
22
from bzrlib import branch, errors, repository
23
23
from bzrlib.bzrdir import BzrDir, BzrDirFormat, RemoteBzrDirFormat
24
from bzrlib.branch import Branch, BranchFormat
25
from bzrlib.smart import client
24
from bzrlib.branch import Branch, BranchFormat, BranchReferenceFormat
25
from bzrlib.smart import client, vfs
26
26
from bzrlib.trace import mutter
27
27
from bzrlib.urlutils import unescape
39
39
# XXX: We should go into find_format, but not allow it to find
40
40
# RemoteBzrDirFormat and make sure it finds the real underlying format.
42
# THIS IS A COMPLETE AND UTTER LIE.
43
# XXX: XXX: XXX: must be removed before merging to mainline
44
# SMART_SERVER_MERGE_BLOCKER
42
45
default_format = BzrDirFormat.get_default_format()
43
46
self._real_bzrdir = default_format.open(transport, _found=True)
44
path = unescape(urlparse(transport.base)[2])
47
path = self._path_for_remote_call()
45
48
#self._real_bzrdir._format.probe_transport(transport)
46
49
response = client.SmartClient(self.client).call('probe_dont_use', path)
47
50
if response == ('no',):
62
65
real_workingtree = self._real_bzrdir.create_workingtree(revision_id=revision_id)
63
66
return RemoteWorkingTree(self, real_workingtree)
68
def open_branch(self, _unsupported=False):
69
assert _unsupported == False, 'unsupported flag support not implemented yet.'
70
path = self._path_for_remote_call()
71
response = client.SmartClient(self.client).call('BzrDir.open_branch', path)
72
assert response[0] == 'ok', 'unexpected response code %s' % response[0]
73
if response[0] != 'ok':
74
# this should probably be a regular translate no ?
75
raise errors.NotBranchError(path=self.root_transport.base)
77
# branch at this location.
79
# if the VFS is enabled, create a local object using the VFS.
80
real_branch = self._real_bzrdir.open_branch(unsupported=_unsupported)
81
# This branch accessed through the smart server, so wrap the
83
real_repository = real_branch.repository
84
remote_repository = RemoteRepository(self, real_repository)
85
return RemoteBranch(self, remote_repository, real_branch)
87
# otherwise just create a proxy for the branch.
88
return RemoteBranch(self, self.find_repository())
90
# a branch reference, use the existing BranchReference logic.
91
format = BranchReferenceFormat()
92
return format.open(self, _found=True, location=response[1])
65
94
def open_repository(self):
66
95
return RemoteRepository(self, self._real_bzrdir.open_repository())
68
def open_branch(self, _unsupported=False):
69
real_branch = self._real_bzrdir.open_branch(unsupported=_unsupported)
70
if real_branch.bzrdir is self._real_bzrdir:
71
# This branch accessed through the smart server, so wrap the
73
real_repository = real_branch.repository
74
remote_repository = RemoteRepository(self, real_repository)
75
return RemoteBranch(self, remote_repository, real_branch)
77
# We were redirected to somewhere else, so don't wrap.
80
97
def open_workingtree(self):
81
98
return RemoteWorkingTree(self, self._real_bzrdir.open_workingtree())
100
def _path_for_remote_call(self):
101
"""Return the path to be used for this bzrdir in a remote call."""
102
return unescape(urlparse(self.root_transport.base)[2])
83
104
def get_branch_transport(self, branch_format):
84
105
return self._real_bzrdir.get_branch_transport(branch_format)