272
273
def create_workingtree(self, revision_id=None, from_branch=None):
273
274
raise errors.NotLocalUrl(self.transport.base)
275
def find_branch_format(self):
276
def find_branch_format(self, name=None):
276
277
"""Find the branch 'format' for this bzrdir.
278
279
This might be a synthetic object for e.g. RemoteBranch and SVN.
280
b = self.open_branch()
281
b = self.open_branch(name=name)
283
def get_branch_reference(self):
284
def get_branch_reference(self, name=None):
284
285
"""See BzrDir.get_branch_reference()."""
287
# XXX JRV20100304: Support opening colocated branches
288
raise errors.NoColocatedBranchSupport(self)
285
289
response = self._get_branch_reference()
286
290
if response[0] == 'ref':
287
291
return response[1]
318
322
raise errors.UnexpectedSmartServerResponse(response)
321
def _get_tree_branch(self):
325
def _get_tree_branch(self, name=None):
322
326
"""See BzrDir._get_tree_branch()."""
323
return None, self.open_branch()
327
return None, self.open_branch(name=name)
325
329
def open_branch(self, name=None, unsupported=False,
326
330
ignore_fallbacks=False):
895
899
def _has_same_fallbacks(self, other_repo):
896
900
"""Returns true if the repositories have the same fallbacks."""
897
901
# XXX: copied from Repository; it should be unified into a base class
898
# <https://bugs.edge.launchpad.net/bzr/+bug/401622>
902
# <https://bugs.launchpad.net/bzr/+bug/401622>
899
903
my_fb = self._fallback_repositories
900
904
other_fb = other_repo._fallback_repositories
901
905
if len(my_fb) != len(other_fb):
1306
1315
return self._real_repository.make_working_trees()
1308
1317
def refresh_data(self):
1309
"""Re-read any data needed to to synchronise with disk.
1318
"""Re-read any data needed to synchronise with disk.
1311
1320
This method is intended to be called after another repository instance
1312
1321
(such as one used by a smart server) has inserted data into the
1313
repository. It may not be called during a write group, but may be
1314
called at any other time.
1322
repository. On all repositories this will work outside of write groups.
1323
Some repository formats (pack and newer for bzrlib native formats)
1324
support refresh_data inside write groups. If called inside a write
1325
group on a repository that does not support refreshing in a write group
1326
IsInWriteGroupError will be raised.
1316
if self.is_in_write_group():
1317
raise errors.InternalBzrError(
1318
"May not refresh_data while in a write group.")
1319
1328
if self._real_repository is not None:
1320
1329
self._real_repository.refresh_data()
1971
1980
if response_tuple[0] != 'ok':
1972
1981
raise errors.UnexpectedSmartServerResponse(response_tuple)
1973
1982
byte_stream = response_handler.read_streamed_body()
1974
src_format, stream = smart_repo._byte_stream_to_stream(byte_stream)
1983
src_format, stream = smart_repo._byte_stream_to_stream(byte_stream,
1984
self._record_counter)
1975
1985
if src_format.network_name() != repo._format.network_name():
1976
1986
raise AssertionError(
1977
1987
"Mismatched RemoteRepository and stream src %r, %r" % (
2396
2410
self._real_branch.lock_read()
2398
2412
self._lock_count += 1
2413
return lock.LogicalLockResult(self.unlock)
2400
2415
def _remote_lock_write(self, token):
2401
2416
if token is None:
2402
2417
branch_token = repo_token = ''
2404
2419
branch_token = token
2405
repo_token = self.repository.lock_write()
2420
repo_token = self.repository.lock_write().repository_token
2406
2421
self.repository.unlock()
2407
2422
err_context = {'token': token}
2408
response = self._call(
2409
'Branch.lock_write', self._remote_path(), branch_token,
2410
repo_token or '', **err_context)
2424
response = self._call(
2425
'Branch.lock_write', self._remote_path(), branch_token,
2426
repo_token or '', **err_context)
2427
except errors.LockContention, e:
2428
# The LockContention from the server doesn't have any
2429
# information about the lock_url. We re-raise LockContention
2430
# with valid lock_url.
2431
raise errors.LockContention('(remote lock)',
2432
self.repository.base.split('.bzr/')[0])
2411
2433
if response[0] != 'ok':
2412
2434
raise errors.UnexpectedSmartServerResponse(response)
2413
2435
ok, branch_token, repo_token = response
2445
2467
self._lock_count += 1
2446
2468
# Re-lock the repository too.
2447
2469
self.repository.lock_write(self._repo_lock_token)
2448
return self._lock_token or None
2470
return BranchWriteLockResult(self.unlock, self._lock_token or None)
2450
2472
def _unlock(self, branch_token, repo_token):
2451
2473
err_context = {'token': str((branch_token, repo_token))}
2774
2796
medium = self._branch._client._medium
2775
2797
if medium._is_remote_before((1, 14)):
2776
2798
return self._vfs_set_option(value, name, section)
2799
if isinstance(value, dict):
2800
if medium._is_remote_before((2, 2)):
2801
return self._vfs_set_option(value, name, section)
2802
return self._set_config_option_dict(value, name, section)
2804
return self._set_config_option(value, name, section)
2806
def _set_config_option(self, value, name, section):
2778
2808
path = self._branch._remote_path()
2779
2809
response = self._branch._client.call('Branch.set_config_option',
2780
2810
path, self._branch._lock_token, self._branch._repo_lock_token,
2781
2811
value.encode('utf8'), name, section or '')
2782
2812
except errors.UnknownSmartMethod:
2813
medium = self._branch._client._medium
2783
2814
medium._remember_remote_is_before((1, 14))
2784
2815
return self._vfs_set_option(value, name, section)
2785
2816
if response != ():
2786
2817
raise errors.UnexpectedSmartServerResponse(response)
2819
def _serialize_option_dict(self, option_dict):
2821
for key, value in option_dict.items():
2822
if isinstance(key, unicode):
2823
key = key.encode('utf8')
2824
if isinstance(value, unicode):
2825
value = value.encode('utf8')
2826
utf8_dict[key] = value
2827
return bencode.bencode(utf8_dict)
2829
def _set_config_option_dict(self, value, name, section):
2831
path = self._branch._remote_path()
2832
serialised_dict = self._serialize_option_dict(value)
2833
response = self._branch._client.call(
2834
'Branch.set_config_option_dict',
2835
path, self._branch._lock_token, self._branch._repo_lock_token,
2836
serialised_dict, name, section or '')
2837
except errors.UnknownSmartMethod:
2838
medium = self._branch._client._medium
2839
medium._remember_remote_is_before((2, 2))
2840
return self._vfs_set_option(value, name, section)
2842
raise errors.UnexpectedSmartServerResponse(response)
2788
2844
def _real_object(self):
2789
2845
self._branch._ensure_real()
2790
2846
return self._branch._real_branch