245
247
self._ensure_real()
246
248
self._real_bzrdir.destroy_repository()
248
def create_branch(self, name=None):
250
def create_branch(self, name=None, repository=None):
249
251
# as per meta1 formats - just delegate to the format object which may
250
252
# be parameterised.
251
253
real_branch = self._format.get_branch_format().initialize(self,
254
name=name, repository=repository)
253
255
if not isinstance(real_branch, RemoteBranch):
254
result = RemoteBranch(self, self.find_repository(), real_branch,
256
if not isinstance(repository, RemoteRepository):
257
raise AssertionError(
258
'need a RemoteRepository to use with RemoteBranch, got %r'
260
result = RemoteBranch(self, repository, real_branch, name=name)
257
262
result = real_branch
258
263
# BzrDir.clone_on_transport() uses the result of create_branch but does
270
275
self._real_bzrdir.destroy_branch(name=name)
271
276
self._next_open_branch_result = None
273
def create_workingtree(self, revision_id=None, from_branch=None):
278
def create_workingtree(self, revision_id=None, from_branch=None,
279
accelerator_tree=None, hardlink=False):
274
280
raise errors.NotLocalUrl(self.transport.base)
276
def find_branch_format(self):
282
def find_branch_format(self, name=None):
277
283
"""Find the branch 'format' for this bzrdir.
279
285
This might be a synthetic object for e.g. RemoteBranch and SVN.
281
b = self.open_branch()
287
b = self.open_branch(name=name)
284
def get_branch_reference(self):
290
def get_branch_reference(self, name=None):
285
291
"""See BzrDir.get_branch_reference()."""
293
# XXX JRV20100304: Support opening colocated branches
294
raise errors.NoColocatedBranchSupport(self)
286
295
response = self._get_branch_reference()
287
296
if response[0] == 'ref':
288
297
return response[1]
319
328
raise errors.UnexpectedSmartServerResponse(response)
322
def _get_tree_branch(self):
331
def _get_tree_branch(self, name=None):
323
332
"""See BzrDir._get_tree_branch()."""
324
return None, self.open_branch()
333
return None, self.open_branch(name=name)
326
335
def open_branch(self, name=None, unsupported=False,
327
336
ignore_fallbacks=False):
896
905
def _has_same_fallbacks(self, other_repo):
897
906
"""Returns true if the repositories have the same fallbacks."""
898
907
# XXX: copied from Repository; it should be unified into a base class
899
# <https://bugs.edge.launchpad.net/bzr/+bug/401622>
908
# <https://bugs.launchpad.net/bzr/+bug/401622>
900
909
my_fb = self._fallback_repositories
901
910
other_fb = other_repo._fallback_repositories
902
911
if len(my_fb) != len(other_fb):
1313
1321
return self._real_repository.make_working_trees()
1315
1323
def refresh_data(self):
1316
"""Re-read any data needed to to synchronise with disk.
1324
"""Re-read any data needed to synchronise with disk.
1318
1326
This method is intended to be called after another repository instance
1319
1327
(such as one used by a smart server) has inserted data into the
1320
repository. It may not be called during a write group, but may be
1321
called at any other time.
1328
repository. On all repositories this will work outside of write groups.
1329
Some repository formats (pack and newer for bzrlib native formats)
1330
support refresh_data inside write groups. If called inside a write
1331
group on a repository that does not support refreshing in a write group
1332
IsInWriteGroupError will be raised.
1323
if self.is_in_write_group():
1324
raise errors.InternalBzrError(
1325
"May not refresh_data while in a write group.")
1326
1334
if self._real_repository is not None:
1327
1335
self._real_repository.refresh_data()
1978
1986
if response_tuple[0] != 'ok':
1979
1987
raise errors.UnexpectedSmartServerResponse(response_tuple)
1980
1988
byte_stream = response_handler.read_streamed_body()
1981
src_format, stream = smart_repo._byte_stream_to_stream(byte_stream)
1989
src_format, stream = smart_repo._byte_stream_to_stream(byte_stream,
1990
self._record_counter)
1982
1991
if src_format.network_name() != repo._format.network_name():
1983
1992
raise AssertionError(
1984
1993
"Mismatched RemoteRepository and stream src %r, %r" % (
2122
2131
# Turn the response into a RemoteRepository object.
2123
2132
format = RemoteBranchFormat(network_name=response[1])
2124
2133
repo_format = response_tuple_to_repo_format(response[3:])
2125
if response[2] == '':
2126
repo_bzrdir = a_bzrdir
2134
repo_path = response[2]
2135
if repository is not None:
2136
remote_repo_url = urlutils.join(medium.base, repo_path)
2137
url_diff = urlutils.relative_url(repository.user_url,
2140
raise AssertionError(
2141
'repository.user_url %r does not match URL from server '
2142
'response (%r + %r)'
2143
% (repository.user_url, medium.base, repo_path))
2144
remote_repo = repository
2128
repo_bzrdir = RemoteBzrDir(
2129
a_bzrdir.root_transport.clone(response[2]), a_bzrdir._format,
2131
remote_repo = RemoteRepository(repo_bzrdir, repo_format)
2147
repo_bzrdir = a_bzrdir
2149
repo_bzrdir = RemoteBzrDir(
2150
a_bzrdir.root_transport.clone(repo_path), a_bzrdir._format,
2152
remote_repo = RemoteRepository(repo_bzrdir, repo_format)
2132
2153
remote_branch = RemoteBranch(a_bzrdir, remote_repo,
2133
2154
format=format, setup_stacking=False, name=name)
2134
2155
# XXX: We know this is a new branch, so it must have revno 0, revid
2364
2385
self._ensure_real()
2365
2386
return self._real_branch._get_tags_bytes()
2367
2389
def _get_tags_bytes(self):
2390
if self._tags_bytes is None:
2391
self._tags_bytes = self._get_tags_bytes_via_hpss()
2392
return self._tags_bytes
2394
def _get_tags_bytes_via_hpss(self):
2368
2395
medium = self._client._medium
2369
2396
if medium._is_remote_before((1, 13)):
2370
2397
return self._vfs_get_tags_bytes()
2418
2446
repo_token = self.repository.lock_write().repository_token
2419
2447
self.repository.unlock()
2420
2448
err_context = {'token': token}
2421
response = self._call(
2422
'Branch.lock_write', self._remote_path(), branch_token,
2423
repo_token or '', **err_context)
2450
response = self._call(
2451
'Branch.lock_write', self._remote_path(), branch_token,
2452
repo_token or '', **err_context)
2453
except errors.LockContention, e:
2454
# The LockContention from the server doesn't have any
2455
# information about the lock_url. We re-raise LockContention
2456
# with valid lock_url.
2457
raise errors.LockContention('(remote lock)',
2458
self.repository.base.split('.bzr/')[0])
2424
2459
if response[0] != 'ok':
2425
2460
raise errors.UnexpectedSmartServerResponse(response)
2426
2461
ok, branch_token, repo_token = response
2787
2822
medium = self._branch._client._medium
2788
2823
if medium._is_remote_before((1, 14)):
2789
2824
return self._vfs_set_option(value, name, section)
2825
if isinstance(value, dict):
2826
if medium._is_remote_before((2, 2)):
2827
return self._vfs_set_option(value, name, section)
2828
return self._set_config_option_dict(value, name, section)
2830
return self._set_config_option(value, name, section)
2832
def _set_config_option(self, value, name, section):
2791
2834
path = self._branch._remote_path()
2792
2835
response = self._branch._client.call('Branch.set_config_option',
2793
2836
path, self._branch._lock_token, self._branch._repo_lock_token,
2794
2837
value.encode('utf8'), name, section or '')
2795
2838
except errors.UnknownSmartMethod:
2839
medium = self._branch._client._medium
2796
2840
medium._remember_remote_is_before((1, 14))
2797
2841
return self._vfs_set_option(value, name, section)
2798
2842
if response != ():
2799
2843
raise errors.UnexpectedSmartServerResponse(response)
2845
def _serialize_option_dict(self, option_dict):
2847
for key, value in option_dict.items():
2848
if isinstance(key, unicode):
2849
key = key.encode('utf8')
2850
if isinstance(value, unicode):
2851
value = value.encode('utf8')
2852
utf8_dict[key] = value
2853
return bencode.bencode(utf8_dict)
2855
def _set_config_option_dict(self, value, name, section):
2857
path = self._branch._remote_path()
2858
serialised_dict = self._serialize_option_dict(value)
2859
response = self._branch._client.call(
2860
'Branch.set_config_option_dict',
2861
path, self._branch._lock_token, self._branch._repo_lock_token,
2862
serialised_dict, name, section or '')
2863
except errors.UnknownSmartMethod:
2864
medium = self._branch._client._medium
2865
medium._remember_remote_is_before((2, 2))
2866
return self._vfs_set_option(value, name, section)
2868
raise errors.UnexpectedSmartServerResponse(response)
2801
2870
def _real_object(self):
2802
2871
self._branch._ensure_real()
2803
2872
return self._branch._real_branch