1
# Copyright (C) 2006 Canonical Ltd
1
# Copyright (C) 2006-2010 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
45
47
# clients that don't anticipate errors from this method.
48
default_format = BzrDirFormat.get_default_format()
49
real_bzrdir = default_format.open(t, _found=True)
50
bzr_prober = BzrProber()
51
real_bzrdir._format.probe_transport(t)
52
bzr_prober.probe_transport(t)
52
53
except (errors.NotBranchError, errors.UnknownFormatError):
56
57
return SuccessfulSmartServerResponse((answer,))
60
class SmartServerRequestOpenBzrDir_2_1(SmartServerRequest):
63
"""Is there a BzrDir present, and if so does it have a working tree?
68
t = self.transport_from_client_path(path)
69
except errors.PathNotChild:
70
# The client is trying to ask about a path that they have no access
72
return SuccessfulSmartServerResponse(('no',))
74
bd = BzrDir.open_from_transport(t)
75
except errors.NotBranchError:
79
if bd.has_workingtree():
83
return SuccessfulSmartServerResponse(answer)
59
86
class SmartServerRequestBzrDir(SmartServerRequest):
61
88
def do(self, path, *args):
64
91
self._bzrdir = BzrDir.open_from_transport(
65
92
self.transport_from_client_path(path))
66
except errors.NotBranchError:
67
return FailedSmartServerResponse(('nobranch', ))
93
except errors.NotBranchError, e:
94
return FailedSmartServerResponse(('nobranch',))
68
95
return self.do_bzrdir_request(*args)
70
97
def _boolean_to_yes_no(self, a_boolean):
85
112
"""Get the relative path for repository from current_transport."""
86
113
# the relpath of the bzrdir in the found repository gives us the
87
114
# path segments to pop-out.
88
relpath = repository.bzrdir.root_transport.relpath(
115
relpath = repository.user_transport.relpath(
89
116
current_transport.base)
91
118
segments = ['..'] * len(relpath.split('/'))
404
431
# It is returned locked, but we need to do the lock to get the lock
407
repo_lock_token = repo.lock_write() or ''
434
repo_lock_token = repo.lock_write().repository_token or ''
408
435
if repo_lock_token:
409
436
repo.leave_lock_in_place()
440
467
return SuccessfulSmartServerResponse(('ok', ''))
442
469
return SuccessfulSmartServerResponse(('ok', reference_url))
443
except errors.NotBranchError:
444
return FailedSmartServerResponse(('nobranch', ))
470
except errors.NotBranchError, e:
471
return FailedSmartServerResponse(('nobranch',))
447
474
class SmartServerRequestOpenBranchV2(SmartServerRequestBzrDir):
456
483
return SuccessfulSmartServerResponse(('branch', format))
458
485
return SuccessfulSmartServerResponse(('ref', reference_url))
459
except errors.NotBranchError:
460
return FailedSmartServerResponse(('nobranch', ))
486
except errors.NotBranchError, e:
487
return FailedSmartServerResponse(('nobranch',))
490
class SmartServerRequestOpenBranchV3(SmartServerRequestBzrDir):
492
def do_bzrdir_request(self):
493
"""Open a branch at path and return the reference or format.
495
This version introduced in 2.1.
497
Differences to SmartServerRequestOpenBranchV2:
498
* can return 2-element ('nobranch', extra), where 'extra' is a string
499
with an explanation like 'location is a repository'. Previously
500
a 'nobranch' response would never have more than one element.
503
reference_url = self._bzrdir.get_branch_reference()
504
if reference_url is None:
505
br = self._bzrdir.open_branch(ignore_fallbacks=True)
506
format = br._format.network_name()
507
return SuccessfulSmartServerResponse(('branch', format))
509
return SuccessfulSmartServerResponse(('ref', reference_url))
510
except errors.NotBranchError, e:
511
# Stringify the exception so that its .detail attribute will be
517
if detail.startswith(': '):
520
return FailedSmartServerResponse(resp)