45
45
class SmartServerRequestFindRepository(SmartServerRequest):
47
def _boolean_to_yes_no(self, a_boolean):
53
def _find(self, path):
48
54
"""try to find a repository from path upwards
50
56
This operates precisely like 'bzrdir.find_repository'.
52
If a bzrdir is not present, an exception is propogated
53
rather than 'no branch' because these are different conditions.
55
:return: norepository or ok, relpath.
58
:return: (relpath, rich_root, tree_ref, external_lookup) flags. All are
59
strings, relpath is a / prefixed path, and the other three are
61
:raises errors.NoRepositoryPresent: When there is no repository
57
64
bzrdir = BzrDir.open_from_transport(self._backing_transport.clone(path))
59
repository = bzrdir.find_repository()
60
# the relpath of the bzrdir in the found repository gives us the
61
# path segments to pop-out.
62
relpath = repository.bzrdir.root_transport.relpath(bzrdir.root_transport.base)
64
segments = ['..'] * len(relpath.split('/'))
67
if repository.supports_rich_root():
71
if repository._format.supports_tree_reference:
75
return SuccessfulSmartServerResponse(('ok', '/'.join(segments), rich_root, tree_ref))
65
repository = bzrdir.find_repository()
66
# the relpath of the bzrdir in the found repository gives us the
67
# path segments to pop-out.
68
relpath = repository.bzrdir.root_transport.relpath(bzrdir.root_transport.base)
70
segments = ['..'] * len(relpath.split('/'))
73
rich_root = self._boolean_to_yes_no(repository.supports_rich_root())
74
tree_ref = self._boolean_to_yes_no(
75
repository._format.supports_tree_reference)
76
external_lookup = self._boolean_to_yes_no(
77
repository._format.supports_external_lookups)
78
return '/'.join(segments), rich_root, tree_ref, external_lookup
81
class SmartServerRequestFindRepositoryV1(SmartServerRequestFindRepository):
84
"""try to find a repository from path upwards
86
This operates precisely like 'bzrdir.find_repository'.
88
If a bzrdir is not present, an exception is propogated
89
rather than 'no branch' because these are different conditions.
91
This is the initial version of this method introduced with the smart
92
server. Modern clients will try the V2 method that adds support for the
93
supports_external_lookups attribute.
95
:return: norepository or ok, relpath.
98
path, rich_root, tree_ref, external_lookup = self._find(path)
99
return SuccessfulSmartServerResponse(('ok', path, rich_root, tree_ref))
100
except errors.NoRepositoryPresent:
101
return FailedSmartServerResponse(('norepository', ))
104
class SmartServerRequestFindRepositoryV2(SmartServerRequestFindRepository):
107
"""try to find a repository from path upwards
109
This operates precisely like 'bzrdir.find_repository'.
111
If a bzrdir is not present, an exception is propogated
112
rather than 'no branch' because these are different conditions.
114
This is the second edition of this method introduced in bzr 1.3, which
115
returns information about the supports_external_lookups format
118
:return: norepository or ok, relpath.
121
path, rich_root, tree_ref, external_lookup = self._find(path)
122
return SuccessfulSmartServerResponse(
123
('ok', path, rich_root, tree_ref, external_lookup))
76
124
except errors.NoRepositoryPresent:
77
125
return FailedSmartServerResponse(('norepository', ))