~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/medium.py

Better infrastructure on SmartClientMedium for tracking the remote version.

Show diffs side-by-side

added added

removed removed

Lines of Context:
440
440
        self._protocol_version = None
441
441
        self._done_hello = False
442
442
        # Be optimistic: we assume the remote end can accept new remote
443
 
        # requests until we get an error saying otherwise.  (1.2 adds some
444
 
        # requests that send bodies, which confuses older servers.)
445
 
        self._remote_is_at_least_1_2 = True
 
443
        # requests until we get an error saying otherwise.
 
444
        # _remote_version_is_less_than tracks the bzr version the remote side
 
445
        # can be based on what we've seen so far.
 
446
        self._remote_version_is_less_than = None
 
447
 
 
448
    def _is_remote_at_least(self, version_tuple):
 
449
        """Is it possible the remote side is supports RPCs for a given version?
 
450
 
 
451
        Typical use::
 
452
 
 
453
            needed_version = (1, 2)
 
454
            if not medium._is_remote_at_least(needed_version):
 
455
                fallback_to_pre_1_2_rpc()
 
456
            else:
 
457
                try:
 
458
                    do_1_2_rpc()
 
459
                except UnknownSmartMethod:
 
460
                    medium._remote_is_not(needed_version)
 
461
                    fallback_to_pre_1_2_rpc()
 
462
 
 
463
        :seealso: _remote_is_not
 
464
        """
 
465
        if self._remote_version_is_less_than is None:
 
466
            # So far, the remote side seems to support everything
 
467
            return True
 
468
        return version_tuple < self._remote_version_is_less_than
 
469
 
 
470
    def _remote_is_not(self, version_tuple):
 
471
        """Tell this medium that the remote side is older the given version.
 
472
 
 
473
        :seealso: _is_remote_at_least
 
474
        """
 
475
        if (self._remote_version_is_less_than is not None and 
 
476
            version_tuple > self._remote_version_is_less_than):
 
477
            raise AssertionError, (
 
478
                "_remote_is_not(%r) called, but _remote_is_not(%r) was called "
 
479
                "previously." 
 
480
                % (version_tuple, self._remote_version_is_less_than))
 
481
        self._remote_version_is_less_than = version_tuple
446
482
 
447
483
    def protocol_version(self):
448
484
        """Find out if 'hello' smart request works."""