62
def _find(self, path):
63
"""try to find a repository from path upwards
65
This operates precisely like 'bzrdir.find_repository'.
67
:return: (relpath, rich_root, tree_ref, external_lookup) flags. All are
68
strings, relpath is a / prefixed path, and the other three are
70
:raises errors.NoRepositoryPresent: When there is no repository
73
bzrdir = BzrDir.open_from_transport(
74
self.transport_from_client_path(path))
75
repository = bzrdir.find_repository()
76
# the relpath of the bzrdir in the found repository gives us the
62
def _format_to_capabilities(self, repo_format):
63
rich_root = self._boolean_to_yes_no(repo_format.rich_root_data)
64
tree_ref = self._boolean_to_yes_no(
65
repo_format.supports_tree_reference)
66
external_lookup = self._boolean_to_yes_no(
67
repo_format.supports_external_lookups)
68
return rich_root, tree_ref, external_lookup
70
def _repo_relpath(self, current_transport, repository):
71
"""Get the relative path for repository from current_transport."""
72
# the relpath of the bzrdir in the found repository gives us the
77
73
# path segments to pop-out.
78
74
relpath = repository.bzrdir.root_transport.relpath(
79
bzrdir.root_transport.base)
75
current_transport.base)
81
77
segments = ['..'] * len(relpath.split('/'))
84
rich_root = self._boolean_to_yes_no(repository.supports_rich_root())
85
tree_ref = self._boolean_to_yes_no(
86
repository._format.supports_tree_reference)
87
external_lookup = self._boolean_to_yes_no(
88
repository._format.supports_external_lookups)
89
return '/'.join(segments), rich_root, tree_ref, external_lookup
80
return '/'.join(segments)
83
class SmartServerRequestCreateBranch(SmartServerRequestBzrDir):
85
def do(self, path, network_name):
86
"""Create a branch in the bzr dir at path.
88
This operates precisely like 'bzrdir.create_branch'.
90
If a bzrdir is not present, an exception is propogated
91
rather than 'no branch' because these are different conditions (and
92
this method should only be called after establishing that a bzr dir
95
This is the initial version of this method introduced to the smart
98
:param path: The path to the bzrdir.
99
:param network_name: The network name of the branch type to create.
100
:return: (ok, network_name)
102
bzrdir = BzrDir.open_from_transport(
103
self.transport_from_client_path(path))
104
format = branch.network_format_registry.get(network_name)
105
bzrdir.branch_format = format
106
result = format.initialize(bzrdir)
107
rich_root, tree_ref, external_lookup = self._format_to_capabilities(
108
result.repository._format)
109
branch_format = result._format.network_name()
110
repo_format = result.repository._format.network_name()
111
repo_path = self._repo_relpath(bzrdir.root_transport,
113
# branch format, repo relpath, rich_root, tree_ref, external_lookup,
115
return SuccessfulSmartServerResponse(('ok', branch_format, repo_path,
116
rich_root, tree_ref, external_lookup, repo_format))
119
class SmartServerRequestCreateRepository(SmartServerRequestBzrDir):
121
def do(self, path, network_name, shared):
122
"""Create a repository in the bzr dir at path.
124
This operates precisely like 'bzrdir.create_repository'.
126
If a bzrdir is not present, an exception is propogated
127
rather than 'no branch' because these are different conditions (and
128
this method should only be called after establishing that a bzr dir
131
This is the initial version of this method introduced to the smart
134
:param path: The path to the bzrdir.
135
:param network_name: The network name of the repository type to create.
136
:param shared: The value to pass create_repository for the shared
138
:return: (ok, rich_root, tree_ref, external_lookup, network_name)
140
bzrdir = BzrDir.open_from_transport(
141
self.transport_from_client_path(path))
142
shared = shared == 'True'
143
format = repository.network_format_registry.get(network_name)
144
bzrdir.repository_format = format
145
result = format.initialize(bzrdir, shared=shared)
146
rich_root, tree_ref, external_lookup = self._format_to_capabilities(
148
return SuccessfulSmartServerResponse(('ok', rich_root, tree_ref,
149
external_lookup, result._format.network_name()))
152
class SmartServerRequestFindRepository(SmartServerRequestBzrDir):
154
def _find(self, path):
155
"""try to find a repository from path upwards
157
This operates precisely like 'bzrdir.find_repository'.
159
:return: (relpath, rich_root, tree_ref, external_lookup, network_name).
160
All are strings, relpath is a / prefixed path, the next three are
161
either 'yes' or 'no', and the last is a repository format network
163
:raises errors.NoRepositoryPresent: When there is no repository
166
bzrdir = BzrDir.open_from_transport(
167
self.transport_from_client_path(path))
168
repository = bzrdir.find_repository()
169
path = self._repo_relpath(bzrdir.root_transport, repository)
170
rich_root, tree_ref, external_lookup = self._format_to_capabilities(
172
network_name = repository._format.network_name()
173
return path, rich_root, tree_ref, external_lookup, network_name
92
176
class SmartServerRequestFindRepositoryV1(SmartServerRequestFindRepository):
94
178
def do(self, path):
95
179
"""try to find a repository from path upwards
97
181
This operates precisely like 'bzrdir.find_repository'.
99
183
If a bzrdir is not present, an exception is propogated
100
184
rather than 'no branch' because these are different conditions.
126
210
returns information about the supports_external_lookups format
129
:return: norepository or ok, relpath.
213
:return: norepository or ok, relpath, rich_root, tree_ref,
132
path, rich_root, tree_ref, external_lookup = self._find(path)
217
path, rich_root, tree_ref, external_lookup, name = self._find(path)
133
218
return SuccessfulSmartServerResponse(
134
219
('ok', path, rich_root, tree_ref, external_lookup))
135
220
except errors.NoRepositoryPresent:
136
221
return FailedSmartServerResponse(('norepository', ))
224
class SmartServerRequestFindRepositoryV3(SmartServerRequestFindRepository):
227
"""try to find a repository from path upwards
229
This operates precisely like 'bzrdir.find_repository'.
231
If a bzrdir is not present, an exception is propogated
232
rather than 'no branch' because these are different conditions.
234
This is the third edition of this method introduced in bzr 1.13, which
235
returns information about the network name of the repository format.
237
:return: norepository or ok, relpath, rich_root, tree_ref,
238
external_lookup, network_name.
241
path, rich_root, tree_ref, external_lookup, name = self._find(path)
242
return SuccessfulSmartServerResponse(
243
('ok', path, rich_root, tree_ref, external_lookup, name))
244
except errors.NoRepositoryPresent:
245
return FailedSmartServerResponse(('norepository', ))
139
248
class SmartServerRequestInitializeBzrDir(SmartServerRequest):
141
250
def do(self, path):