273
272
def create_workingtree(self, revision_id=None, from_branch=None):
274
273
raise errors.NotLocalUrl(self.transport.base)
276
def find_branch_format(self, name=None):
275
def find_branch_format(self):
277
276
"""Find the branch 'format' for this bzrdir.
279
278
This might be a synthetic object for e.g. RemoteBranch and SVN.
281
b = self.open_branch(name=name)
280
b = self.open_branch()
284
def get_branch_reference(self, name=None):
283
def get_branch_reference(self):
285
284
"""See BzrDir.get_branch_reference()."""
287
# XXX JRV20100304: Support opening colocated branches
288
raise errors.NoColocatedBranchSupport(self)
289
285
response = self._get_branch_reference()
290
286
if response[0] == 'ref':
291
287
return response[1]
322
318
raise errors.UnexpectedSmartServerResponse(response)
325
def _get_tree_branch(self, name=None):
321
def _get_tree_branch(self):
326
322
"""See BzrDir._get_tree_branch()."""
327
return None, self.open_branch(name=name)
323
return None, self.open_branch()
329
325
def open_branch(self, name=None, unsupported=False,
330
326
ignore_fallbacks=False):
899
895
def _has_same_fallbacks(self, other_repo):
900
896
"""Returns true if the repositories have the same fallbacks."""
901
897
# XXX: copied from Repository; it should be unified into a base class
902
# <https://bugs.launchpad.net/bzr/+bug/401622>
898
# <https://bugs.edge.launchpad.net/bzr/+bug/401622>
903
899
my_fb = self._fallback_repositories
904
900
other_fb = other_repo._fallback_repositories
905
901
if len(my_fb) != len(other_fb):
1315
1306
return self._real_repository.make_working_trees()
1317
1308
def refresh_data(self):
1318
"""Re-read any data needed to synchronise with disk.
1309
"""Re-read any data needed to to synchronise with disk.
1320
1311
This method is intended to be called after another repository instance
1321
1312
(such as one used by a smart server) has inserted data into the
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.
1313
repository. It may not be called during a write group, but may be
1314
called at any other time.
1316
if self.is_in_write_group():
1317
raise errors.InternalBzrError(
1318
"May not refresh_data while in a write group.")
1328
1319
if self._real_repository is not None:
1329
1320
self._real_repository.refresh_data()
1980
1971
if response_tuple[0] != 'ok':
1981
1972
raise errors.UnexpectedSmartServerResponse(response_tuple)
1982
1973
byte_stream = response_handler.read_streamed_body()
1983
src_format, stream = smart_repo._byte_stream_to_stream(byte_stream,
1984
self._record_counter)
1974
src_format, stream = smart_repo._byte_stream_to_stream(byte_stream)
1985
1975
if src_format.network_name() != repo._format.network_name():
1986
1976
raise AssertionError(
1987
1977
"Mismatched RemoteRepository and stream src %r, %r" % (
2410
2396
self._real_branch.lock_read()
2412
2398
self._lock_count += 1
2413
return lock.LogicalLockResult(self.unlock)
2415
2400
def _remote_lock_write(self, token):
2416
2401
if token is None:
2417
2402
branch_token = repo_token = ''
2419
2404
branch_token = token
2420
repo_token = self.repository.lock_write().repository_token
2405
repo_token = self.repository.lock_write()
2421
2406
self.repository.unlock()
2422
2407
err_context = {'token': token}
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])
2408
response = self._call(
2409
'Branch.lock_write', self._remote_path(), branch_token,
2410
repo_token or '', **err_context)
2433
2411
if response[0] != 'ok':
2434
2412
raise errors.UnexpectedSmartServerResponse(response)
2435
2413
ok, branch_token, repo_token = response
2467
2445
self._lock_count += 1
2468
2446
# Re-lock the repository too.
2469
2447
self.repository.lock_write(self._repo_lock_token)
2470
return BranchWriteLockResult(self.unlock, self._lock_token or None)
2448
return self._lock_token or None
2472
2450
def _unlock(self, branch_token, repo_token):
2473
2451
err_context = {'token': str((branch_token, repo_token))}
2796
2774
medium = self._branch._client._medium
2797
2775
if medium._is_remote_before((1, 14)):
2798
2776
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):
2808
2778
path = self._branch._remote_path()
2809
2779
response = self._branch._client.call('Branch.set_config_option',
2810
2780
path, self._branch._lock_token, self._branch._repo_lock_token,
2811
2781
value.encode('utf8'), name, section or '')
2812
2782
except errors.UnknownSmartMethod:
2813
medium = self._branch._client._medium
2814
2783
medium._remember_remote_is_before((1, 14))
2815
2784
return self._vfs_set_option(value, name, section)
2816
2785
if response != ():
2817
2786
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)
2844
2788
def _real_object(self):
2845
2789
self._branch._ensure_real()
2846
2790
return self._branch._real_branch