14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
from __future__ import absolute_import
17
19
"""Server-side bzrdir related request implmentations."""
44
48
# clients that don't anticipate errors from this method.
47
default_format = BzrDirFormat.get_default_format()
48
real_bzrdir = default_format.open(t, _found=True)
51
bzr_prober = BzrProber()
50
real_bzrdir._format.probe_transport(t)
53
bzr_prober.probe_transport(t)
51
54
except (errors.NotBranchError, errors.UnknownFormatError):
84
87
class SmartServerRequestBzrDir(SmartServerRequest):
86
89
def do(self, path, *args):
87
"""Open a BzrDir at path, and return self.do_bzrdir_request(*args)."""
90
"""Open a BzrDir at path, and return `self.do_bzrdir_request(*args)`."""
89
92
self._bzrdir = BzrDir.open_from_transport(
90
93
self.transport_from_client_path(path))
119
122
return '/'.join(segments)
125
class SmartServerBzrDirRequestDestroyBranch(SmartServerRequestBzrDir):
127
def do_bzrdir_request(self, name=None):
128
"""Destroy the branch with the specified name.
131
:return: On success, 'ok'.
134
self._bzrdir.destroy_branch(name)
135
except errors.NotBranchError, e:
136
return FailedSmartServerResponse(('nobranch',))
137
return SuccessfulSmartServerResponse(('ok',))
140
class SmartServerBzrDirRequestHasWorkingTree(SmartServerRequestBzrDir):
142
def do_bzrdir_request(self, name=None):
143
"""Check whether there is a working tree present.
147
:return: If there is a working tree present, 'yes'.
150
if self._bzrdir.has_workingtree():
151
return SuccessfulSmartServerResponse(('yes', ))
153
return SuccessfulSmartServerResponse(('no', ))
156
class SmartServerBzrDirRequestDestroyRepository(SmartServerRequestBzrDir):
158
def do_bzrdir_request(self, name=None):
159
"""Destroy the repository.
163
:return: On success, 'ok'.
166
self._bzrdir.destroy_repository()
167
except errors.NoRepositoryPresent, e:
168
return FailedSmartServerResponse(('norepository',))
169
return SuccessfulSmartServerResponse(('ok',))
122
172
class SmartServerBzrDirRequestCloningMetaDir(SmartServerRequestBzrDir):
124
174
def do_bzrdir_request(self, require_stacking):
148
198
control_format = self._bzrdir.cloning_metadir(
149
199
require_stacking=require_stacking)
150
200
control_name = control_format.network_name()
151
# XXX: There should be a method that tells us that the format does/does
152
# not have subformats.
153
if isinstance(control_format, BzrDirMetaFormat1):
201
if not control_format.fixed_components:
154
202
branch_name = ('branch',
155
203
control_format.get_branch_format().network_name())
156
204
repository_name = control_format.repository_format.network_name()
213
class SmartServerBzrDirRequestCheckoutMetaDir(SmartServerRequestBzrDir):
214
"""Get the format to use for checkouts.
218
:return: on success, a 3-tuple of network names for (control,
219
repository, branch) directories, where '' signifies "not present".
220
If this BzrDir contains a branch reference then this will fail with
221
BranchReference; clients should resolve branch references before
222
calling this RPC (they should not try to create a checkout of a
226
def do_bzrdir_request(self):
228
branch_ref = self._bzrdir.get_branch_reference()
229
except errors.NotBranchError:
231
if branch_ref is not None:
232
# The server shouldn't try to resolve references, and it quite
233
# possibly can't reach them anyway. The client needs to resolve
234
# the branch reference to determine the cloning_metadir.
235
return FailedSmartServerResponse(('BranchReference',))
236
control_format = self._bzrdir.checkout_metadir()
237
control_name = control_format.network_name()
238
if not control_format.fixed_components:
239
branch_name = control_format.get_branch_format().network_name()
240
repo_name = control_format.repository_format.network_name()
244
return SuccessfulSmartServerResponse(
245
(control_name, repo_name, branch_name))
165
248
class SmartServerRequestCreateBranch(SmartServerRequestBzrDir):
167
250
def do(self, path, network_name):
180
263
:param path: The path to the bzrdir.
181
264
:param network_name: The network name of the branch type to create.
182
:return: (ok, network_name)
265
:return: ('ok', branch_format, repo_path, rich_root, tree_ref,
266
external_lookup, repo_format)
184
268
bzrdir = BzrDir.open_from_transport(
185
269
self.transport_from_client_path(path))
429
513
# It is returned locked, but we need to do the lock to get the lock
432
repo_lock_token = repo.lock_write() or ''
516
repo_lock_token = repo.lock_write().repository_token or ''
433
517
if repo_lock_token:
434
518
repo.leave_lock_in_place()