17
17
"""Server-side bzrdir related request implmentations."""
20
from bzrlib import branch, errors, repository, urlutils
20
from bzrlib import branch, errors, repository
21
21
from bzrlib.bzrdir import (
55
56
return SuccessfulSmartServerResponse((answer,))
58
class SmartServerRequestOpenBzrDir_2_1(SmartServerRequest):
61
"""Is there a BzrDir present, and if so does it have a working tree?
66
t = self.transport_from_client_path(path)
67
except errors.PathNotChild:
68
# The client is trying to ask about a path that they have no access
70
return SuccessfulSmartServerResponse(('no',))
72
bd = BzrDir.open_from_transport(t)
73
except errors.NotBranchError:
77
if bd.has_workingtree():
81
return SuccessfulSmartServerResponse(answer)
84
59
class SmartServerRequestBzrDir(SmartServerRequest):
86
61
def do(self, path, *args):
89
64
self._bzrdir = BzrDir.open_from_transport(
90
65
self.transport_from_client_path(path))
91
except errors.NotBranchError, e:
92
return FailedSmartServerResponse(('nobranch',))
66
except errors.NotBranchError:
67
return FailedSmartServerResponse(('nobranch', ))
93
68
return self.do_bzrdir_request(*args)
95
70
def _boolean_to_yes_no(self, a_boolean):
379
354
def do(self, bzrdir_network_name, path, use_existing_dir, create_prefix,
380
355
force_new_repo, stacked_on, stack_on_pwd, repo_format_name,
381
356
make_working_trees, shared_repo):
382
"""Initialize a bzrdir at path as per
383
BzrDirFormat.initialize_on_transport_ex.
385
New in 1.16. (Replaces BzrDirFormat.initialize_ex verb from 1.15).
357
"""Initialize a bzrdir at path as per BzrDirFormat.initialize_ex
387
359
:return: return SuccessfulSmartServerResponse((repo_path, rich_root,
388
360
tree_ref, external_lookup, repo_network_name,
436
408
final_stack = final_stack or ''
437
409
final_stack_pwd = final_stack_pwd or ''
439
# We want this to be relative to the bzrdir.
441
final_stack_pwd = urlutils.relative_url(
442
target_transport.base, final_stack_pwd)
444
# Can't meaningfully return a root path.
445
if final_stack.startswith('/'):
446
client_path = self._root_client_path + final_stack[1:]
447
final_stack = urlutils.relative_url(
448
self._root_client_path, client_path)
449
final_stack_pwd = '.'
451
410
return SuccessfulSmartServerResponse((repo_path, rich_root, tree_ref,
452
411
external_lookup, repo_name, repo_bzrdir_name,
453
412
bzrdir._format.network_name(),
465
424
return SuccessfulSmartServerResponse(('ok', ''))
467
426
return SuccessfulSmartServerResponse(('ok', reference_url))
468
except errors.NotBranchError, e:
469
return FailedSmartServerResponse(('nobranch',))
427
except errors.NotBranchError:
428
return FailedSmartServerResponse(('nobranch', ))
472
431
class SmartServerRequestOpenBranchV2(SmartServerRequestBzrDir):
481
440
return SuccessfulSmartServerResponse(('branch', format))
483
442
return SuccessfulSmartServerResponse(('ref', reference_url))
484
except errors.NotBranchError, e:
485
return FailedSmartServerResponse(('nobranch',))
488
class SmartServerRequestOpenBranchV3(SmartServerRequestBzrDir):
490
def do_bzrdir_request(self):
491
"""Open a branch at path and return the reference or format.
493
This version introduced in 2.1.
495
Differences to SmartServerRequestOpenBranchV2:
496
* can return 2-element ('nobranch', extra), where 'extra' is a string
497
with an explanation like 'location is a repository'. Previously
498
a 'nobranch' response would never have more than one element.
501
reference_url = self._bzrdir.get_branch_reference()
502
if reference_url is None:
503
br = self._bzrdir.open_branch(ignore_fallbacks=True)
504
format = br._format.network_name()
505
return SuccessfulSmartServerResponse(('branch', format))
507
return SuccessfulSmartServerResponse(('ref', reference_url))
508
except errors.NotBranchError, e:
509
# Stringify the exception so that its .detail attribute will be
515
if detail.startswith(': '):
518
return FailedSmartServerResponse(resp)
443
except errors.NotBranchError:
444
return FailedSmartServerResponse(('nobranch', ))