~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/remote.py

  • Committer: Martin Pool
  • Date: 2009-06-19 09:06:56 UTC
  • mfrom: (4463 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4464.
  • Revision ID: mbp@sourcefrog.net-20090619090656-d5weqeecyscv8kqp
merge news

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
    errors,
29
29
    graph,
30
30
    lockdir,
31
 
    pack,
32
31
    repository,
33
32
    revision,
34
33
    revision as _mod_revision,
35
34
    symbol_versioning,
36
 
    urlutils,
37
35
)
38
36
from bzrlib.branch import BranchReferenceFormat
39
37
from bzrlib.bzrdir import BzrDir, RemoteBzrDirFormat
675
673
        return self._real_repository.get_missing_parent_inventories(
676
674
            check_for_missing_texts=check_for_missing_texts)
677
675
 
 
676
    def _get_rev_id_for_revno_vfs(self, revno, known_pair):
 
677
        self._ensure_real()
 
678
        return self._real_repository.get_rev_id_for_revno(
 
679
            revno, known_pair)
 
680
 
 
681
    def get_rev_id_for_revno(self, revno, known_pair):
 
682
        """See Repository.get_rev_id_for_revno."""
 
683
        path = self.bzrdir._path_for_remote_call(self._client)
 
684
        try:
 
685
            if self._client._medium._is_remote_before((1, 17)):
 
686
                return self._get_rev_id_for_revno_vfs(revno, known_pair)
 
687
            response = self._call(
 
688
                'Repository.get_rev_id_for_revno', path, revno, known_pair)
 
689
        except errors.UnknownSmartMethod:
 
690
            self._client._medium._remember_remote_is_before((1, 17))
 
691
            return self._get_rev_id_for_revno_vfs(revno, known_pair)
 
692
        if response[0] == 'ok':
 
693
            return True, response[1]
 
694
        elif response[0] == 'history-incomplete':
 
695
            known_pair = response[1:3]
 
696
            for fallback in self._fallback_repositories:
 
697
                found, result = fallback.get_rev_id_for_revno(revno, known_pair)
 
698
                if found:
 
699
                    return True, result
 
700
                else:
 
701
                    known_pair = result
 
702
            # Not found in any fallbacks
 
703
            return False, known_pair
 
704
        else:
 
705
            raise errors.UnexpectedSmartServerResponse(response)
 
706
 
678
707
    def _ensure_real(self):
679
708
        """Ensure that there is a _real_repository set.
680
709
 
1895
1924
        self._ensure_real()
1896
1925
        return self._custom_format.supports_stacking()
1897
1926
 
 
1927
    def supports_set_append_revisions_only(self):
 
1928
        self._ensure_real()
 
1929
        return self._custom_format.supports_set_append_revisions_only()
 
1930
 
1898
1931
 
1899
1932
class RemoteBranch(branch.Branch, _RpcHelper):
1900
1933
    """Branch stored on a server accessed by HPSS RPC.
1919
1952
        # We intentionally don't call the parent class's __init__, because it
1920
1953
        # will try to assign to self.tags, which is a property in this subclass.
1921
1954
        # And the parent's __init__ doesn't do much anyway.
1922
 
        self._revision_id_to_revno_cache = None
1923
 
        self._partial_revision_id_to_revno_cache = {}
1924
 
        self._revision_history_cache = None
1925
 
        self._last_revision_info_cache = None
1926
 
        self._merge_sorted_revisions_cache = None
1927
1955
        self.bzrdir = remote_bzrdir
1928
1956
        if _client is not None:
1929
1957
            self._client = _client
1943
1971
        else:
1944
1972
            self._real_branch = None
1945
1973
        # Fill out expected attributes of branch for bzrlib API users.
 
1974
        self._clear_cached_state()
1946
1975
        self.base = self.bzrdir.root_transport.base
1947
1976
        self._control_files = None
1948
1977
        self._lock_mode = None
1970
1999
        hooks = branch.Branch.hooks['open']
1971
2000
        for hook in hooks:
1972
2001
            hook(self)
 
2002
        self._is_stacked = False
1973
2003
        if setup_stacking:
1974
2004
            self._setup_stacking()
1975
2005
 
1981
2011
        except (errors.NotStacked, errors.UnstackableBranchFormat,
1982
2012
            errors.UnstackableRepositoryFormat), e:
1983
2013
            return
 
2014
        self._is_stacked = True
1984
2015
        self._activate_fallback_location(fallback_url)
1985
2016
 
1986
2017
    def _get_config(self):
2088
2119
            raise errors.UnexpectedSmartServerResponse(response)
2089
2120
        return response[1]
2090
2121
 
 
2122
    def set_stacked_on_url(self, url):
 
2123
        branch.Branch.set_stacked_on_url(self, url)
 
2124
        if not url:
 
2125
            self._is_stacked = False
 
2126
        else:
 
2127
            self._is_stacked = True
 
2128
        
2091
2129
    def _vfs_get_tags_bytes(self):
2092
2130
        self._ensure_real()
2093
2131
        return self._real_branch._get_tags_bytes()
2220
2258
            raise NotImplementedError(self.dont_leave_lock_in_place)
2221
2259
        self._leave_lock = False
2222
2260
 
 
2261
    def get_rev_id(self, revno, history=None):
 
2262
        if revno == 0:
 
2263
            return _mod_revision.NULL_REVISION
 
2264
        last_revision_info = self.last_revision_info()
 
2265
        ok, result = self.repository.get_rev_id_for_revno(
 
2266
            revno, last_revision_info)
 
2267
        if ok:
 
2268
            return result
 
2269
        missing_parent = result[1]
 
2270
        # Either the revision named by the server is missing, or its parent
 
2271
        # is.  Call get_parent_map to determine which, so that we report a
 
2272
        # useful error.
 
2273
        parent_map = self.repository.get_parent_map([missing_parent])
 
2274
        if missing_parent in parent_map:
 
2275
            missing_parent = parent_map[missing_parent]
 
2276
        raise errors.RevisionNotPresent(missing_parent, self.repository)
 
2277
 
2223
2278
    def _last_revision_info(self):
2224
2279
        response = self._call('Branch.last_revision_info', self._remote_path())
2225
2280
        if response[0] != 'ok':
2230
2285
 
2231
2286
    def _gen_revision_history(self):
2232
2287
        """See Branch._gen_revision_history()."""
 
2288
        if self._is_stacked:
 
2289
            self._ensure_real()
 
2290
            return self._real_branch._gen_revision_history()
2233
2291
        response_tuple, response_handler = self._call_expecting_body(
2234
2292
            'Branch.revision_history', self._remote_path())
2235
2293
        if response_tuple[0] != 'ok':