~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/remote.py

  • Committer: Jelmer Vernooij
  • Date: 2011-05-10 07:46:15 UTC
  • mfrom: (5844 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5845.
  • Revision ID: jelmer@samba.org-20110510074615-eptod049ndjxc4i7
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
    static_tuple,
33
33
    symbol_versioning,
34
34
    urlutils,
35
 
)
 
35
    vf_repository,
 
36
    )
36
37
from bzrlib.branch import BranchReferenceFormat, BranchWriteLockResult
37
38
from bzrlib.decorators import needs_read_lock, needs_write_lock, only_raises
38
39
from bzrlib.errors import (
43
44
from bzrlib.smart import client, vfs, repository as smart_repo
44
45
from bzrlib.smart.client import _SmartClient
45
46
from bzrlib.revision import NULL_REVISION
46
 
from bzrlib.repository import RepositoryWriteLockResult
 
47
from bzrlib.repository import RepositoryWriteLockResult, _LazyListJoin
47
48
from bzrlib.trace import mutter, note, warning
48
49
 
49
50
 
700
701
        return RemoteBzrDirConfig(self)
701
702
 
702
703
 
703
 
class RemoteRepositoryFormat(_mod_repository.RepositoryFormat):
 
704
class RemoteRepositoryFormat(vf_repository.VersionedFileRepositoryFormat):
704
705
    """Format for repositories accessed over a _SmartClient.
705
706
 
706
707
    Instances of this repository are represented by RemoteRepository
729
730
        self._custom_format = None
730
731
        self._network_name = None
731
732
        self._creating_bzrdir = None
 
733
        self._revision_graph_can_have_wrong_parents = None
732
734
        self._supports_chks = None
733
735
        self._supports_external_lookups = None
734
736
        self._supports_tree_reference = None
782
784
                self._custom_format.supports_tree_reference
783
785
        return self._supports_tree_reference
784
786
 
 
787
    @property
 
788
    def revision_graph_can_have_wrong_parents(self):
 
789
        if self._revision_graph_can_have_wrong_parents is None:
 
790
            self._ensure_real()
 
791
            self._revision_graph_can_have_wrong_parents = \
 
792
                self._custom_format.revision_graph_can_have_wrong_parents
 
793
        return self._revision_graph_can_have_wrong_parents
 
794
 
785
795
    def _vfs_initialize(self, a_bzrdir, shared):
786
796
        """Helper for common code in initialize."""
787
797
        if self._custom_format:
1472
1482
 
1473
1483
    def get_commit_builder(self, branch, parents, config, timestamp=None,
1474
1484
                           timezone=None, committer=None, revprops=None,
1475
 
                           revision_id=None):
 
1485
                           revision_id=None, lossy=False):
1476
1486
        # FIXME: It ought to be possible to call this without immediately
1477
1487
        # triggering _ensure_real.  For now it's the easiest thing to do.
1478
1488
        self._ensure_real()
1479
1489
        real_repo = self._real_repository
1480
1490
        builder = real_repo.get_commit_builder(branch, parents,
1481
1491
                config, timestamp=timestamp, timezone=timezone,
1482
 
                committer=committer, revprops=revprops, revision_id=revision_id)
 
1492
                committer=committer, revprops=revprops,
 
1493
                revision_id=revision_id, lossy=lossy)
1483
1494
        return builder
1484
1495
 
1485
1496
    def add_fallback_repository(self, repository):
1986
1997
        return self._real_repository.item_keys_introduced_by(revision_ids,
1987
1998
            _files_pb=_files_pb)
1988
1999
 
1989
 
    def revision_graph_can_have_wrong_parents(self):
1990
 
        # The answer depends on the remote repo format.
1991
 
        self._ensure_real()
1992
 
        return self._real_repository.revision_graph_can_have_wrong_parents()
1993
 
 
1994
2000
    def _find_inconsistent_revision_parents(self, revisions_iterator=None):
1995
2001
        self._ensure_real()
1996
2002
        return self._real_repository._find_inconsistent_revision_parents(
2004
2010
        providers = [self._unstacked_provider]
2005
2011
        if other is not None:
2006
2012
            providers.insert(0, other)
2007
 
        providers.extend(r._make_parents_provider() for r in
2008
 
                         self._fallback_repositories)
2009
 
        return graph.StackedParentsProvider(providers)
 
2013
        return graph.StackedParentsProvider(_LazyListJoin(
 
2014
            providers, self._fallback_repositories))
2010
2015
 
2011
2016
    def _serialise_search_recipe(self, recipe):
2012
2017
        """Serialise a graph search recipe.
2036
2041
            raise errors.UnexpectedSmartServerResponse(response)
2037
2042
 
2038
2043
 
2039
 
class RemoteStreamSink(_mod_repository.StreamSink):
 
2044
class RemoteStreamSink(vf_repository.StreamSink):
2040
2045
 
2041
2046
    def _insert_real(self, stream, src_format, resume_tokens):
2042
2047
        self.target_repo._ensure_real()
2154
2159
                yield substream_kind, substream
2155
2160
 
2156
2161
 
2157
 
class RemoteStreamSource(_mod_repository.StreamSource):
 
2162
class RemoteStreamSource(vf_repository.StreamSource):
2158
2163
    """Stream data from a remote server."""
2159
2164
 
2160
2165
    def get_stream(self, search):
2845
2850
            missing_parent = parent_map[missing_parent]
2846
2851
        raise errors.RevisionNotPresent(missing_parent, self.repository)
2847
2852
 
2848
 
    def _last_revision_info(self):
 
2853
    def _read_last_revision_info(self):
2849
2854
        response = self._call('Branch.last_revision_info', self._remote_path())
2850
2855
        if response[0] != 'ok':
2851
2856
            raise SmartProtocolError('unexpected response code %s' % (response,))
2914
2919
            raise errors.UnexpectedSmartServerResponse(response)
2915
2920
        self._run_post_change_branch_tip_hooks(old_revno, old_revid)
2916
2921
 
 
2922
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4, 0)))
2917
2923
    @needs_write_lock
2918
2924
    def set_revision_history(self, rev_history):
 
2925
        """See Branch.set_revision_history."""
 
2926
        self._set_revision_history(rev_history)
 
2927
 
 
2928
    @needs_write_lock
 
2929
    def _set_revision_history(self, rev_history):
2919
2930
        # Send just the tip revision of the history; the server will generate
2920
2931
        # the full history from that.  If the revision doesn't exist in this
2921
2932
        # branch, NoSuchRevision will be raised.
2998
3009
        # XXX: These should be returned by the set_last_revision_info verb
2999
3010
        old_revno, old_revid = self.last_revision_info()
3000
3011
        self._run_pre_change_branch_tip_hooks(revno, revision_id)
3001
 
        revision_id = _mod_revision.ensure_null(revision_id)
 
3012
        if not revision_id or not isinstance(revision_id, basestring):
 
3013
            raise errors.InvalidRevisionId(revision_id=revision_id, branch=self)
3002
3014
        try:
3003
3015
            response = self._call('Branch.set_last_revision_info',
3004
3016
                self._remote_path(), self._lock_token, self._repo_lock_token,
3033
3045
            except errors.UnknownSmartMethod:
3034
3046
                medium._remember_remote_is_before((1, 6))
3035
3047
        self._clear_cached_state_of_remote_branch_only()
3036
 
        self.set_revision_history(self._lefthand_history(revision_id,
 
3048
        self._set_revision_history(self._lefthand_history(revision_id,
3037
3049
            last_rev=last_rev,other_branch=other_branch))
3038
3050
 
3039
3051
    def set_push_location(self, location):