274
272
def create_workingtree(self, revision_id=None, from_branch=None):
275
273
raise errors.NotLocalUrl(self.transport.base)
277
def find_branch_format(self, name=None):
275
def find_branch_format(self):
278
276
"""Find the branch 'format' for this bzrdir.
280
278
This might be a synthetic object for e.g. RemoteBranch and SVN.
282
b = self.open_branch(name=name)
280
b = self.open_branch()
285
def get_branch_reference(self, name=None):
283
def get_branch_reference(self):
286
284
"""See BzrDir.get_branch_reference()."""
288
# XXX JRV20100304: Support opening colocated branches
289
raise errors.NoColocatedBranchSupport(self)
290
285
response = self._get_branch_reference()
291
286
if response[0] == 'ref':
292
287
return response[1]
323
318
raise errors.UnexpectedSmartServerResponse(response)
326
def _get_tree_branch(self, name=None):
321
def _get_tree_branch(self):
327
322
"""See BzrDir._get_tree_branch()."""
328
return None, self.open_branch(name=name)
323
return None, self.open_branch()
330
325
def open_branch(self, name=None, unsupported=False,
331
326
ignore_fallbacks=False):
698
692
# Additional places to query for data.
699
693
self._fallback_repositories = []
702
def user_transport(self):
703
return self.bzrdir.user_transport
706
def control_transport(self):
707
# XXX: Normally you shouldn't directly get at the remote repository
708
# transport, but I'm not sure it's worth making this method
709
# optional -- mbp 2010-04-21
710
return self.bzrdir.get_repository_transport(None)
712
695
def __str__(self):
713
696
return "%s(%s)" % (self.__class__.__name__, self.base)
900
883
def _has_same_fallbacks(self, other_repo):
901
884
"""Returns true if the repositories have the same fallbacks."""
902
885
# XXX: copied from Repository; it should be unified into a base class
903
# <https://bugs.launchpad.net/bzr/+bug/401622>
886
# <https://bugs.edge.launchpad.net/bzr/+bug/401622>
904
887
my_fb = self._fallback_repositories
905
888
other_fb = other_repo._fallback_repositories
906
889
if len(my_fb) != len(other_fb):
1256
1234
# _real_branch had its get_stacked_on_url method called), then the
1257
1235
# repository to be added may already be in the _real_repositories list.
1258
1236
if self._real_repository is not None:
1259
fallback_locations = [repo.user_url for repo in
1237
fallback_locations = [repo.bzrdir.root_transport.base for repo in
1260
1238
self._real_repository._fallback_repositories]
1261
if repository.user_url not in fallback_locations:
1239
if repository.bzrdir.root_transport.base not in fallback_locations:
1262
1240
self._real_repository.add_fallback_repository(repository)
1264
1242
def _check_fallback_repository(self, repository):
1316
1294
return self._real_repository.make_working_trees()
1318
1296
def refresh_data(self):
1319
"""Re-read any data needed to synchronise with disk.
1297
"""Re-read any data needed to to synchronise with disk.
1321
1299
This method is intended to be called after another repository instance
1322
1300
(such as one used by a smart server) has inserted data into the
1323
repository. On all repositories this will work outside of write groups.
1324
Some repository formats (pack and newer for bzrlib native formats)
1325
support refresh_data inside write groups. If called inside a write
1326
group on a repository that does not support refreshing in a write group
1327
IsInWriteGroupError will be raised.
1301
repository. It may not be called during a write group, but may be
1302
called at any other time.
1304
if self.is_in_write_group():
1305
raise errors.InternalBzrError(
1306
"May not refresh_data while in a write group.")
1329
1307
if self._real_repository is not None:
1330
1308
self._real_repository.refresh_data()
1981
1959
if response_tuple[0] != 'ok':
1982
1960
raise errors.UnexpectedSmartServerResponse(response_tuple)
1983
1961
byte_stream = response_handler.read_streamed_body()
1984
src_format, stream = smart_repo._byte_stream_to_stream(byte_stream,
1985
self._record_counter)
1962
src_format, stream = smart_repo._byte_stream_to_stream(byte_stream)
1986
1963
if src_format.network_name() != repo._format.network_name():
1987
1964
raise AssertionError(
1988
1965
"Mismatched RemoteRepository and stream src %r, %r" % (
2411
2383
self._real_branch.lock_read()
2413
2385
self._lock_count += 1
2414
return lock.LogicalLockResult(self.unlock)
2416
2387
def _remote_lock_write(self, token):
2417
2388
if token is None:
2418
2389
branch_token = repo_token = ''
2420
2391
branch_token = token
2421
repo_token = self.repository.lock_write().repository_token
2392
repo_token = self.repository.lock_write()
2422
2393
self.repository.unlock()
2423
2394
err_context = {'token': token}
2425
response = self._call(
2426
'Branch.lock_write', self._remote_path(), branch_token,
2427
repo_token or '', **err_context)
2428
except errors.LockContention, e:
2429
# The LockContention from the server doesn't have any
2430
# information about the lock_url. We re-raise LockContention
2431
# with valid lock_url.
2432
raise errors.LockContention('(remote lock)',
2433
self.repository.base.split('.bzr/')[0])
2395
response = self._call(
2396
'Branch.lock_write', self._remote_path(), branch_token,
2397
repo_token or '', **err_context)
2434
2398
if response[0] != 'ok':
2435
2399
raise errors.UnexpectedSmartServerResponse(response)
2436
2400
ok, branch_token, repo_token = response
2468
2432
self._lock_count += 1
2469
2433
# Re-lock the repository too.
2470
2434
self.repository.lock_write(self._repo_lock_token)
2471
return BranchWriteLockResult(self.unlock, self._lock_token or None)
2435
return self._lock_token or None
2473
2437
def _unlock(self, branch_token, repo_token):
2474
2438
err_context = {'token': str((branch_token, repo_token))}
2797
2761
medium = self._branch._client._medium
2798
2762
if medium._is_remote_before((1, 14)):
2799
2763
return self._vfs_set_option(value, name, section)
2800
if isinstance(value, dict):
2801
if medium._is_remote_before((2, 2)):
2802
return self._vfs_set_option(value, name, section)
2803
return self._set_config_option_dict(value, name, section)
2805
return self._set_config_option(value, name, section)
2807
def _set_config_option(self, value, name, section):
2809
2765
path = self._branch._remote_path()
2810
2766
response = self._branch._client.call('Branch.set_config_option',
2811
2767
path, self._branch._lock_token, self._branch._repo_lock_token,
2812
2768
value.encode('utf8'), name, section or '')
2813
2769
except errors.UnknownSmartMethod:
2814
medium = self._branch._client._medium
2815
2770
medium._remember_remote_is_before((1, 14))
2816
2771
return self._vfs_set_option(value, name, section)
2817
2772
if response != ():
2818
2773
raise errors.UnexpectedSmartServerResponse(response)
2820
def _serialize_option_dict(self, option_dict):
2822
for key, value in option_dict.items():
2823
if isinstance(key, unicode):
2824
key = key.encode('utf8')
2825
if isinstance(value, unicode):
2826
value = value.encode('utf8')
2827
utf8_dict[key] = value
2828
return bencode.bencode(utf8_dict)
2830
def _set_config_option_dict(self, value, name, section):
2832
path = self._branch._remote_path()
2833
serialised_dict = self._serialize_option_dict(value)
2834
response = self._branch._client.call(
2835
'Branch.set_config_option_dict',
2836
path, self._branch._lock_token, self._branch._repo_lock_token,
2837
serialised_dict, name, section or '')
2838
except errors.UnknownSmartMethod:
2839
medium = self._branch._client._medium
2840
medium._remember_remote_is_before((2, 2))
2841
return self._vfs_set_option(value, name, section)
2843
raise errors.UnexpectedSmartServerResponse(response)
2845
2775
def _real_object(self):
2846
2776
self._branch._ensure_real()
2847
2777
return self._branch._real_branch