/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/remote.py

  • Committer: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
    static_tuple,
34
34
    symbol_versioning,
35
35
)
36
 
from bzrlib.branch import BranchReferenceFormat, BranchWriteLockResult
 
36
from bzrlib.branch import BranchReferenceFormat
37
37
from bzrlib.bzrdir import BzrDir, RemoteBzrDirFormat
38
38
from bzrlib.decorators import needs_read_lock, needs_write_lock, only_raises
39
39
from bzrlib.errors import (
43
43
from bzrlib.lockable_files import LockableFiles
44
44
from bzrlib.smart import client, vfs, repository as smart_repo
45
45
from bzrlib.revision import ensure_null, NULL_REVISION
46
 
from bzrlib.repository import RepositoryWriteLockResult
47
46
from bzrlib.trace import mutter, note, warning
48
47
 
49
48
 
273
272
    def create_workingtree(self, revision_id=None, from_branch=None):
274
273
        raise errors.NotLocalUrl(self.transport.base)
275
274
 
276
 
    def find_branch_format(self, name=None):
 
275
    def find_branch_format(self):
277
276
        """Find the branch 'format' for this bzrdir.
278
277
 
279
278
        This might be a synthetic object for e.g. RemoteBranch and SVN.
280
279
        """
281
 
        b = self.open_branch(name=name)
 
280
        b = self.open_branch()
282
281
        return b._format
283
282
 
284
 
    def get_branch_reference(self, name=None):
 
283
    def get_branch_reference(self):
285
284
        """See BzrDir.get_branch_reference()."""
286
 
        if name is not None:
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)
323
319
        return response
324
320
 
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()
328
324
 
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):
1001
997
        pass
1002
998
 
1003
999
    def lock_read(self):
1004
 
        """Lock the repository for read operations.
1005
 
 
1006
 
        :return: A bzrlib.lock.LogicalLockResult.
1007
 
        """
1008
1000
        # wrong eventually - want a local lock cache context
1009
1001
        if not self._lock_mode:
1010
1002
            self._note_lock('r')
1017
1009
                repo.lock_read()
1018
1010
        else:
1019
1011
            self._lock_count += 1
1020
 
        return lock.LogicalLockResult(self.unlock)
1021
1012
 
1022
1013
    def _remote_lock_write(self, token):
1023
1014
        path = self.bzrdir._path_for_remote_call(self._client)
1063
1054
            raise errors.ReadOnlyError(self)
1064
1055
        else:
1065
1056
            self._lock_count += 1
1066
 
        return RepositoryWriteLockResult(self.unlock, self._lock_token or None)
 
1057
        return self._lock_token or None
1067
1058
 
1068
1059
    def leave_lock_in_place(self):
1069
1060
        if not self._lock_token:
1315
1306
        return self._real_repository.make_working_trees()
1316
1307
 
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.
1319
1310
 
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.
1327
1315
        """
 
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()
1330
1321
 
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" % (
2397
2387
            self._vfs_set_tags_bytes(bytes)
2398
2388
 
2399
2389
    def lock_read(self):
2400
 
        """Lock the branch for read operations.
2401
 
 
2402
 
        :return: A bzrlib.lock.LogicalLockResult.
2403
 
        """
2404
2390
        self.repository.lock_read()
2405
2391
        if not self._lock_mode:
2406
2392
            self._note_lock('r')
2410
2396
                self._real_branch.lock_read()
2411
2397
        else:
2412
2398
            self._lock_count += 1
2413
 
        return lock.LogicalLockResult(self.unlock)
2414
2399
 
2415
2400
    def _remote_lock_write(self, token):
2416
2401
        if token is None:
2417
2402
            branch_token = repo_token = ''
2418
2403
        else:
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}
2423
 
        try:
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
2456
2434
            self._lock_mode = 'w'
2457
2435
            self._lock_count = 1
2458
2436
        elif self._lock_mode == 'r':
2459
 
            raise errors.ReadOnlyError(self)
 
2437
            raise errors.ReadOnlyTransaction
2460
2438
        else:
2461
2439
            if token is not None:
2462
2440
                # A token was given to lock_write, and we're relocking, so
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
2471
2449
 
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)
2803
 
        else:
2804
 
            return self._set_config_option(value, name, section)
2805
 
 
2806
 
    def _set_config_option(self, value, name, section):
2807
2777
        try:
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)
2818
2787
 
2819
 
    def _serialize_option_dict(self, option_dict):
2820
 
        utf8_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)
2828
 
 
2829
 
    def _set_config_option_dict(self, value, name, section):
2830
 
        try:
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)
2841
 
        if response != ():
2842
 
            raise errors.UnexpectedSmartServerResponse(response)
2843
 
 
2844
2788
    def _real_object(self):
2845
2789
        self._branch._ensure_real()
2846
2790
        return self._branch._real_branch