/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
3407.2.2 by Martin Pool
Remove special case in RemoteBranchLockableFiles for branch.conf
1
# Copyright (C) 2006, 2007, 2008 Canonical Ltd
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
17
# TODO: At some point, handle upgrades by just passing the whole request
18
# across to run on the server.
19
3211.5.2 by Robert Collins
Change RemoteRepository.get_parent_map to use bz2 not gzip for compression.
20
import bz2
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
21
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
22
from bzrlib import (
23
    branch,
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
24
    bzrdir,
3192.1.1 by Andrew Bennetts
Add some -Dhpss debugging to get_parent_map.
25
    debug,
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
26
    errors,
3172.5.1 by Robert Collins
Create a RemoteRepository get_graph implementation and delegate get_parents_map to the real repository.
27
    graph,
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
28
    lockdir,
29
    repository,
2948.3.1 by John Arbash Meinel
Fix bug #158333, make sure that Repository.fetch(self) is properly a no-op for all Repository implementations.
30
    revision,
3228.4.11 by John Arbash Meinel
Deprecations abound.
31
    symbol_versioning,
3691.2.2 by Martin Pool
Fix some problems in access to stacked repositories over hpss (#261315)
32
    urlutils,
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
33
)
2535.4.27 by Andrew Bennetts
Remove some unused imports.
34
from bzrlib.branch import BranchReferenceFormat
2018.5.174 by Andrew Bennetts
Various nits discovered by pyflakes.
35
from bzrlib.bzrdir import BzrDir, RemoteBzrDirFormat
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
36
from bzrlib.decorators import needs_read_lock, needs_write_lock
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
37
from bzrlib.errors import (
38
    NoSuchRevision,
39
    SmartProtocolError,
40
    )
2018.5.127 by Andrew Bennetts
Fix most of the lockable_files tests for RemoteBranchLockableFiles.
41
from bzrlib.lockable_files import LockableFiles
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
42
from bzrlib.smart import client, vfs
3297.4.1 by Andrew Bennetts
Merge 'Add Branch.set_last_revision_info smart method'.
43
from bzrlib.revision import ensure_null, NULL_REVISION
3441.5.5 by Andrew Bennetts
Some small tweaks and comments.
44
from bzrlib.trace import mutter, note, warning
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
45
3445.1.5 by John Arbash Meinel
allow passing a 'graph' object into Branch.update_revisions.
46
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
47
class _RpcHelper(object):
48
    """Mixin class that helps with issuing RPCs."""
49
50
    def _call(self, method, *args, **err_context):
51
        try:
52
            return self._client.call(method, *args)
53
        except errors.ErrorFromSmartServer, err:
54
            self._translate_error(err, **err_context)
55
        
56
    def _call_expecting_body(self, method, *args, **err_context):
57
        try:
58
            return self._client.call_expecting_body(method, *args)
59
        except errors.ErrorFromSmartServer, err:
60
            self._translate_error(err, **err_context)
61
        
62
    def _call_with_body_bytes_expecting_body(self, method, args, body_bytes,
63
                                             **err_context):
64
        try:
65
            return self._client.call_with_body_bytes_expecting_body(
66
                method, args, body_bytes)
67
        except errors.ErrorFromSmartServer, err:
68
            self._translate_error(err, **err_context)
69
        
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
70
# Note: RemoteBzrDirFormat is in bzrdir.py
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
71
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
72
class RemoteBzrDir(BzrDir, _RpcHelper):
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
73
    """Control directory on a remote server, accessed via bzr:// or similar."""
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
74
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
75
    def __init__(self, transport, format, _client=None):
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
76
        """Construct a RemoteBzrDir.
77
78
        :param _client: Private parameter for testing. Disables probing and the
79
            use of a real bzrdir.
80
        """
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
81
        BzrDir.__init__(self, transport, format)
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
82
        # this object holds a delegated bzrdir that uses file-level operations
83
        # to talk to the other side
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
84
        self._real_bzrdir = None
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
85
86
        if _client is None:
3313.2.3 by Andrew Bennetts
Deprecate Transport.get_shared_medium.
87
            medium = transport.get_smart_medium()
3431.3.2 by Andrew Bennetts
Remove 'base' from _SmartClient entirely, now that the medium has it.
88
            self._client = client._SmartClient(medium)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
89
        else:
90
            self._client = _client
91
            return
92
93
        path = self._path_for_remote_call(self._client)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
94
        response = self._call('BzrDir.open', path)
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
95
        if response not in [('yes',), ('no',)]:
96
            raise errors.UnexpectedSmartServerResponse(response)
2018.5.26 by Andrew Bennetts
Extract a simple SmartClient class from RemoteTransport, and a hack to avoid VFS operations when probing for a bzrdir over a smart transport.
97
        if response == ('no',):
98
            raise errors.NotBranchError(path=transport.base)
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
99
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
100
    def _ensure_real(self):
101
        """Ensure that there is a _real_bzrdir set.
102
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
103
        Used before calls to self._real_bzrdir.
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
104
        """
105
        if not self._real_bzrdir:
2018.5.169 by Andrew Bennetts
Add a _server_formats flag to BzrDir.open_from_transport and BzrDirFormat.find_format, make RemoteBranch.control_files into a property.
106
            self._real_bzrdir = BzrDir.open_from_transport(
107
                self.root_transport, _server_formats=False)
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
108
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
109
    def _translate_error(self, err, **context):
110
        _translate_error(err, bzrdir=self, **context)
111
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
112
    def cloning_metadir(self, stacked=False):
3242.3.28 by Aaron Bentley
Use repository acquisition policy for sprouting
113
        self._ensure_real()
3650.3.13 by Aaron Bentley
Make cloning_metadir handle stacking requirements
114
        return self._real_bzrdir.cloning_metadir(stacked)
3242.3.28 by Aaron Bentley
Use repository acquisition policy for sprouting
115
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
116
    def create_repository(self, shared=False):
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
117
        # as per meta1 formats - just delegate to the format object which may
118
        # be parameterised.
119
        result = self._format.repository_format.initialize(self, shared)
120
        if not isinstance(result, RemoteRepository):
121
            return self.open_repository()
122
        else:
123
            return result
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
124
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
125
    def destroy_repository(self):
126
        """See BzrDir.destroy_repository"""
127
        self._ensure_real()
128
        self._real_bzrdir.destroy_repository()
129
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
130
    def create_branch(self):
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
131
        # as per meta1 formats - just delegate to the format object which may
132
        # be parameterised.
133
        real_branch = self._format.get_branch_format().initialize(self)
134
        if not isinstance(real_branch, RemoteBranch):
135
            return RemoteBranch(self, self.find_repository(), real_branch)
136
        else:
137
            return real_branch
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
138
2796.2.6 by Aaron Bentley
Implement destroy_branch
139
    def destroy_branch(self):
2796.2.16 by Aaron Bentley
Documentation updates from review
140
        """See BzrDir.destroy_branch"""
2796.2.6 by Aaron Bentley
Implement destroy_branch
141
        self._ensure_real()
142
        self._real_bzrdir.destroy_branch()
143
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
144
    def create_workingtree(self, revision_id=None, from_branch=None):
2018.5.174 by Andrew Bennetts
Various nits discovered by pyflakes.
145
        raise errors.NotLocalUrl(self.transport.base)
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
146
2018.5.124 by Robert Collins
Fix test_format_initialize_find_open by delegating Branch formt lookup to the BzrDir, where it should have stayed from the start.
147
    def find_branch_format(self):
148
        """Find the branch 'format' for this bzrdir.
149
150
        This might be a synthetic object for e.g. RemoteBranch and SVN.
151
        """
152
        b = self.open_branch()
153
        return b._format
154
2018.5.132 by Robert Collins
Make all BzrDir implementation tests pass on RemoteBzrDir - fix some things, and remove the incomplete_with_basis tests as cruft.
155
    def get_branch_reference(self):
156
        """See BzrDir.get_branch_reference()."""
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
157
        path = self._path_for_remote_call(self._client)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
158
        response = self._call('BzrDir.open_branch', path)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
159
        if response[0] == 'ok':
160
            if response[1] == '':
161
                # branch at this location.
2018.5.132 by Robert Collins
Make all BzrDir implementation tests pass on RemoteBzrDir - fix some things, and remove the incomplete_with_basis tests as cruft.
162
                return None
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
163
            else:
164
                # a branch reference, use the existing BranchReference logic.
2018.5.132 by Robert Collins
Make all BzrDir implementation tests pass on RemoteBzrDir - fix some things, and remove the incomplete_with_basis tests as cruft.
165
                return response[1]
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
166
        else:
2555.1.1 by Martin Pool
Remove use of 'assert False' to raise an exception unconditionally
167
            raise errors.UnexpectedSmartServerResponse(response)
2018.5.132 by Robert Collins
Make all BzrDir implementation tests pass on RemoteBzrDir - fix some things, and remove the incomplete_with_basis tests as cruft.
168
3211.4.1 by Robert Collins
* ``RemoteBzrDir._get_tree_branch`` no longer triggers ``_ensure_real``,
169
    def _get_tree_branch(self):
170
        """See BzrDir._get_tree_branch()."""
171
        return None, self.open_branch()
172
2018.5.132 by Robert Collins
Make all BzrDir implementation tests pass on RemoteBzrDir - fix some things, and remove the incomplete_with_basis tests as cruft.
173
    def open_branch(self, _unsupported=False):
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
174
        if _unsupported:
175
            raise NotImplementedError('unsupported flag support not implemented yet.')
2018.5.132 by Robert Collins
Make all BzrDir implementation tests pass on RemoteBzrDir - fix some things, and remove the incomplete_with_basis tests as cruft.
176
        reference_url = self.get_branch_reference()
177
        if reference_url is None:
178
            # branch at this location.
179
            return RemoteBranch(self, self.find_repository())
180
        else:
181
            # a branch reference, use the existing BranchReference logic.
182
            format = BranchReferenceFormat()
183
            return format.open(self, _found=True, location=reference_url)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
184
                
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
185
    def open_repository(self):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
186
        path = self._path_for_remote_call(self._client)
3221.3.3 by Robert Collins
* Hook up the new remote method ``RemoteBzrDir.find_repositoryV2`` so
187
        verb = 'BzrDir.find_repositoryV2'
3297.3.3 by Andrew Bennetts
SmartClientRequestProtocol*.read_response_tuple can now raise UnknownSmartMethod. Callers no longer need to do their own ad hoc unknown smart method error detection.
188
        try:
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
189
            response = self._call(verb, path)
190
        except errors.UnknownSmartMethod:
191
            verb = 'BzrDir.find_repository'
192
            response = self._call(verb, path)
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
193
        if response[0] != 'ok':
194
            raise errors.UnexpectedSmartServerResponse(response)
3221.3.3 by Robert Collins
* Hook up the new remote method ``RemoteBzrDir.find_repositoryV2`` so
195
        if verb == 'BzrDir.find_repository':
196
            # servers that don't support the V2 method don't support external
197
            # references either.
198
            response = response + ('no', )
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
199
        if not (len(response) == 5):
200
            raise SmartProtocolError('incorrect response length %s' % (response,))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
201
        if response[1] == '':
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
202
            format = RemoteRepositoryFormat()
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
203
            format.rich_root_data = (response[2] == 'yes')
204
            format.supports_tree_reference = (response[3] == 'yes')
3221.3.1 by Robert Collins
* Repository formats have a new supported-feature attribute
205
            # No wire format to check this yet.
3221.3.3 by Robert Collins
* Hook up the new remote method ``RemoteBzrDir.find_repositoryV2`` so
206
            format.supports_external_lookups = (response[4] == 'yes')
3221.15.10 by Robert Collins
Add test that we can stack on a smart server from Jonathan Lange.
207
            # Used to support creating a real format instance when needed.
208
            format._creating_bzrdir = self
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
209
            remote_repo = RemoteRepository(self, format)
210
            format._creating_repo = remote_repo
211
            return remote_repo
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
212
        else:
213
            raise errors.NoRepositoryPresent(self)
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
214
2018.5.138 by Robert Collins
Merge bzr.dev.
215
    def open_workingtree(self, recommend_upgrade=True):
2445.1.1 by Andrew Bennetts
Make RemoteBzrDir.open_workingtree raise NoWorkingTree rather than NotLocalUrl
216
        self._ensure_real()
217
        if self._real_bzrdir.has_workingtree():
218
            raise errors.NotLocalUrl(self.root_transport)
219
        else:
220
            raise errors.NoWorkingTree(self.root_transport.base)
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
221
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
222
    def _path_for_remote_call(self, client):
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
223
        """Return the path to be used for this bzrdir in a remote call."""
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
224
        return client.remote_path_from_transport(self.root_transport)
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
225
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
226
    def get_branch_transport(self, branch_format):
2018.5.162 by Andrew Bennetts
Add some missing _ensure_real calls, and a missing import.
227
        self._ensure_real()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
228
        return self._real_bzrdir.get_branch_transport(branch_format)
229
1752.2.43 by Andrew Bennetts
Fix get_{branch,repository,workingtree}_transport.
230
    def get_repository_transport(self, repository_format):
2018.5.162 by Andrew Bennetts
Add some missing _ensure_real calls, and a missing import.
231
        self._ensure_real()
1752.2.43 by Andrew Bennetts
Fix get_{branch,repository,workingtree}_transport.
232
        return self._real_bzrdir.get_repository_transport(repository_format)
233
234
    def get_workingtree_transport(self, workingtree_format):
2018.5.162 by Andrew Bennetts
Add some missing _ensure_real calls, and a missing import.
235
        self._ensure_real()
1752.2.43 by Andrew Bennetts
Fix get_{branch,repository,workingtree}_transport.
236
        return self._real_bzrdir.get_workingtree_transport(workingtree_format)
237
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
238
    def can_convert_format(self):
239
        """Upgrading of remote bzrdirs is not supported yet."""
240
        return False
241
242
    def needs_format_conversion(self, format=None):
243
        """Upgrading of remote bzrdirs is not supported yet."""
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
244
        if format is None:
245
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
246
                % 'needs_format_conversion(format=None)')
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
247
        return False
248
3242.3.37 by Aaron Bentley
Updates from reviews
249
    def clone(self, url, revision_id=None, force_new_repo=False,
250
              preserve_stacking=False):
2018.5.94 by Andrew Bennetts
Various small changes in aid of making tests pass (including deleting one invalid test).
251
        self._ensure_real()
252
        return self._real_bzrdir.clone(url, revision_id=revision_id,
3242.3.37 by Aaron Bentley
Updates from reviews
253
            force_new_repo=force_new_repo, preserve_stacking=preserve_stacking)
2018.5.94 by Andrew Bennetts
Various small changes in aid of making tests pass (including deleting one invalid test).
254
3567.1.3 by Michael Hudson
fix problem
255
    def get_config(self):
256
        self._ensure_real()
257
        return self._real_bzrdir.get_config()
258
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
259
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
260
class RemoteRepositoryFormat(repository.RepositoryFormat):
2018.5.159 by Andrew Bennetts
Rename SmartClient to _SmartClient.
261
    """Format for repositories accessed over a _SmartClient.
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
262
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
263
    Instances of this repository are represented by RemoteRepository
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
264
    instances.
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
265
3128.1.3 by Vincent Ladeuil
Since we are there s/parameteris.*/parameteriz&/.
266
    The RemoteRepositoryFormat is parameterized during construction
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
267
    to reflect the capabilities of the real, remote format. Specifically
2018.5.138 by Robert Collins
Merge bzr.dev.
268
    the attributes rich_root_data and supports_tree_reference are set
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
269
    on a per instance basis, and are not set (and should not be) at
270
    the class level.
3990.5.3 by Robert Collins
Docs and polish on RepositoryFormat.network_name.
271
272
    :ivar _custom_format: If set, a specific concrete repository format that 
273
        will be used when initializing a repository with this
274
        RemoteRepositoryFormat.
275
    :ivar _creating_repo: If set, the repository object that this
276
        RemoteRepositoryFormat was created for: it can be called into
3990.5.4 by Robert Collins
Review feedback.
277
        to obtain data like the network name.
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
278
    """
279
3543.1.2 by Michael Hudson
the two character fix
280
    _matchingbzrdir = RemoteBzrDirFormat()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
281
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
282
    def __init__(self):
283
        repository.RepositoryFormat.__init__(self)
284
        self._custom_format = None
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
285
        self._network_name = None
4017.3.3 by Robert Collins
Review feedback - make RemoteRepository.initialize use helpers, and version-lock the new method to not attempt the method on older servers.
286
        self._creating_bzrdir = None
287
288
    def _vfs_initialize(self, a_bzrdir, shared):
289
        """Helper for common code in initialize."""
290
        if self._custom_format:
291
            # Custom format requested
292
            result = self._custom_format.initialize(a_bzrdir, shared=shared)
293
        elif self._creating_bzrdir is not None:
294
            # Use the format that the repository we were created to back
295
            # has.
296
            prior_repo = self._creating_bzrdir.open_repository()
297
            prior_repo._ensure_real()
298
            result = prior_repo._real_repository._format.initialize(
299
                a_bzrdir, shared=shared)
300
        else:
301
            # assume that a_bzr is a RemoteBzrDir but the smart server didn't
302
            # support remote initialization.
303
            # We delegate to a real object at this point (as RemoteBzrDir
304
            # delegate to the repository format which would lead to infinite
305
            # recursion if we just called a_bzrdir.create_repository.
306
            a_bzrdir._ensure_real()
307
            result = a_bzrdir._real_bzrdir.create_repository(shared=shared)
308
        if not isinstance(result, RemoteRepository):
309
            return self.open(a_bzrdir)
310
        else:
311
            return result
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
312
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
313
    def initialize(self, a_bzrdir, shared=False):
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
314
        # Being asked to create on a non RemoteBzrDir:
315
        if not isinstance(a_bzrdir, RemoteBzrDir):
4017.3.3 by Robert Collins
Review feedback - make RemoteRepository.initialize use helpers, and version-lock the new method to not attempt the method on older servers.
316
            return self._vfs_initialize(a_bzrdir, shared)
317
        medium = a_bzrdir._client._medium
318
        if medium._is_remote_before((1, 13)):
319
            return self._vfs_initialize(a_bzrdir, shared)
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
320
        # Creating on a remote bzr dir.
321
        # 1) get the network name to use.
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
322
        if self._custom_format:
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
323
            network_name = self._custom_format.network_name()
324
        else:
325
            # Select the current bzrlib default and ask for that.
326
            reference_bzrdir_format = bzrdir.format_registry.get('default')()
327
            reference_format = reference_bzrdir_format.repository_format
328
            network_name = reference_format.network_name()
329
        # 2) try direct creation via RPC
330
        path = a_bzrdir._path_for_remote_call(a_bzrdir._client)
331
        verb = 'BzrDir.create_repository'
332
        if shared:
333
            shared_str = 'True'
334
        else:
335
            shared_str = 'False'
336
        try:
337
            response = a_bzrdir._call(verb, path, network_name, shared_str)
338
        except errors.UnknownSmartMethod:
4017.3.3 by Robert Collins
Review feedback - make RemoteRepository.initialize use helpers, and version-lock the new method to not attempt the method on older servers.
339
            # Fallback - use vfs methods
340
            return self._vfs_initialize(a_bzrdir, shared)
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
341
        else:
342
            # Turn the response into a RemoteRepository object.
343
            format = RemoteRepositoryFormat()
344
            format.rich_root_data = (response[1] == 'yes')
345
            format.supports_tree_reference = (response[2] == 'yes')
346
            format.supports_external_lookups = (response[3] == 'yes')
347
            format._network_name = response[4]
348
            # Used to support creating a real format instance when needed.
349
            format._creating_bzrdir = a_bzrdir
350
            remote_repo = RemoteRepository(a_bzrdir, format)
351
            format._creating_repo = remote_repo
352
            return remote_repo
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
353
    
354
    def open(self, a_bzrdir):
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
355
        if not isinstance(a_bzrdir, RemoteBzrDir):
356
            raise AssertionError('%r is not a RemoteBzrDir' % (a_bzrdir,))
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
357
        return a_bzrdir.open_repository()
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
358
359
    def get_format_description(self):
360
        return 'bzr remote repository'
361
362
    def __eq__(self, other):
1752.2.87 by Andrew Bennetts
Make tests pass.
363
        return self.__class__ == other.__class__
364
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
365
    def check_conversion_target(self, target_format):
366
        if self.rich_root_data and not target_format.rich_root_data:
367
            raise errors.BadConversionTarget(
368
                'Does not support rich root data.', target_format)
2018.5.138 by Robert Collins
Merge bzr.dev.
369
        if (self.supports_tree_reference and
370
            not getattr(target_format, 'supports_tree_reference', False)):
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
371
            raise errors.BadConversionTarget(
372
                'Does not support nested trees', target_format)
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
373
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
374
    def network_name(self):
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
375
        if self._network_name:
376
            return self._network_name
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
377
        self._creating_repo._ensure_real()
378
        return self._creating_repo._real_repository._format.network_name()
379
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
380
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
381
class RemoteRepository(_RpcHelper):
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
382
    """Repository accessed over rpc.
383
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
384
    For the moment most operations are performed using local transport-backed
385
    Repository objects.
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
386
    """
387
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
388
    def __init__(self, remote_bzrdir, format, real_repository=None, _client=None):
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
389
        """Create a RemoteRepository instance.
390
        
391
        :param remote_bzrdir: The bzrdir hosting this repository.
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
392
        :param format: The RemoteFormat object to use.
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
393
        :param real_repository: If not None, a local implementation of the
394
            repository logic for the repository, usually accessing the data
395
            via the VFS.
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
396
        :param _client: Private testing parameter - override the smart client
397
            to be used by the repository.
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
398
        """
399
        if real_repository:
2018.5.36 by Andrew Bennetts
Fix typo, and clean up some ununsed import warnings from pyflakes at the same time.
400
            self._real_repository = real_repository
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
401
        else:
402
            self._real_repository = None
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
403
        self.bzrdir = remote_bzrdir
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
404
        if _client is None:
3313.2.1 by Andrew Bennetts
Change _SmartClient's API to accept a medium and a base, rather than a _SharedConnection.
405
            self._client = remote_bzrdir._client
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
406
        else:
407
            self._client = _client
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
408
        self._format = format
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
409
        self._lock_mode = None
410
        self._lock_token = None
411
        self._lock_count = 0
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
412
        self._leave_lock = False
3835.1.12 by Aaron Bentley
Unify CachingExtraParentsProvider and CachingParentsProvider.
413
        self._unstacked_provider = graph.CachingParentsProvider(
3896.1.1 by Andrew Bennetts
Remove broken debugging cruft, and some unused imports.
414
            get_parent_map=self._get_parent_map_rpc)
3835.1.12 by Aaron Bentley
Unify CachingExtraParentsProvider and CachingParentsProvider.
415
        self._unstacked_provider.disable_cache()
2951.1.10 by Robert Collins
Peer review feedback with Ian.
416
        # For tests:
417
        # These depend on the actual remote format, so force them off for
418
        # maximum compatibility. XXX: In future these should depend on the
419
        # remote repository instance, but this is irrelevant until we perform
420
        # reconcile via an RPC call.
2951.1.5 by Robert Collins
Some work towards including the correct changes for TREE_ROOT in check parameterised tests.
421
        self._reconcile_does_inventory_gc = False
422
        self._reconcile_fixes_text_parents = False
2951.1.3 by Robert Collins
Partial support for native reconcile with packs.
423
        self._reconcile_backsup_inventory = False
2592.4.5 by Martin Pool
Add Repository.base on all repositories.
424
        self.base = self.bzrdir.transport.base
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
425
        # Additional places to query for data.
426
        self._fallback_repositories = []
2592.4.5 by Martin Pool
Add Repository.base on all repositories.
427
428
    def __str__(self):
429
        return "%s(%s)" % (self.__class__.__name__, self.base)
430
431
    __repr__ = __str__
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
432
3825.4.1 by Andrew Bennetts
Add suppress_errors to abort_write_group.
433
    def abort_write_group(self, suppress_errors=False):
2617.6.7 by Robert Collins
More review feedback.
434
        """Complete a write group on the decorated repository.
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
435
        
436
        Smart methods peform operations in a single step so this api
2617.6.6 by Robert Collins
Some review feedback.
437
        is not really applicable except as a compatibility thunk
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
438
        for older plugins that don't use e.g. the CommitBuilder
439
        facility.
3825.4.6 by Andrew Bennetts
Document the suppress_errors flag in the docstring.
440
441
        :param suppress_errors: see Repository.abort_write_group.
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
442
        """
443
        self._ensure_real()
3825.4.1 by Andrew Bennetts
Add suppress_errors to abort_write_group.
444
        return self._real_repository.abort_write_group(
445
            suppress_errors=suppress_errors)
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
446
447
    def commit_write_group(self):
2617.6.7 by Robert Collins
More review feedback.
448
        """Complete a write group on the decorated repository.
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
449
        
450
        Smart methods peform operations in a single step so this api
2617.6.6 by Robert Collins
Some review feedback.
451
        is not really applicable except as a compatibility thunk
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
452
        for older plugins that don't use e.g. the CommitBuilder
453
        facility.
454
        """
455
        self._ensure_real()
456
        return self._real_repository.commit_write_group()
2617.6.1 by Robert Collins
* New method on Repository - ``start_write_group``, ``end_write_group``
457
4002.1.1 by Andrew Bennetts
Implement suspend_write_group/resume_write_group.
458
    def resume_write_group(self, tokens):
459
        self._ensure_real()
460
        return self._real_repository.resume_write_group(tokens)
461
462
    def suspend_write_group(self):
463
        self._ensure_real()
464
        return self._real_repository.suspend_write_group()
465
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
466
    def _ensure_real(self):
467
        """Ensure that there is a _real_repository set.
468
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
469
        Used before calls to self._real_repository.
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
470
        """
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
471
        if self._real_repository is None:
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
472
            self.bzrdir._ensure_real()
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
473
            self._set_real_repository(
474
                self.bzrdir._real_bzrdir.open_repository())
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
475
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
476
    def _translate_error(self, err, **context):
477
        self.bzrdir._translate_error(err, repository=self, **context)
478
2988.1.2 by Robert Collins
New Repository API find_text_key_references for use by reconcile and check.
479
    def find_text_key_references(self):
480
        """Find the text key references within the repository.
481
482
        :return: a dictionary mapping (file_id, revision_id) tuples to altered file-ids to an iterable of
483
        revision_ids. Each altered file-ids has the exact revision_ids that
484
        altered it listed explicitly.
485
        :return: A dictionary mapping text keys ((fileid, revision_id) tuples)
486
            to whether they were referred to by the inventory of the
487
            revision_id that they contain. The inventory texts from all present
488
            revision ids are assessed to generate this report.
489
        """
490
        self._ensure_real()
491
        return self._real_repository.find_text_key_references()
492
2988.1.3 by Robert Collins
Add a new repositoy method _generate_text_key_index for use by reconcile/check.
493
    def _generate_text_key_index(self):
494
        """Generate a new text key index for the repository.
495
496
        This is an expensive function that will take considerable time to run.
497
498
        :return: A dict mapping (file_id, revision_id) tuples to a list of
499
            parents, also (file_id, revision_id) tuples.
500
        """
501
        self._ensure_real()
502
        return self._real_repository._generate_text_key_index()
503
3287.6.1 by Robert Collins
* ``VersionedFile.get_graph`` is deprecated, with no replacement method.
504
    @symbol_versioning.deprecated_method(symbol_versioning.one_four)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
505
    def get_revision_graph(self, revision_id=None):
506
        """See Repository.get_revision_graph()."""
3287.6.4 by Robert Collins
Fix up deprecation warnings for get_revision_graph.
507
        return self._get_revision_graph(revision_id)
508
509
    def _get_revision_graph(self, revision_id):
510
        """Private method for using with old (< 1.2) servers to fallback."""
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
511
        if revision_id is None:
512
            revision_id = ''
2948.3.1 by John Arbash Meinel
Fix bug #158333, make sure that Repository.fetch(self) is properly a no-op for all Repository implementations.
513
        elif revision.is_null(revision_id):
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
514
            return {}
515
516
        path = self.bzrdir._path_for_remote_call(self._client)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
517
        response = self._call_expecting_body(
518
            'Repository.get_revision_graph', path, revision_id)
3245.4.58 by Andrew Bennetts
Unpack call_expecting_body's return value into variables, to avoid lots of ugly subscripting.
519
        response_tuple, response_handler = response
520
        if response_tuple[0] != 'ok':
521
            raise errors.UnexpectedSmartServerResponse(response_tuple)
522
        coded = response_handler.read_body_bytes()
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
523
        if coded == '':
524
            # no revisions in this repository!
525
            return {}
526
        lines = coded.split('\n')
527
        revision_graph = {}
528
        for line in lines:
529
            d = tuple(line.split())
530
            revision_graph[d[0]] = d[1:]
531
            
532
        return revision_graph
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
533
2018.5.40 by Robert Collins
Implement a remote Repository.has_revision method.
534
    def has_revision(self, revision_id):
535
        """See Repository.has_revision()."""
3172.3.1 by Robert Collins
Repository has a new method ``has_revisions`` which signals the presence
536
        if revision_id == NULL_REVISION:
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
537
            # The null revision is always present.
538
            return True
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
539
        path = self.bzrdir._path_for_remote_call(self._client)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
540
        response = self._call('Repository.has_revision', path, revision_id)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
541
        if response[0] not in ('yes', 'no'):
3245.4.58 by Andrew Bennetts
Unpack call_expecting_body's return value into variables, to avoid lots of ugly subscripting.
542
            raise errors.UnexpectedSmartServerResponse(response)
3691.2.2 by Martin Pool
Fix some problems in access to stacked repositories over hpss (#261315)
543
        if response[0] == 'yes':
544
            return True
545
        for fallback_repo in self._fallback_repositories:
546
            if fallback_repo.has_revision(revision_id):
547
                return True
548
        return False
2018.5.40 by Robert Collins
Implement a remote Repository.has_revision method.
549
3172.3.1 by Robert Collins
Repository has a new method ``has_revisions`` which signals the presence
550
    def has_revisions(self, revision_ids):
551
        """See Repository.has_revisions()."""
3691.2.2 by Martin Pool
Fix some problems in access to stacked repositories over hpss (#261315)
552
        # FIXME: This does many roundtrips, particularly when there are
553
        # fallback repositories.  -- mbp 20080905
3172.3.1 by Robert Collins
Repository has a new method ``has_revisions`` which signals the presence
554
        result = set()
555
        for revision_id in revision_ids:
556
            if self.has_revision(revision_id):
557
                result.add(revision_id)
558
        return result
559
2617.6.9 by Robert Collins
Merge bzr.dev.
560
    def has_same_location(self, other):
2592.3.162 by Robert Collins
Remove some arbitrary differences from bzr.dev.
561
        return (self.__class__ == other.__class__ and
562
                self.bzrdir.transport.base == other.bzrdir.transport.base)
3835.1.1 by Aaron Bentley
Stack get_parent_map on fallback repos
563
2490.2.21 by Aaron Bentley
Rename graph to deprecated_graph
564
    def get_graph(self, other_repository=None):
565
        """Return the graph for this repository format"""
3835.1.17 by Aaron Bentley
Fix stacking bug
566
        parents_provider = self._make_parents_provider(other_repository)
3441.5.24 by Andrew Bennetts
Remove RemoteGraph experiment.
567
        return graph.Graph(parents_provider)
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
568
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
569
    def gather_stats(self, revid=None, committers=None):
2018.5.62 by Robert Collins
Stub out RemoteRepository.gather_stats while its implemented in parallel.
570
        """See Repository.gather_stats()."""
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
571
        path = self.bzrdir._path_for_remote_call(self._client)
2948.3.4 by John Arbash Meinel
Repository.gather_stats() validly can get None for the revid.
572
        # revid can be None to indicate no revisions, not just NULL_REVISION
573
        if revid is None or revision.is_null(revid):
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
574
            fmt_revid = ''
575
        else:
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
576
            fmt_revid = revid
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
577
        if committers is None or not committers:
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
578
            fmt_committers = 'no'
579
        else:
580
            fmt_committers = 'yes'
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
581
        response_tuple, response_handler = self._call_expecting_body(
2018.5.153 by Andrew Bennetts
Rename call2 to call_expecting_body, and other small changes prompted by review.
582
            'Repository.gather_stats', path, fmt_revid, fmt_committers)
3245.4.58 by Andrew Bennetts
Unpack call_expecting_body's return value into variables, to avoid lots of ugly subscripting.
583
        if response_tuple[0] != 'ok':
584
            raise errors.UnexpectedSmartServerResponse(response_tuple)
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
585
3245.4.58 by Andrew Bennetts
Unpack call_expecting_body's return value into variables, to avoid lots of ugly subscripting.
586
        body = response_handler.read_body_bytes()
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
587
        result = {}
588
        for line in body.split('\n'):
589
            if not line:
590
                continue
591
            key, val_text = line.split(':')
592
            if key in ('revisions', 'size', 'committers'):
593
                result[key] = int(val_text)
594
            elif key in ('firstrev', 'latestrev'):
595
                values = val_text.split(' ')[1:]
596
                result[key] = (float(values[0]), long(values[1]))
597
598
        return result
2018.5.62 by Robert Collins
Stub out RemoteRepository.gather_stats while its implemented in parallel.
599
3140.1.2 by Aaron Bentley
Add ability to find branches inside repositories
600
    def find_branches(self, using=False):
601
        """See Repository.find_branches()."""
602
        # should be an API call to the server.
603
        self._ensure_real()
604
        return self._real_repository.find_branches(using=using)
605
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
606
    def get_physical_lock_status(self):
607
        """See Repository.get_physical_lock_status()."""
3015.2.10 by Robert Collins
Fix regression due to other pack related fixes in tests with packs not-default.
608
        # should be an API call to the server.
609
        self._ensure_real()
610
        return self._real_repository.get_physical_lock_status()
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
611
2617.6.1 by Robert Collins
* New method on Repository - ``start_write_group``, ``end_write_group``
612
    def is_in_write_group(self):
613
        """Return True if there is an open write group.
614
615
        write groups are only applicable locally for the smart server..
616
        """
617
        if self._real_repository:
618
            return self._real_repository.is_in_write_group()
619
620
    def is_locked(self):
621
        return self._lock_count >= 1
622
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
623
    def is_shared(self):
624
        """See Repository.is_shared()."""
625
        path = self.bzrdir._path_for_remote_call(self._client)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
626
        response = self._call('Repository.is_shared', path)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
627
        if response[0] not in ('yes', 'no'):
628
            raise SmartProtocolError('unexpected response code %s' % (response,))
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
629
        return response[0] == 'yes'
630
2904.1.1 by Robert Collins
* New method ``bzrlib.repository.Repository.is_write_locked`` useful for
631
    def is_write_locked(self):
632
        return self._lock_mode == 'w'
633
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
634
    def lock_read(self):
635
        # wrong eventually - want a local lock cache context
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
636
        if not self._lock_mode:
637
            self._lock_mode = 'r'
638
            self._lock_count = 1
3835.1.15 by Aaron Bentley
Allow miss caching to be disabled.
639
            self._unstacked_provider.enable_cache(cache_misses=False)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
640
            if self._real_repository is not None:
641
                self._real_repository.lock_read()
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
642
        else:
643
            self._lock_count += 1
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
644
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
645
    def _remote_lock_write(self, token):
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
646
        path = self.bzrdir._path_for_remote_call(self._client)
647
        if token is None:
648
            token = ''
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
649
        err_context = {'token': token}
650
        response = self._call('Repository.lock_write', path, token,
651
                              **err_context)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
652
        if response[0] == 'ok':
653
            ok, token = response
654
            return token
655
        else:
2555.1.1 by Martin Pool
Remove use of 'assert False' to raise an exception unconditionally
656
            raise errors.UnexpectedSmartServerResponse(response)
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
657
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
658
    def lock_write(self, token=None, _skip_rpc=False):
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
659
        if not self._lock_mode:
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
660
            if _skip_rpc:
661
                if self._lock_token is not None:
662
                    if token != self._lock_token:
3695.1.1 by Andrew Bennetts
Remove some unused imports and fix a couple of trivially broken raise statements.
663
                        raise errors.TokenMismatch(token, self._lock_token)
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
664
                self._lock_token = token
665
            else:
666
                self._lock_token = self._remote_lock_write(token)
3015.2.9 by Robert Collins
Handle repositories that do not allow remote locking, like pack repositories, in the client side remote server proxy objects.
667
            # if self._lock_token is None, then this is something like packs or
668
            # svn where we don't get to lock the repo, or a weave style repository
669
            # where we cannot lock it over the wire and attempts to do so will
670
            # fail.
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
671
            if self._real_repository is not None:
672
                self._real_repository.lock_write(token=self._lock_token)
673
            if token is not None:
674
                self._leave_lock = True
675
            else:
676
                self._leave_lock = False
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
677
            self._lock_mode = 'w'
678
            self._lock_count = 1
3835.1.15 by Aaron Bentley
Allow miss caching to be disabled.
679
            self._unstacked_provider.enable_cache(cache_misses=False)
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
680
        elif self._lock_mode == 'r':
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
681
            raise errors.ReadOnlyError(self)
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
682
        else:
683
            self._lock_count += 1
3015.2.9 by Robert Collins
Handle repositories that do not allow remote locking, like pack repositories, in the client side remote server proxy objects.
684
        return self._lock_token or None
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
685
686
    def leave_lock_in_place(self):
3015.2.9 by Robert Collins
Handle repositories that do not allow remote locking, like pack repositories, in the client side remote server proxy objects.
687
        if not self._lock_token:
688
            raise NotImplementedError(self.leave_lock_in_place)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
689
        self._leave_lock = True
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
690
691
    def dont_leave_lock_in_place(self):
3015.2.9 by Robert Collins
Handle repositories that do not allow remote locking, like pack repositories, in the client side remote server proxy objects.
692
        if not self._lock_token:
3015.2.15 by Robert Collins
Review feedback.
693
            raise NotImplementedError(self.dont_leave_lock_in_place)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
694
        self._leave_lock = False
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
695
696
    def _set_real_repository(self, repository):
697
        """Set the _real_repository for this repository.
698
699
        :param repository: The repository to fallback to for non-hpss
700
            implemented operations.
701
        """
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
702
        if self._real_repository is not None:
703
            raise AssertionError('_real_repository is already set')
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
704
        if isinstance(repository, RemoteRepository):
705
            raise AssertionError()
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
706
        self._real_repository = repository
3691.2.12 by Martin Pool
Add test for coping without Branch.get_stacked_on_url
707
        for fb in self._fallback_repositories:
708
            self._real_repository.add_fallback_repository(fb)
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
709
        if self._lock_mode == 'w':
710
            # if we are already locked, the real repository must be able to
711
            # acquire the lock with our token.
712
            self._real_repository.lock_write(self._lock_token)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
713
        elif self._lock_mode == 'r':
714
            self._real_repository.lock_read()
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
715
2617.6.1 by Robert Collins
* New method on Repository - ``start_write_group``, ``end_write_group``
716
    def start_write_group(self):
717
        """Start a write group on the decorated repository.
718
        
719
        Smart methods peform operations in a single step so this api
2617.6.6 by Robert Collins
Some review feedback.
720
        is not really applicable except as a compatibility thunk
2617.6.1 by Robert Collins
* New method on Repository - ``start_write_group``, ``end_write_group``
721
        for older plugins that don't use e.g. the CommitBuilder
722
        facility.
723
        """
724
        self._ensure_real()
725
        return self._real_repository.start_write_group()
726
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
727
    def _unlock(self, token):
728
        path = self.bzrdir._path_for_remote_call(self._client)
3015.2.9 by Robert Collins
Handle repositories that do not allow remote locking, like pack repositories, in the client side remote server proxy objects.
729
        if not token:
730
            # with no token the remote repository is not persistently locked.
731
            return
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
732
        err_context = {'token': token}
733
        response = self._call('Repository.unlock', path, token,
734
                              **err_context)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
735
        if response == ('ok',):
736
            return
737
        else:
2555.1.1 by Martin Pool
Remove use of 'assert False' to raise an exception unconditionally
738
            raise errors.UnexpectedSmartServerResponse(response)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
739
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
740
    def unlock(self):
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
741
        self._lock_count -= 1
2592.3.244 by Martin Pool
unlock while in a write group now aborts the write group, unlocks, and errors.
742
        if self._lock_count > 0:
743
            return
3835.1.8 by Aaron Bentley
Make UnstackedParentsProvider manage the cache
744
        self._unstacked_provider.disable_cache()
2592.3.244 by Martin Pool
unlock while in a write group now aborts the write group, unlocks, and errors.
745
        old_mode = self._lock_mode
746
        self._lock_mode = None
747
        try:
748
            # The real repository is responsible at present for raising an
749
            # exception if it's in an unfinished write group.  However, it
750
            # normally will *not* actually remove the lock from disk - that's
751
            # done by the server on receiving the Repository.unlock call.
752
            # This is just to let the _real_repository stay up to date.
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
753
            if self._real_repository is not None:
754
                self._real_repository.unlock()
2592.3.244 by Martin Pool
unlock while in a write group now aborts the write group, unlocks, and errors.
755
        finally:
756
            # The rpc-level lock should be released even if there was a
757
            # problem releasing the vfs-based lock.
758
            if old_mode == 'w':
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
759
                # Only write-locked repositories need to make a remote method
760
                # call to perfom the unlock.
2592.3.244 by Martin Pool
unlock while in a write group now aborts the write group, unlocks, and errors.
761
                old_token = self._lock_token
762
                self._lock_token = None
763
                if not self._leave_lock:
764
                    self._unlock(old_token)
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
765
766
    def break_lock(self):
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
767
        # should hand off to the network
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
768
        self._ensure_real()
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
769
        return self._real_repository.break_lock()
770
2018.18.8 by Ian Clatworthy
Tarball proxy code & tests
771
    def _get_tarball(self, compression):
2814.10.2 by Andrew Bennetts
Make the fallback a little tidier.
772
        """Return a TemporaryFile containing a repository tarball.
773
        
774
        Returns None if the server does not support sending tarballs.
775
        """
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
776
        import tempfile
2018.18.8 by Ian Clatworthy
Tarball proxy code & tests
777
        path = self.bzrdir._path_for_remote_call(self._client)
3297.3.3 by Andrew Bennetts
SmartClientRequestProtocol*.read_response_tuple can now raise UnknownSmartMethod. Callers no longer need to do their own ad hoc unknown smart method error detection.
778
        try:
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
779
            response, protocol = self._call_expecting_body(
3297.3.3 by Andrew Bennetts
SmartClientRequestProtocol*.read_response_tuple can now raise UnknownSmartMethod. Callers no longer need to do their own ad hoc unknown smart method error detection.
780
                'Repository.tarball', path, compression)
781
        except errors.UnknownSmartMethod:
782
            protocol.cancel_read_body()
783
            return None
2018.18.8 by Ian Clatworthy
Tarball proxy code & tests
784
        if response[0] == 'ok':
785
            # Extract the tarball and return it
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
786
            t = tempfile.NamedTemporaryFile()
787
            # TODO: rpc layer should read directly into it...
788
            t.write(protocol.read_body_bytes())
789
            t.seek(0)
790
            return t
2814.10.1 by Andrew Bennetts
Cope gracefully if the server doesn't support the Repository.tarball smart request.
791
        raise errors.UnexpectedSmartServerResponse(response)
2018.18.8 by Ian Clatworthy
Tarball proxy code & tests
792
2440.1.1 by Martin Pool
Add new Repository.sprout,
793
    def sprout(self, to_bzrdir, revision_id=None):
794
        # TODO: Option to control what format is created?
3047.1.1 by Andrew Bennetts
Fix for bug 164626, add test that Repository.sprout preserves format.
795
        self._ensure_real()
3047.1.4 by Andrew Bennetts
Simplify RemoteRepository.sprout thanks to review comments.
796
        dest_repo = self._real_repository._format.initialize(to_bzrdir,
797
                                                             shared=False)
2535.3.17 by Andrew Bennetts
[broken] Closer to a working Repository.fetch_revisions smart request.
798
        dest_repo.fetch(self, revision_id=revision_id)
799
        return dest_repo
2440.1.1 by Martin Pool
Add new Repository.sprout,
800
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
801
    ### These methods are just thin shims to the VFS object for now.
802
803
    def revision_tree(self, revision_id):
804
        self._ensure_real()
805
        return self._real_repository.revision_tree(revision_id)
806
2520.4.113 by Aaron Bentley
Avoid peeking at Repository._serializer
807
    def get_serializer_format(self):
808
        self._ensure_real()
809
        return self._real_repository.get_serializer_format()
810
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
811
    def get_commit_builder(self, branch, parents, config, timestamp=None,
812
                           timezone=None, committer=None, revprops=None,
813
                           revision_id=None):
814
        # FIXME: It ought to be possible to call this without immediately
815
        # triggering _ensure_real.  For now it's the easiest thing to do.
816
        self._ensure_real()
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
817
        real_repo = self._real_repository
818
        builder = real_repo.get_commit_builder(branch, parents,
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
819
                config, timestamp=timestamp, timezone=timezone,
820
                committer=committer, revprops=revprops, revision_id=revision_id)
821
        return builder
822
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
823
    def add_fallback_repository(self, repository):
824
        """Add a repository to use for looking up data not held locally.
825
        
826
        :param repository: A repository.
827
        """
3691.2.11 by Martin Pool
More tests around RemoteBranch stacking.
828
        # XXX: At the moment the RemoteRepository will allow fallbacks
829
        # unconditionally - however, a _real_repository will usually exist,
830
        # and may raise an error if it's not accommodated by the underlying
831
        # format.  Eventually we should check when opening the repository
832
        # whether it's willing to allow them or not.
833
        #
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
834
        # We need to accumulate additional repositories here, to pass them in
835
        # on various RPC's.
836
        self._fallback_repositories.append(repository)
3691.2.6 by Martin Pool
Disable RemoteBranch stacking, but get get_stacked_on_url working, and passing back exceptions
837
        # They are also seen by the fallback repository.  If it doesn't exist
3691.2.12 by Martin Pool
Add test for coping without Branch.get_stacked_on_url
838
        # yet they'll be added then.  This implicitly copies them.
3691.2.11 by Martin Pool
More tests around RemoteBranch stacking.
839
        self._ensure_real()
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
840
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
841
    def add_inventory(self, revid, inv, parents):
842
        self._ensure_real()
843
        return self._real_repository.add_inventory(revid, inv, parents)
844
3879.2.2 by John Arbash Meinel
Rename add_inventory_delta to add_inventory_by_delta.
845
    def add_inventory_by_delta(self, basis_revision_id, delta, new_revision_id,
846
                               parents):
3775.2.1 by Robert Collins
Create bzrlib.repository.Repository.add_inventory_delta for adding inventories via deltas.
847
        self._ensure_real()
3879.2.2 by John Arbash Meinel
Rename add_inventory_delta to add_inventory_by_delta.
848
        return self._real_repository.add_inventory_by_delta(basis_revision_id,
3775.2.1 by Robert Collins
Create bzrlib.repository.Repository.add_inventory_delta for adding inventories via deltas.
849
            delta, new_revision_id, parents)
850
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
851
    def add_revision(self, rev_id, rev, inv=None, config=None):
852
        self._ensure_real()
853
        return self._real_repository.add_revision(
854
            rev_id, rev, inv=inv, config=config)
855
856
    @needs_read_lock
857
    def get_inventory(self, revision_id):
858
        self._ensure_real()
859
        return self._real_repository.get_inventory(revision_id)
860
3169.2.1 by Robert Collins
New method ``iter_inventories`` on Repository for access to many
861
    def iter_inventories(self, revision_ids):
862
        self._ensure_real()
863
        return self._real_repository.iter_inventories(revision_ids)
864
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
865
    @needs_read_lock
866
    def get_revision(self, revision_id):
867
        self._ensure_real()
868
        return self._real_repository.get_revision(revision_id)
869
870
    def get_transaction(self):
871
        self._ensure_real()
872
        return self._real_repository.get_transaction()
873
874
    @needs_read_lock
2018.5.138 by Robert Collins
Merge bzr.dev.
875
    def clone(self, a_bzrdir, revision_id=None):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
876
        self._ensure_real()
2018.5.138 by Robert Collins
Merge bzr.dev.
877
        return self._real_repository.clone(a_bzrdir, revision_id=revision_id)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
878
879
    def make_working_trees(self):
3349.1.1 by Aaron Bentley
Enable setting and getting make_working_trees for all repositories
880
        """See Repository.make_working_trees"""
881
        self._ensure_real()
882
        return self._real_repository.make_working_trees()
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
883
3184.1.9 by Robert Collins
* ``Repository.get_data_stream`` is now deprecated in favour of
884
    def revision_ids_to_search_result(self, result_set):
885
        """Convert a set of revision ids to a graph SearchResult."""
886
        result_parents = set()
887
        for parents in self.get_graph().get_parent_map(
888
            result_set).itervalues():
889
            result_parents.update(parents)
890
        included_keys = result_set.intersection(result_parents)
891
        start_keys = result_set.difference(included_keys)
892
        exclude_keys = result_parents.difference(result_set)
893
        result = graph.SearchResult(start_keys, exclude_keys,
894
            len(result_set), result_set)
895
        return result
896
897
    @needs_read_lock
898
    def search_missing_revision_ids(self, other, revision_id=None, find_ghosts=True):
899
        """Return the revision ids that other has that this does not.
900
        
901
        These are returned in topological order.
902
903
        revision_id: only return revision ids included by revision_id.
904
        """
905
        return repository.InterRepository.get(
906
            other, self).search_missing_revision_ids(revision_id, find_ghosts)
907
3452.2.1 by Andrew Bennetts
An experimental InterRepo for remote packs.
908
    def fetch(self, source, revision_id=None, pb=None, find_ghosts=False):
909
        # Not delegated to _real_repository so that InterRepository.get has a
910
        # chance to find an InterRepository specialised for RemoteRepository.
2881.4.1 by Robert Collins
Move responsibility for detecting same-repo fetching from the
911
        if self.has_same_location(source):
912
            # check that last_revision is in 'from' and then return a
913
            # no-operation.
914
            if (revision_id is not None and
2948.3.1 by John Arbash Meinel
Fix bug #158333, make sure that Repository.fetch(self) is properly a no-op for all Repository implementations.
915
                not revision.is_null(revision_id)):
2881.4.1 by Robert Collins
Move responsibility for detecting same-repo fetching from the
916
                self.get_revision(revision_id)
2592.4.5 by Martin Pool
Add Repository.base on all repositories.
917
            return 0, []
3709.5.1 by Andrew Bennetts
Allow pushing to a pack repo over HPSS use the get_parent_map RPC, and teach the get_parent_map client to cache missing revisions.
918
        inter = repository.InterRepository.get(source, self)
3452.2.1 by Andrew Bennetts
An experimental InterRepo for remote packs.
919
        try:
920
            return inter.fetch(revision_id=revision_id, pb=pb, find_ghosts=find_ghosts)
921
        except NotImplementedError:
922
            raise errors.IncompatibleRepositories(source, self)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
923
2520.4.54 by Aaron Bentley
Hang a create_bundle method off repository
924
    def create_bundle(self, target, base, fileobj, format=None):
925
        self._ensure_real()
926
        self._real_repository.create_bundle(target, base, fileobj, format)
927
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
928
    @needs_read_lock
2530.1.1 by Aaron Bentley
Make topological sorting optional for get_ancestry
929
    def get_ancestry(self, revision_id, topo_sorted=True):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
930
        self._ensure_real()
2530.1.1 by Aaron Bentley
Make topological sorting optional for get_ancestry
931
        return self._real_repository.get_ancestry(revision_id, topo_sorted)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
932
933
    def fileids_altered_by_revision_ids(self, revision_ids):
934
        self._ensure_real()
935
        return self._real_repository.fileids_altered_by_revision_ids(revision_ids)
936
3036.1.3 by Robert Collins
Privatise VersionedFileChecker.
937
    def _get_versioned_file_checker(self, revisions, revision_versions_cache):
2745.6.1 by Aaron Bentley
Initial checking of knit graphs
938
        self._ensure_real()
3036.1.3 by Robert Collins
Privatise VersionedFileChecker.
939
        return self._real_repository._get_versioned_file_checker(
2745.6.50 by Andrew Bennetts
Remove find_bad_ancestors; it's not needed anymore.
940
            revisions, revision_versions_cache)
941
        
2708.1.7 by Aaron Bentley
Rename extract_files_bytes to iter_files_bytes
942
    def iter_files_bytes(self, desired_files):
2708.1.9 by Aaron Bentley
Clean-up docs and imports
943
        """See Repository.iter_file_bytes.
2708.1.3 by Aaron Bentley
Implement extract_files_bytes on Repository
944
        """
945
        self._ensure_real()
2708.1.7 by Aaron Bentley
Rename extract_files_bytes to iter_files_bytes
946
        return self._real_repository.iter_files_bytes(desired_files)
2708.1.3 by Aaron Bentley
Implement extract_files_bytes on Repository
947
3565.3.1 by Robert Collins
* The generic fetch code now uses two attributes on Repository objects
948
    @property
949
    def _fetch_order(self):
950
        """Decorate the real repository for now.
951
952
        In the long term getting this back from the remote repository as part
953
        of open would be more efficient.
954
        """
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
955
        self._ensure_real()
956
        return self._real_repository._fetch_order
3565.3.1 by Robert Collins
* The generic fetch code now uses two attributes on Repository objects
957
958
    @property
959
    def _fetch_uses_deltas(self):
960
        """Decorate the real repository for now.
961
962
        In the long term getting this back from the remote repository as part
963
        of open would be more efficient.
964
        """
965
        self._ensure_real()
966
        return self._real_repository._fetch_uses_deltas
967
3565.3.4 by Robert Collins
Defer decision to reconcile to the repository being fetched into.
968
    @property
969
    def _fetch_reconcile(self):
970
        """Decorate the real repository for now.
971
972
        In the long term getting this back from the remote repository as part
973
        of open would be more efficient.
974
        """
975
        self._ensure_real()
976
        return self._real_repository._fetch_reconcile
977
3835.1.1 by Aaron Bentley
Stack get_parent_map on fallback repos
978
    def get_parent_map(self, revision_ids):
3835.1.6 by Aaron Bentley
Reduce inefficiency when doing make_parents_provider frequently
979
        """See bzrlib.Graph.get_parent_map()."""
3835.1.5 by Aaron Bentley
Fix make_parents_provider
980
        return self._make_parents_provider().get_parent_map(revision_ids)
3835.1.1 by Aaron Bentley
Stack get_parent_map on fallback repos
981
982
    def _get_parent_map_rpc(self, keys):
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
983
        """Helper for get_parent_map that performs the RPC."""
3313.2.1 by Andrew Bennetts
Change _SmartClient's API to accept a medium and a base, rather than a _SharedConnection.
984
        medium = self._client._medium
3453.4.10 by Andrew Bennetts
Change _is_remote_at_least to _is_remote_before.
985
        if medium._is_remote_before((1, 2)):
3213.1.1 by Andrew Bennetts
Recover (by reconnecting) if the server turns out not to understand the new requests in 1.2 that send bodies.
986
            # We already found out that the server can't understand
3213.1.3 by Andrew Bennetts
Fix typo in comment.
987
            # Repository.get_parent_map requests, so just fetch the whole
3213.1.1 by Andrew Bennetts
Recover (by reconnecting) if the server turns out not to understand the new requests in 1.2 that send bodies.
988
            # graph.
3287.6.1 by Robert Collins
* ``VersionedFile.get_graph`` is deprecated, with no replacement method.
989
            # XXX: Note that this will issue a deprecation warning. This is ok
990
            # :- its because we're working with a deprecated server anyway, and
991
            # the user will almost certainly have seen a warning about the
992
            # server version already.
3389.1.1 by John Arbash Meinel
Fix bug #214894. Fix RemoteRepository.get_parent_map() when server is <v1.2
993
            rg = self.get_revision_graph()
994
            # There is an api discrepency between get_parent_map and
995
            # get_revision_graph. Specifically, a "key:()" pair in
996
            # get_revision_graph just means a node has no parents. For
997
            # "get_parent_map" it means the node is a ghost. So fix up the
998
            # graph to correct this.
999
            #   https://bugs.launchpad.net/bzr/+bug/214894
1000
            # There is one other "bug" which is that ghosts in
1001
            # get_revision_graph() are not returned at all. But we won't worry
1002
            # about that for now.
1003
            for node_id, parent_ids in rg.iteritems():
1004
                if parent_ids == ():
1005
                    rg[node_id] = (NULL_REVISION,)
1006
            rg[NULL_REVISION] = ()
1007
            return rg
3213.1.1 by Andrew Bennetts
Recover (by reconnecting) if the server turns out not to understand the new requests in 1.2 that send bodies.
1008
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1009
        keys = set(keys)
3373.5.2 by John Arbash Meinel
Add repository_implementation tests for get_parent_map
1010
        if None in keys:
1011
            raise ValueError('get_parent_map(None) is not valid')
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1012
        if NULL_REVISION in keys:
1013
            keys.discard(NULL_REVISION)
1014
            found_parents = {NULL_REVISION:()}
1015
            if not keys:
1016
                return found_parents
1017
        else:
1018
            found_parents = {}
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1019
        # TODO(Needs analysis): We could assume that the keys being requested
1020
        # from get_parent_map are in a breadth first search, so typically they
1021
        # will all be depth N from some common parent, and we don't have to
1022
        # have the server iterate from the root parent, but rather from the
1023
        # keys we're searching; and just tell the server the keyspace we
1024
        # already have; but this may be more traffic again.
1025
1026
        # Transform self._parents_map into a search request recipe.
1027
        # TODO: Manage this incrementally to avoid covering the same path
1028
        # repeatedly. (The server will have to on each request, but the less
1029
        # work done the better).
3835.1.8 by Aaron Bentley
Make UnstackedParentsProvider manage the cache
1030
        parents_map = self._unstacked_provider.get_cached_map()
3213.1.8 by Andrew Bennetts
Merge from bzr.dev.
1031
        if parents_map is None:
1032
            # Repository is not locked, so there's no cache.
1033
            parents_map = {}
1034
        start_set = set(parents_map)
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1035
        result_parents = set()
3213.1.8 by Andrew Bennetts
Merge from bzr.dev.
1036
        for parents in parents_map.itervalues():
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1037
            result_parents.update(parents)
1038
        stop_keys = result_parents.difference(start_set)
1039
        included_keys = start_set.intersection(result_parents)
1040
        start_set.difference_update(included_keys)
3213.1.8 by Andrew Bennetts
Merge from bzr.dev.
1041
        recipe = (start_set, stop_keys, len(parents_map))
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1042
        body = self._serialise_search_recipe(recipe)
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1043
        path = self.bzrdir._path_for_remote_call(self._client)
1044
        for key in keys:
3360.2.8 by Martin Pool
Change assertion to a plain raise
1045
            if type(key) is not str:
1046
                raise ValueError(
1047
                    "key %r not a plain string" % (key,))
3172.5.8 by Robert Collins
Review feedback.
1048
        verb = 'Repository.get_parent_map'
3211.5.1 by Robert Collins
Change the smart server get_parents method to take a graph search to exclude already recieved parents from. This prevents history shortcuts causing huge numbers of duplicates.
1049
        args = (path,) + tuple(keys)
3297.3.3 by Andrew Bennetts
SmartClientRequestProtocol*.read_response_tuple can now raise UnknownSmartMethod. Callers no longer need to do their own ad hoc unknown smart method error detection.
1050
        try:
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1051
            response = self._call_with_body_bytes_expecting_body(
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1052
                verb, args, body)
3297.3.3 by Andrew Bennetts
SmartClientRequestProtocol*.read_response_tuple can now raise UnknownSmartMethod. Callers no longer need to do their own ad hoc unknown smart method error detection.
1053
        except errors.UnknownSmartMethod:
3213.1.2 by Andrew Bennetts
Add test for reconnection if get_parent_map is unknown by the server.
1054
            # Server does not support this method, so get the whole graph.
3213.1.1 by Andrew Bennetts
Recover (by reconnecting) if the server turns out not to understand the new requests in 1.2 that send bodies.
1055
            # Worse, we have to force a disconnection, because the server now
1056
            # doesn't realise it has a body on the wire to consume, so the
1057
            # only way to recover is to abandon the connection.
3213.1.6 by Andrew Bennetts
Emit warnings when forcing a reconnect.
1058
            warning(
1059
                'Server is too old for fast get_parent_map, reconnecting.  '
1060
                '(Upgrade the server to Bazaar 1.2 to avoid this)')
3213.1.1 by Andrew Bennetts
Recover (by reconnecting) if the server turns out not to understand the new requests in 1.2 that send bodies.
1061
            medium.disconnect()
1062
            # To avoid having to disconnect repeatedly, we keep track of the
1063
            # fact the server doesn't understand remote methods added in 1.2.
3453.4.9 by Andrew Bennetts
Rename _remote_is_not to _remember_remote_is_before.
1064
            medium._remember_remote_is_before((1, 2))
3297.3.4 by Andrew Bennetts
Merge from bzr.dev.
1065
            return self.get_revision_graph(None)
3245.4.58 by Andrew Bennetts
Unpack call_expecting_body's return value into variables, to avoid lots of ugly subscripting.
1066
        response_tuple, response_handler = response
1067
        if response_tuple[0] not in ['ok']:
1068
            response_handler.cancel_read_body()
1069
            raise errors.UnexpectedSmartServerResponse(response_tuple)
1070
        if response_tuple[0] == 'ok':
1071
            coded = bz2.decompress(response_handler.read_body_bytes())
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1072
            if coded == '':
1073
                # no revisions found
1074
                return {}
1075
            lines = coded.split('\n')
1076
            revision_graph = {}
1077
            for line in lines:
1078
                d = tuple(line.split())
1079
                if len(d) > 1:
1080
                    revision_graph[d[0]] = d[1:]
1081
                else:
1082
                    # No parents - so give the Graph result (NULL_REVISION,).
1083
                    revision_graph[d[0]] = (NULL_REVISION,)
1084
            return revision_graph
1085
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1086
    @needs_read_lock
1087
    def get_signature_text(self, revision_id):
1088
        self._ensure_real()
1089
        return self._real_repository.get_signature_text(revision_id)
1090
1091
    @needs_read_lock
3228.4.11 by John Arbash Meinel
Deprecations abound.
1092
    @symbol_versioning.deprecated_method(symbol_versioning.one_three)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1093
    def get_revision_graph_with_ghosts(self, revision_ids=None):
1094
        self._ensure_real()
1095
        return self._real_repository.get_revision_graph_with_ghosts(
1096
            revision_ids=revision_ids)
1097
1098
    @needs_read_lock
1099
    def get_inventory_xml(self, revision_id):
1100
        self._ensure_real()
1101
        return self._real_repository.get_inventory_xml(revision_id)
1102
1103
    def deserialise_inventory(self, revision_id, xml):
1104
        self._ensure_real()
1105
        return self._real_repository.deserialise_inventory(revision_id, xml)
1106
1107
    def reconcile(self, other=None, thorough=False):
1108
        self._ensure_real()
1109
        return self._real_repository.reconcile(other=other, thorough=thorough)
1110
        
1111
    def all_revision_ids(self):
1112
        self._ensure_real()
1113
        return self._real_repository.all_revision_ids()
1114
    
1115
    @needs_read_lock
1116
    def get_deltas_for_revisions(self, revisions):
1117
        self._ensure_real()
1118
        return self._real_repository.get_deltas_for_revisions(revisions)
1119
1120
    @needs_read_lock
1121
    def get_revision_delta(self, revision_id):
1122
        self._ensure_real()
1123
        return self._real_repository.get_revision_delta(revision_id)
1124
1125
    @needs_read_lock
1126
    def revision_trees(self, revision_ids):
1127
        self._ensure_real()
1128
        return self._real_repository.revision_trees(revision_ids)
1129
1130
    @needs_read_lock
1131
    def get_revision_reconcile(self, revision_id):
1132
        self._ensure_real()
1133
        return self._real_repository.get_revision_reconcile(revision_id)
1134
1135
    @needs_read_lock
2745.6.36 by Andrew Bennetts
Deprecate revision_ids arg to Repository.check and other tweaks.
1136
    def check(self, revision_ids=None):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1137
        self._ensure_real()
2745.6.36 by Andrew Bennetts
Deprecate revision_ids arg to Repository.check and other tweaks.
1138
        return self._real_repository.check(revision_ids=revision_ids)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1139
2018.5.138 by Robert Collins
Merge bzr.dev.
1140
    def copy_content_into(self, destination, revision_id=None):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1141
        self._ensure_real()
1142
        return self._real_repository.copy_content_into(
2018.5.138 by Robert Collins
Merge bzr.dev.
1143
            destination, revision_id=revision_id)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1144
2814.10.2 by Andrew Bennetts
Make the fallback a little tidier.
1145
    def _copy_repository_tarball(self, to_bzrdir, revision_id=None):
2018.18.10 by Martin Pool
copy_content_into from Remote repositories by using temporary directories on both ends.
1146
        # get a tarball of the remote repository, and copy from that into the
1147
        # destination
1148
        from bzrlib import osutils
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
1149
        import tarfile
2018.18.20 by Martin Pool
Route branch operations through remote copy_content_into
1150
        # TODO: Maybe a progress bar while streaming the tarball?
1151
        note("Copying repository content as tarball...")
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1152
        tar_file = self._get_tarball('bz2')
2814.10.2 by Andrew Bennetts
Make the fallback a little tidier.
1153
        if tar_file is None:
1154
            return None
1155
        destination = to_bzrdir.create_repository()
2018.18.10 by Martin Pool
copy_content_into from Remote repositories by using temporary directories on both ends.
1156
        try:
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1157
            tar = tarfile.open('repository', fileobj=tar_file,
1158
                mode='r|bz2')
3638.3.2 by Vincent Ladeuil
Fix all calls to tempfile.mkdtemp to osutils.mkdtemp.
1159
            tmpdir = osutils.mkdtemp()
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1160
            try:
1161
                _extract_tar(tar, tmpdir)
1162
                tmp_bzrdir = BzrDir.open(tmpdir)
1163
                tmp_repo = tmp_bzrdir.open_repository()
1164
                tmp_repo.copy_content_into(destination, revision_id)
1165
            finally:
1166
                osutils.rmtree(tmpdir)
2018.18.10 by Martin Pool
copy_content_into from Remote repositories by using temporary directories on both ends.
1167
        finally:
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1168
            tar_file.close()
2814.10.2 by Andrew Bennetts
Make the fallback a little tidier.
1169
        return destination
2018.18.23 by Martin Pool
review cleanups
1170
        # TODO: Suggestion from john: using external tar is much faster than
1171
        # python's tarfile library, but it may not work on windows.
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1172
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1173
    @property
1174
    def inventories(self):
1175
        """Decorate the real repository for now.
1176
1177
        In the long term a full blown network facility is needed to
1178
        avoid creating a real repository object locally.
1179
        """
1180
        self._ensure_real()
1181
        return self._real_repository.inventories
1182
2604.2.1 by Robert Collins
(robertc) Introduce a pack command.
1183
    @needs_write_lock
1184
    def pack(self):
1185
        """Compress the data within the repository.
1186
1187
        This is not currently implemented within the smart server.
1188
        """
1189
        self._ensure_real()
1190
        return self._real_repository.pack()
1191
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1192
    @property
1193
    def revisions(self):
1194
        """Decorate the real repository for now.
1195
1196
        In the short term this should become a real object to intercept graph
1197
        lookups.
1198
1199
        In the long term a full blown network facility is needed.
1200
        """
1201
        self._ensure_real()
1202
        return self._real_repository.revisions
1203
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1204
    def set_make_working_trees(self, new_value):
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
1205
        if new_value:
1206
            new_value_str = "True"
1207
        else:
1208
            new_value_str = "False"
1209
        path = self.bzrdir._path_for_remote_call(self._client)
1210
        try:
1211
            response = self._call(
1212
                'Repository.set_make_working_trees', path, new_value_str)
1213
        except errors.UnknownSmartMethod:
1214
            self._ensure_real()
1215
            self._real_repository.set_make_working_trees(new_value)
1216
        else:
1217
            if response[0] != 'ok':
1218
                raise errors.UnexpectedSmartServerResponse(response)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1219
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1220
    @property
1221
    def signatures(self):
1222
        """Decorate the real repository for now.
1223
1224
        In the long term a full blown network facility is needed to avoid
1225
        creating a real repository object locally.
1226
        """
1227
        self._ensure_real()
1228
        return self._real_repository.signatures
1229
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1230
    @needs_write_lock
1231
    def sign_revision(self, revision_id, gpg_strategy):
1232
        self._ensure_real()
1233
        return self._real_repository.sign_revision(revision_id, gpg_strategy)
1234
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1235
    @property
1236
    def texts(self):
1237
        """Decorate the real repository for now.
1238
1239
        In the long term a full blown network facility is needed to avoid
1240
        creating a real repository object locally.
1241
        """
1242
        self._ensure_real()
1243
        return self._real_repository.texts
1244
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1245
    @needs_read_lock
1246
    def get_revisions(self, revision_ids):
1247
        self._ensure_real()
1248
        return self._real_repository.get_revisions(revision_ids)
1249
1250
    def supports_rich_root(self):
2018.5.84 by Andrew Bennetts
Merge in supports-rich-root, another test passing.
1251
        self._ensure_real()
1252
        return self._real_repository.supports_rich_root()
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1253
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
1254
    def iter_reverse_revision_history(self, revision_id):
1255
        self._ensure_real()
1256
        return self._real_repository.iter_reverse_revision_history(revision_id)
1257
2018.5.96 by Andrew Bennetts
Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's
1258
    @property
1259
    def _serializer(self):
1260
        self._ensure_real()
1261
        return self._real_repository._serializer
1262
2018.5.97 by Andrew Bennetts
Fix more tests.
1263
    def store_revision_signature(self, gpg_strategy, plaintext, revision_id):
1264
        self._ensure_real()
1265
        return self._real_repository.store_revision_signature(
1266
            gpg_strategy, plaintext, revision_id)
1267
2996.2.8 by Aaron Bentley
Fix add_signature discrepancies
1268
    def add_signature_text(self, revision_id, signature):
2996.2.3 by Aaron Bentley
Add tests for install_revisions and add_signature
1269
        self._ensure_real()
2996.2.8 by Aaron Bentley
Fix add_signature discrepancies
1270
        return self._real_repository.add_signature_text(revision_id, signature)
2996.2.3 by Aaron Bentley
Add tests for install_revisions and add_signature
1271
2018.5.97 by Andrew Bennetts
Fix more tests.
1272
    def has_signature_for_revision_id(self, revision_id):
1273
        self._ensure_real()
1274
        return self._real_repository.has_signature_for_revision_id(revision_id)
1275
2535.3.45 by Andrew Bennetts
Add item_keys_introduced_by to RemoteRepository.
1276
    def item_keys_introduced_by(self, revision_ids, _files_pb=None):
1277
        self._ensure_real()
1278
        return self._real_repository.item_keys_introduced_by(revision_ids,
1279
            _files_pb=_files_pb)
1280
2819.2.4 by Andrew Bennetts
Add a 'revision_graph_can_have_wrong_parents' method to repository.
1281
    def revision_graph_can_have_wrong_parents(self):
1282
        # The answer depends on the remote repo format.
1283
        self._ensure_real()
1284
        return self._real_repository.revision_graph_can_have_wrong_parents()
1285
2819.2.5 by Andrew Bennetts
Make reconcile abort gracefully if the revision index has bad parents.
1286
    def _find_inconsistent_revision_parents(self):
1287
        self._ensure_real()
1288
        return self._real_repository._find_inconsistent_revision_parents()
1289
1290
    def _check_for_inconsistent_revision_parents(self):
1291
        self._ensure_real()
1292
        return self._real_repository._check_for_inconsistent_revision_parents()
1293
3835.1.17 by Aaron Bentley
Fix stacking bug
1294
    def _make_parents_provider(self, other=None):
3835.1.8 by Aaron Bentley
Make UnstackedParentsProvider manage the cache
1295
        providers = [self._unstacked_provider]
3835.1.17 by Aaron Bentley
Fix stacking bug
1296
        if other is not None:
1297
            providers.insert(0, other)
3835.1.7 by Aaron Bentley
Updates from review
1298
        providers.extend(r._make_parents_provider() for r in
1299
                         self._fallback_repositories)
1300
        return graph._StackedParentsProvider(providers)
3172.5.1 by Robert Collins
Create a RemoteRepository get_graph implementation and delegate get_parents_map to the real repository.
1301
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1302
    def _serialise_search_recipe(self, recipe):
1303
        """Serialise a graph search recipe.
1304
1305
        :param recipe: A search recipe (start, stop, count).
1306
        :return: Serialised bytes.
1307
        """
1308
        start_keys = ' '.join(recipe[0])
1309
        stop_keys = ' '.join(recipe[1])
1310
        count = str(recipe[2])
1311
        return '\n'.join((start_keys, stop_keys, count))
1312
3842.3.2 by Andrew Bennetts
Revert the RemoteVersionedFiles.get_parent_map implementation, leaving just the skeleton of RemoteVersionedFiles.
1313
    def autopack(self):
1314
        path = self.bzrdir._path_for_remote_call(self._client)
1315
        try:
1316
            response = self._call('PackRepository.autopack', path)
1317
        except errors.UnknownSmartMethod:
1318
            self._ensure_real()
1319
            self._real_repository._pack_collection.autopack()
1320
            return
1321
        if self._real_repository is not None:
1322
            # Reset the real repository's cache of pack names.
1323
            # XXX: At some point we may be able to skip this and just rely on
1324
            # the automatic retry logic to do the right thing, but for now we
1325
            # err on the side of being correct rather than being optimal.
1326
            self._real_repository._pack_collection.reload_pack_names()
1327
        if response[0] != 'ok':
1328
            raise errors.UnexpectedSmartServerResponse(response)
1329
1330
2018.5.127 by Andrew Bennetts
Fix most of the lockable_files tests for RemoteBranchLockableFiles.
1331
class RemoteBranchLockableFiles(LockableFiles):
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
1332
    """A 'LockableFiles' implementation that talks to a smart server.
1333
    
1334
    This is not a public interface class.
1335
    """
1336
1337
    def __init__(self, bzrdir, _client):
1338
        self.bzrdir = bzrdir
1339
        self._client = _client
2018.5.135 by Andrew Bennetts
Prevent remote branch clients from determining the 'right' mode for control files, because we don't want clients setting the mode anyway.
1340
        self._need_find_modes = True
2018.5.133 by Andrew Bennetts
All TestLockableFiles_RemoteLockDir tests passing.
1341
        LockableFiles.__init__(
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1342
            self, bzrdir.get_branch_transport(None),
2018.5.133 by Andrew Bennetts
All TestLockableFiles_RemoteLockDir tests passing.
1343
            'lock', lockdir.LockDir)
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
1344
2018.5.135 by Andrew Bennetts
Prevent remote branch clients from determining the 'right' mode for control files, because we don't want clients setting the mode anyway.
1345
    def _find_modes(self):
1346
        # RemoteBranches don't let the client set the mode of control files.
1347
        self._dir_mode = None
1348
        self._file_mode = None
1349
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
1350
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1351
class RemoteBranchFormat(branch.BranchFormat):
1352
3834.5.2 by John Arbash Meinel
Track down the various BranchFormats that weren't setting the branch format as part of the _matchingbzrdir format.
1353
    def __init__(self):
1354
        super(RemoteBranchFormat, self).__init__()
1355
        self._matchingbzrdir = RemoteBzrDirFormat()
1356
        self._matchingbzrdir.set_branch_format(self)
1357
2018.5.124 by Robert Collins
Fix test_format_initialize_find_open by delegating Branch formt lookup to the BzrDir, where it should have stayed from the start.
1358
    def __eq__(self, other):
1359
        return (isinstance(other, RemoteBranchFormat) and 
1360
            self.__dict__ == other.__dict__)
1361
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
1362
    def get_format_description(self):
1363
        return 'Remote BZR Branch'
1364
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1365
    def get_format_string(self):
1366
        return 'Remote BZR Branch'
1367
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1368
    def open(self, a_bzrdir):
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
1369
        return a_bzrdir.open_branch()
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1370
1371
    def initialize(self, a_bzrdir):
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1372
        # Delegate to a _real object here - the RemoteBzrDir format now
1373
        # supports delegating to parameterised branch formats and as such
1374
        # this RemoteBranchFormat method is only called when no specific format
1375
        # is selected.
1376
        if not isinstance(a_bzrdir, RemoteBzrDir):
1377
            result = a_bzrdir.create_branch()
1378
        else:
1379
            a_bzrdir._ensure_real()
1380
            result = a_bzrdir._real_bzrdir.create_branch()
1381
        if not isinstance(result, RemoteBranch):
1382
            result = RemoteBranch(a_bzrdir, a_bzrdir.find_repository(), result)
1383
        return result
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1384
2696.3.6 by Martin Pool
Mark RemoteBranch as (possibly) supporting tags
1385
    def supports_tags(self):
1386
        # Remote branches might support tags, but we won't know until we
1387
        # access the real remote branch.
1388
        return True
1389
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1390
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1391
class RemoteBranch(branch.Branch, _RpcHelper):
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1392
    """Branch stored on a server accessed by HPSS RPC.
1393
1394
    At the moment most operations are mapped down to simple file operations.
1395
    """
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
1396
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
1397
    def __init__(self, remote_bzrdir, remote_repository, real_branch=None,
1398
        _client=None):
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
1399
        """Create a RemoteBranch instance.
1400
1401
        :param real_branch: An optional local implementation of the branch
1402
            format, usually accessing the data via the VFS.
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
1403
        :param _client: Private parameter for testing.
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
1404
        """
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1405
        # We intentionally don't call the parent class's __init__, because it
1406
        # will try to assign to self.tags, which is a property in this subclass.
1407
        # And the parent's __init__ doesn't do much anyway.
2978.7.1 by John Arbash Meinel
Fix bug #162486, by having RemoteBranch properly initialize self._revision_id_to_revno_map.
1408
        self._revision_id_to_revno_cache = None
3949.2.6 by Ian Clatworthy
review feedback from jam
1409
        self._partial_revision_id_to_revno_cache = {}
2018.5.105 by Andrew Bennetts
Implement revision_history caching for RemoteBranch.
1410
        self._revision_history_cache = None
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1411
        self._last_revision_info_cache = None
3949.3.4 by Ian Clatworthy
jam feedback: start & stop limits; simple caching
1412
        self._merge_sorted_revisions_cache = None
1752.2.64 by Andrew Bennetts
Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.
1413
        self.bzrdir = remote_bzrdir
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
1414
        if _client is not None:
1415
            self._client = _client
1416
        else:
3313.2.1 by Andrew Bennetts
Change _SmartClient's API to accept a medium and a base, rather than a _SharedConnection.
1417
            self._client = remote_bzrdir._client
1752.2.64 by Andrew Bennetts
Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.
1418
        self.repository = remote_repository
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
1419
        if real_branch is not None:
1420
            self._real_branch = real_branch
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1421
            # Give the remote repository the matching real repo.
2018.5.97 by Andrew Bennetts
Fix more tests.
1422
            real_repo = self._real_branch.repository
1423
            if isinstance(real_repo, RemoteRepository):
1424
                real_repo._ensure_real()
1425
                real_repo = real_repo._real_repository
1426
            self.repository._set_real_repository(real_repo)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1427
            # Give the branch the remote repository to let fast-pathing happen.
1428
            self._real_branch.repository = self.repository
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1429
        else:
1430
            self._real_branch = None
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
1431
        # Fill out expected attributes of branch for bzrlib api users.
1752.2.64 by Andrew Bennetts
Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.
1432
        self._format = RemoteBranchFormat()
2018.5.55 by Robert Collins
Give RemoteBranch a base url in line with the Branch protocol.
1433
        self.base = self.bzrdir.root_transport.base
2018.5.169 by Andrew Bennetts
Add a _server_formats flag to BzrDir.open_from_transport and BzrDirFormat.find_format, make RemoteBranch.control_files into a property.
1434
        self._control_files = None
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1435
        self._lock_mode = None
1436
        self._lock_token = None
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
1437
        self._repo_lock_token = None
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1438
        self._lock_count = 0
1439
        self._leave_lock = False
3681.1.2 by Robert Collins
Adjust for trunk.
1440
        # The base class init is not called, so we duplicate this:
3681.1.1 by Robert Collins
Create a new hook Branch.open. (Robert Collins)
1441
        hooks = branch.Branch.hooks['open']
1442
        for hook in hooks:
1443
            hook(self)
3691.2.7 by Martin Pool
FakeClient can know what calls to expect
1444
        self._setup_stacking()
3691.2.1 by Martin Pool
RemoteBranch must configure stacking into the repository
1445
1446
    def _setup_stacking(self):
1447
        # configure stacking into the remote repository, by reading it from
3691.2.3 by Martin Pool
Factor out RemoteBranch._remote_path() and disable RemoteBranch stacking
1448
        # the vfs branch.
3691.2.1 by Martin Pool
RemoteBranch must configure stacking into the repository
1449
        try:
1450
            fallback_url = self.get_stacked_on_url()
1451
        except (errors.NotStacked, errors.UnstackableBranchFormat,
1452
            errors.UnstackableRepositoryFormat), e:
3691.2.7 by Martin Pool
FakeClient can know what calls to expect
1453
            return
1454
        # it's relative to this branch...
1455
        fallback_url = urlutils.join(self.base, fallback_url)
1456
        transports = [self.bzrdir.root_transport]
1457
        if self._real_branch is not None:
1458
            transports.append(self._real_branch._transport)
3830.2.1 by Aaron Bentley
Fix HPSS with branch stacked on repository branch
1459
        stacked_on = branch.Branch.open(fallback_url,
1460
                                        possible_transports=transports)
1461
        self.repository.add_fallback_repository(stacked_on.repository)
1752.2.64 by Andrew Bennetts
Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.
1462
3468.1.1 by Martin Pool
Update more users of default file modes from control_files to bzrdir
1463
    def _get_real_transport(self):
3407.2.16 by Martin Pool
Remove RemoteBranch reliance on control_files._transport
1464
        # if we try vfs access, return the real branch's vfs transport
1465
        self._ensure_real()
1466
        return self._real_branch._transport
1467
3468.1.1 by Martin Pool
Update more users of default file modes from control_files to bzrdir
1468
    _transport = property(_get_real_transport)
3407.2.16 by Martin Pool
Remove RemoteBranch reliance on control_files._transport
1469
2477.1.1 by Martin Pool
Add RemoteBranch repr
1470
    def __str__(self):
1471
        return "%s(%s)" % (self.__class__.__name__, self.base)
1472
1473
    __repr__ = __str__
1474
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1475
    def _ensure_real(self):
1476
        """Ensure that there is a _real_branch set.
1477
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1478
        Used before calls to self._real_branch.
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1479
        """
3407.2.16 by Martin Pool
Remove RemoteBranch reliance on control_files._transport
1480
        if self._real_branch is None:
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
1481
            if not vfs.vfs_enabled():
1482
                raise AssertionError('smart server vfs must be enabled '
1483
                    'to use vfs implementation')
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1484
            self.bzrdir._ensure_real()
1485
            self._real_branch = self.bzrdir._real_bzrdir.open_branch()
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
1486
            if self.repository._real_repository is None:
1487
                # Give the remote repository the matching real repo.
1488
                real_repo = self._real_branch.repository
1489
                if isinstance(real_repo, RemoteRepository):
1490
                    real_repo._ensure_real()
1491
                    real_repo = real_repo._real_repository
1492
                self.repository._set_real_repository(real_repo)
1493
            # Give the real branch the remote repository to let fast-pathing
1494
            # happen.
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1495
            self._real_branch.repository = self.repository
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1496
            if self._lock_mode == 'r':
1497
                self._real_branch.lock_read()
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
1498
            elif self._lock_mode == 'w':
1499
                self._real_branch.lock_write(token=self._lock_token)
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1500
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
1501
    def _translate_error(self, err, **context):
1502
        self.repository._translate_error(err, branch=self, **context)
1503
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1504
    def _clear_cached_state(self):
1505
        super(RemoteBranch, self)._clear_cached_state()
3441.5.5 by Andrew Bennetts
Some small tweaks and comments.
1506
        if self._real_branch is not None:
1507
            self._real_branch._clear_cached_state()
3441.5.29 by Andrew Bennetts
More review tweaks: whitespace nits in test_smart, add (and use) ._clear_cached_state_of_remote_branch_only method in bzrlib/remote.py.
1508
1509
    def _clear_cached_state_of_remote_branch_only(self):
1510
        """Like _clear_cached_state, but doesn't clear the cache of
1511
        self._real_branch.
1512
1513
        This is useful when falling back to calling a method of
1514
        self._real_branch that changes state.  In that case the underlying
1515
        branch changes, so we need to invalidate this RemoteBranch's cache of
1516
        it.  However, there's no need to invalidate the _real_branch's cache
1517
        too, in fact doing so might harm performance.
1518
        """
1519
        super(RemoteBranch, self)._clear_cached_state()
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1520
        
2018.5.169 by Andrew Bennetts
Add a _server_formats flag to BzrDir.open_from_transport and BzrDirFormat.find_format, make RemoteBranch.control_files into a property.
1521
    @property
1522
    def control_files(self):
1523
        # Defer actually creating RemoteBranchLockableFiles until its needed,
1524
        # because it triggers an _ensure_real that we otherwise might not need.
1525
        if self._control_files is None:
1526
            self._control_files = RemoteBranchLockableFiles(
1527
                self.bzrdir, self._client)
1528
        return self._control_files
1529
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
1530
    def _get_checkout_format(self):
1531
        self._ensure_real()
1532
        return self._real_branch._get_checkout_format()
1533
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
1534
    def get_physical_lock_status(self):
1535
        """See Branch.get_physical_lock_status()."""
1536
        # should be an API call to the server, as branches must be lockable.
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1537
        self._ensure_real()
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
1538
        return self._real_branch.get_physical_lock_status()
1539
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
1540
    def get_stacked_on_url(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
1541
        """Get the URL this branch is stacked against.
1542
1543
        :raises NotStacked: If the branch is not stacked.
1544
        :raises UnstackableBranchFormat: If the branch does not support
1545
            stacking.
1546
        :raises UnstackableRepositoryFormat: If the repository does not support
1547
            stacking.
1548
        """
3691.2.12 by Martin Pool
Add test for coping without Branch.get_stacked_on_url
1549
        try:
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1550
            # there may not be a repository yet, so we can't use
1551
            # self._translate_error, so we can't use self._call either.
3691.2.12 by Martin Pool
Add test for coping without Branch.get_stacked_on_url
1552
            response = self._client.call('Branch.get_stacked_on_url',
1553
                self._remote_path())
1554
        except errors.ErrorFromSmartServer, err:
1555
            # there may not be a repository yet, so we can't call through
1556
            # its _translate_error
1557
            _translate_error(err, branch=self)
1558
        except errors.UnknownSmartMethod, err:
1559
            self._ensure_real()
1560
            return self._real_branch.get_stacked_on_url()
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1561
        if response[0] != 'ok':
1562
            raise errors.UnexpectedSmartServerResponse(response)
1563
        return response[1]
3221.11.2 by Robert Collins
Create basic stackable branch facility.
1564
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1565
    def lock_read(self):
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
1566
        self.repository.lock_read()
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1567
        if not self._lock_mode:
1568
            self._lock_mode = 'r'
1569
            self._lock_count = 1
1570
            if self._real_branch is not None:
1571
                self._real_branch.lock_read()
1572
        else:
1573
            self._lock_count += 1
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1574
2018.5.142 by Andrew Bennetts
Change Branch.lock_token to only accept and receive the branch lock token (rather than the branch and repo lock tokens).
1575
    def _remote_lock_write(self, token):
1576
        if token is None:
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1577
            branch_token = repo_token = ''
1578
        else:
2018.5.142 by Andrew Bennetts
Change Branch.lock_token to only accept and receive the branch lock token (rather than the branch and repo lock tokens).
1579
            branch_token = token
1580
            repo_token = self.repository.lock_write()
1581
            self.repository.unlock()
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1582
        err_context = {'token': token}
1583
        response = self._call(
1584
            'Branch.lock_write', self._remote_path(), branch_token,
1585
            repo_token or '', **err_context)
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
1586
        if response[0] != 'ok':
2555.1.1 by Martin Pool
Remove use of 'assert False' to raise an exception unconditionally
1587
            raise errors.UnexpectedSmartServerResponse(response)
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
1588
        ok, branch_token, repo_token = response
1589
        return branch_token, repo_token
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1590
            
2018.5.142 by Andrew Bennetts
Change Branch.lock_token to only accept and receive the branch lock token (rather than the branch and repo lock tokens).
1591
    def lock_write(self, token=None):
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1592
        if not self._lock_mode:
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
1593
            # Lock the branch and repo in one remote call.
2018.5.142 by Andrew Bennetts
Change Branch.lock_token to only accept and receive the branch lock token (rather than the branch and repo lock tokens).
1594
            remote_tokens = self._remote_lock_write(token)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1595
            self._lock_token, self._repo_lock_token = remote_tokens
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
1596
            if not self._lock_token:
1597
                raise SmartProtocolError('Remote server did not return a token!')
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
1598
            # Tell the self.repository object that it is locked.
3692.1.2 by Andrew Bennetts
Fix regression introduced by fix, and add a test for that regression.
1599
            self.repository.lock_write(
1600
                self._repo_lock_token, _skip_rpc=True)
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
1601
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1602
            if self._real_branch is not None:
3692.1.5 by Andrew Bennetts
Fix bug revealed by removing _ensure_real call from RemoteBranch.lock_write.
1603
                self._real_branch.lock_write(token=self._lock_token)
2018.5.142 by Andrew Bennetts
Change Branch.lock_token to only accept and receive the branch lock token (rather than the branch and repo lock tokens).
1604
            if token is not None:
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1605
                self._leave_lock = True
1606
            else:
1607
                self._leave_lock = False
1608
            self._lock_mode = 'w'
1609
            self._lock_count = 1
1610
        elif self._lock_mode == 'r':
1611
            raise errors.ReadOnlyTransaction
1612
        else:
2018.5.142 by Andrew Bennetts
Change Branch.lock_token to only accept and receive the branch lock token (rather than the branch and repo lock tokens).
1613
            if token is not None:
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
1614
                # A token was given to lock_write, and we're relocking, so
1615
                # check that the given token actually matches the one we
1616
                # already have.
2018.5.142 by Andrew Bennetts
Change Branch.lock_token to only accept and receive the branch lock token (rather than the branch and repo lock tokens).
1617
                if token != self._lock_token:
1618
                    raise errors.TokenMismatch(token, self._lock_token)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1619
            self._lock_count += 1
3692.1.3 by Andrew Bennetts
Delete some cruft (like the _ensure_real call in RemoteBranch.lock_write), improve some comments, and wrap some long lines.
1620
            # Re-lock the repository too.
3692.1.2 by Andrew Bennetts
Fix regression introduced by fix, and add a test for that regression.
1621
            self.repository.lock_write(self._repo_lock_token)
3015.2.9 by Robert Collins
Handle repositories that do not allow remote locking, like pack repositories, in the client side remote server proxy objects.
1622
        return self._lock_token or None
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1623
1624
    def _unlock(self, branch_token, repo_token):
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1625
        err_context = {'token': str((branch_token, repo_token))}
1626
        response = self._call(
1627
            'Branch.unlock', self._remote_path(), branch_token,
1628
            repo_token or '', **err_context)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1629
        if response == ('ok',):
1630
            return
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
1631
        raise errors.UnexpectedSmartServerResponse(response)
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1632
1633
    def unlock(self):
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
1634
        try:
1635
            self._lock_count -= 1
1636
            if not self._lock_count:
1637
                self._clear_cached_state()
1638
                mode = self._lock_mode
1639
                self._lock_mode = None
1640
                if self._real_branch is not None:
1641
                    if (not self._leave_lock and mode == 'w' and
1642
                        self._repo_lock_token):
1643
                        # If this RemoteBranch will remove the physical lock
1644
                        # for the repository, make sure the _real_branch
1645
                        # doesn't do it first.  (Because the _real_branch's
1646
                        # repository is set to be the RemoteRepository.)
1647
                        self._real_branch.repository.leave_lock_in_place()
1648
                    self._real_branch.unlock()
1649
                if mode != 'w':
1650
                    # Only write-locked branched need to make a remote method
1651
                    # call to perfom the unlock.
1652
                    return
1653
                if not self._lock_token:
1654
                    raise AssertionError('Locked, but no token!')
1655
                branch_token = self._lock_token
1656
                repo_token = self._repo_lock_token
1657
                self._lock_token = None
1658
                self._repo_lock_token = None
1659
                if not self._leave_lock:
1660
                    self._unlock(branch_token, repo_token)
1661
        finally:
1662
            self.repository.unlock()
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1663
1664
    def break_lock(self):
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1665
        self._ensure_real()
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1666
        return self._real_branch.break_lock()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1667
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1668
    def leave_lock_in_place(self):
3015.2.9 by Robert Collins
Handle repositories that do not allow remote locking, like pack repositories, in the client side remote server proxy objects.
1669
        if not self._lock_token:
1670
            raise NotImplementedError(self.leave_lock_in_place)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1671
        self._leave_lock = True
1672
1673
    def dont_leave_lock_in_place(self):
3015.2.9 by Robert Collins
Handle repositories that do not allow remote locking, like pack repositories, in the client side remote server proxy objects.
1674
        if not self._lock_token:
3015.2.15 by Robert Collins
Review feedback.
1675
            raise NotImplementedError(self.dont_leave_lock_in_place)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1676
        self._leave_lock = False
1677
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1678
    def _last_revision_info(self):
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1679
        response = self._call('Branch.last_revision_info', self._remote_path())
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
1680
        if response[0] != 'ok':
1681
            raise SmartProtocolError('unexpected response code %s' % (response,))
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
1682
        revno = int(response[1])
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
1683
        last_revision = response[2]
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
1684
        return (revno, last_revision)
1685
2018.5.105 by Andrew Bennetts
Implement revision_history caching for RemoteBranch.
1686
    def _gen_revision_history(self):
1687
        """See Branch._gen_revision_history()."""
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1688
        response_tuple, response_handler = self._call_expecting_body(
3691.2.3 by Martin Pool
Factor out RemoteBranch._remote_path() and disable RemoteBranch stacking
1689
            'Branch.revision_history', self._remote_path())
3245.4.58 by Andrew Bennetts
Unpack call_expecting_body's return value into variables, to avoid lots of ugly subscripting.
1690
        if response_tuple[0] != 'ok':
3452.2.2 by Andrew Bennetts
Experimental PackRepository.{check_references,autopack} RPCs.
1691
            raise errors.UnexpectedSmartServerResponse(response_tuple)
3245.4.58 by Andrew Bennetts
Unpack call_expecting_body's return value into variables, to avoid lots of ugly subscripting.
1692
        result = response_handler.read_body_bytes().split('\x00')
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
1693
        if result == ['']:
1694
            return []
1695
        return result
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
1696
3691.2.3 by Martin Pool
Factor out RemoteBranch._remote_path() and disable RemoteBranch stacking
1697
    def _remote_path(self):
1698
        return self.bzrdir._path_for_remote_call(self._client)
1699
3441.5.18 by Andrew Bennetts
Fix some test failures.
1700
    def _set_last_revision_descendant(self, revision_id, other_branch,
3441.5.28 by Andrew Bennetts
Another review tweak: rename do_not_overwrite_descendant to allow_overwrite_descendant.
1701
            allow_diverged=False, allow_overwrite_descendant=False):
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1702
        # This performs additional work to meet the hook contract; while its
1703
        # undesirable, we have to synthesise the revno to call the hook, and
1704
        # not calling the hook is worse as it means changes can't be prevented.
1705
        # Having calculated this though, we can't just call into
1706
        # set_last_revision_info as a simple call, because there is a set_rh
1707
        # hook that some folk may still be using.
1708
        old_revno, old_revid = self.last_revision_info()
1709
        history = self._lefthand_history(revision_id)
1710
        self._run_pre_change_branch_tip_hooks(len(history), revision_id)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1711
        err_context = {'other_branch': other_branch}
1712
        response = self._call('Branch.set_last_revision_ex',
1713
            self._remote_path(), self._lock_token, self._repo_lock_token,
1714
            revision_id, int(allow_diverged), int(allow_overwrite_descendant),
1715
            **err_context)
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1716
        self._clear_cached_state()
3441.5.18 by Andrew Bennetts
Fix some test failures.
1717
        if len(response) != 3 and response[0] != 'ok':
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1718
            raise errors.UnexpectedSmartServerResponse(response)
3441.5.18 by Andrew Bennetts
Fix some test failures.
1719
        new_revno, new_revision_id = response[1:]
1720
        self._last_revision_info_cache = new_revno, new_revision_id
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1721
        self._run_post_change_branch_tip_hooks(old_revno, old_revid)
3692.1.5 by Andrew Bennetts
Fix bug revealed by removing _ensure_real call from RemoteBranch.lock_write.
1722
        if self._real_branch is not None:
1723
            cache = new_revno, new_revision_id
1724
            self._real_branch._last_revision_info_cache = cache
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1725
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1726
    def _set_last_revision(self, revision_id):
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1727
        old_revno, old_revid = self.last_revision_info()
1728
        # This performs additional work to meet the hook contract; while its
1729
        # undesirable, we have to synthesise the revno to call the hook, and
1730
        # not calling the hook is worse as it means changes can't be prevented.
1731
        # Having calculated this though, we can't just call into
1732
        # set_last_revision_info as a simple call, because there is a set_rh
1733
        # hook that some folk may still be using.
1734
        history = self._lefthand_history(revision_id)
1735
        self._run_pre_change_branch_tip_hooks(len(history), revision_id)
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1736
        self._clear_cached_state()
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1737
        response = self._call('Branch.set_last_revision',
1738
            self._remote_path(), self._lock_token, self._repo_lock_token,
1739
            revision_id)
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1740
        if response != ('ok',):
1741
            raise errors.UnexpectedSmartServerResponse(response)
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1742
        self._run_post_change_branch_tip_hooks(old_revno, old_revid)
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1743
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1744
    @needs_write_lock
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1745
    def set_revision_history(self, rev_history):
2018.12.3 by Andrew Bennetts
Add a Branch.set_last_revision smart method, and make RemoteBranch.set_revision_history use it.
1746
        # Send just the tip revision of the history; the server will generate
1747
        # the full history from that.  If the revision doesn't exist in this
1748
        # branch, NoSuchRevision will be raised.
1749
        if rev_history == []:
2018.5.170 by Andrew Bennetts
Use 'null:' instead of '' to mean NULL_REVISION on the wire.
1750
            rev_id = 'null:'
2018.12.3 by Andrew Bennetts
Add a Branch.set_last_revision smart method, and make RemoteBranch.set_revision_history use it.
1751
        else:
1752
            rev_id = rev_history[-1]
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1753
        self._set_last_revision(rev_id)
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1754
        for hook in branch.Branch.hooks['set_rh']:
1755
            hook(self, rev_history)
2018.5.105 by Andrew Bennetts
Implement revision_history caching for RemoteBranch.
1756
        self._cache_revision_history(rev_history)
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1757
1758
    def get_parent(self):
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1759
        self._ensure_real()
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1760
        return self._real_branch.get_parent()
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1761
1762
    def _get_parent_location(self):
1763
        # Used by tests, when checking normalisation of given vs stored paths.
1764
        self._ensure_real()
1765
        return self._real_branch._get_parent_location()
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1766
        
1752.2.63 by Andrew Bennetts
Delegate set_parent.
1767
    def set_parent(self, url):
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1768
        self._ensure_real()
1752.2.63 by Andrew Bennetts
Delegate set_parent.
1769
        return self._real_branch.set_parent(url)
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1770
1771
    def _set_parent_location(self, url):
1772
        # Used by tests, to poke bad urls into branch configurations
1773
        if url is None:
1774
            self.set_parent(url)
1775
        else:
1776
            self._ensure_real()
1777
            return self._real_branch._set_parent_location(url)
1752.2.63 by Andrew Bennetts
Delegate set_parent.
1778
        
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
1779
    def set_stacked_on_url(self, stacked_location):
3221.18.1 by Ian Clatworthy
tweaks by ianc during review
1780
        """Set the URL this branch is stacked against.
3221.11.2 by Robert Collins
Create basic stackable branch facility.
1781
1782
        :raises UnstackableBranchFormat: If the branch does not support
1783
            stacking.
1784
        :raises UnstackableRepositoryFormat: If the repository does not support
1785
            stacking.
1786
        """
1787
        self._ensure_real()
3537.3.3 by Martin Pool
Rename Branch.set_stacked_on to set_stacked_on_url
1788
        return self._real_branch.set_stacked_on_url(stacked_location)
3221.11.2 by Robert Collins
Create basic stackable branch facility.
1789
2018.5.94 by Andrew Bennetts
Various small changes in aid of making tests pass (including deleting one invalid test).
1790
    def sprout(self, to_bzrdir, revision_id=None):
3793.1.1 by Andrew Bennetts
Make RemoteBranch.sprout use Branch.sprout when possible.
1791
        branch_format = to_bzrdir._format._branch_format
1792
        if (branch_format is None or
1793
            isinstance(branch_format, RemoteBranchFormat)):
1794
            # The to_bzrdir specifies RemoteBranchFormat (or no format, which
1795
            # implies the same thing), but RemoteBranches can't be created at
1796
            # arbitrary URLs.  So create a branch in the same format as
1797
            # _real_branch instead.
1798
            # XXX: if to_bzrdir is a RemoteBzrDir, this should perhaps do
1799
            # to_bzrdir.create_branch to create a RemoteBranch after all...
1800
            self._ensure_real()
1801
            result = self._real_branch._format.initialize(to_bzrdir)
1802
            self.copy_content_into(result, revision_id=revision_id)
1803
            result.set_parent(self.bzrdir.root_transport.base)
1804
        else:
1805
            result = branch.Branch.sprout(
1806
                self, to_bzrdir, revision_id=revision_id)
2018.5.94 by Andrew Bennetts
Various small changes in aid of making tests pass (including deleting one invalid test).
1807
        return result
1808
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1809
    @needs_write_lock
2477.1.2 by Martin Pool
Rename push/pull back to 'run_hooks' (jameinel)
1810
    def pull(self, source, overwrite=False, stop_revision=None,
2477.1.9 by Martin Pool
Review cleanups from John, mostly docs
1811
             **kwargs):
3441.5.29 by Andrew Bennetts
More review tweaks: whitespace nits in test_smart, add (and use) ._clear_cached_state_of_remote_branch_only method in bzrlib/remote.py.
1812
        self._clear_cached_state_of_remote_branch_only()
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1813
        self._ensure_real()
3482.1.1 by John Arbash Meinel
Fix bug #238149, RemoteBranch.pull needs to return the _real_branch's pull result.
1814
        return self._real_branch.pull(
2477.1.2 by Martin Pool
Rename push/pull back to 'run_hooks' (jameinel)
1815
            source, overwrite=overwrite, stop_revision=stop_revision,
3489.2.4 by Andrew Bennetts
Fix all tests broken by fixing make_branch_and_tree.
1816
            _override_hook_target=self, **kwargs)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1817
2018.14.3 by Andrew Bennetts
Make a couple more branch_implementations tests pass.
1818
    @needs_read_lock
1819
    def push(self, target, overwrite=False, stop_revision=None):
1820
        self._ensure_real()
2018.5.97 by Andrew Bennetts
Fix more tests.
1821
        return self._real_branch.push(
2477.1.5 by Martin Pool
More cleanups of Branch.push to get the right behaviour with RemoteBranches
1822
            target, overwrite=overwrite, stop_revision=stop_revision,
1823
            _override_hook_source_branch=self)
2018.14.3 by Andrew Bennetts
Make a couple more branch_implementations tests pass.
1824
1825
    def is_locked(self):
1826
        return self._lock_count >= 1
1827
3634.2.1 by John Arbash Meinel
Thunk over to the real branch's revision_id_to_revno.
1828
    @needs_read_lock
1829
    def revision_id_to_revno(self, revision_id):
1830
        self._ensure_real()
1831
        return self._real_branch.revision_id_to_revno(revision_id)
1832
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
1833
    @needs_write_lock
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
1834
    def set_last_revision_info(self, revno, revision_id):
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1835
        # XXX: These should be returned by the set_last_revision_info verb
1836
        old_revno, old_revid = self.last_revision_info()
1837
        self._run_pre_change_branch_tip_hooks(revno, revision_id)
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
1838
        revision_id = ensure_null(revision_id)
3297.4.2 by Andrew Bennetts
Add backwards compatibility for servers older than 1.4.
1839
        try:
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1840
            response = self._call('Branch.set_last_revision_info',
1841
                self._remote_path(), self._lock_token, self._repo_lock_token,
1842
                str(revno), revision_id)
3297.4.2 by Andrew Bennetts
Add backwards compatibility for servers older than 1.4.
1843
        except errors.UnknownSmartMethod:
1844
            self._ensure_real()
3441.5.29 by Andrew Bennetts
More review tweaks: whitespace nits in test_smart, add (and use) ._clear_cached_state_of_remote_branch_only method in bzrlib/remote.py.
1845
            self._clear_cached_state_of_remote_branch_only()
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1846
            self._real_branch.set_last_revision_info(revno, revision_id)
1847
            self._last_revision_info_cache = revno, revision_id
1848
            return
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
1849
        if response == ('ok',):
1850
            self._clear_cached_state()
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1851
            self._last_revision_info_cache = revno, revision_id
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1852
            self._run_post_change_branch_tip_hooks(old_revno, old_revid)
3441.5.29 by Andrew Bennetts
More review tweaks: whitespace nits in test_smart, add (and use) ._clear_cached_state_of_remote_branch_only method in bzrlib/remote.py.
1853
            # Update the _real_branch's cache too.
1854
            if self._real_branch is not None:
1855
                cache = self._last_revision_info_cache
1856
                self._real_branch._last_revision_info_cache = cache
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
1857
        else:
1858
            raise errors.UnexpectedSmartServerResponse(response)
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
1859
3441.5.27 by Andrew Bennetts
Tweaks suggested by John's review: rename _check_if_descendant_or_diverged, move caching last_revision_info into base Branch, better use of lock decorators.
1860
    @needs_write_lock
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
1861
    def generate_revision_history(self, revision_id, last_rev=None,
1862
                                  other_branch=None):
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1863
        medium = self._client._medium
3441.5.23 by Andrew Bennetts
Fix test failures.
1864
        if not medium._is_remote_before((1, 6)):
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1865
            # Use a smart method for 1.6 and above servers
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1866
            try:
3441.5.18 by Andrew Bennetts
Fix some test failures.
1867
                self._set_last_revision_descendant(revision_id, other_branch,
3441.5.28 by Andrew Bennetts
Another review tweak: rename do_not_overwrite_descendant to allow_overwrite_descendant.
1868
                    allow_diverged=True, allow_overwrite_descendant=True)
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1869
                return
3441.5.18 by Andrew Bennetts
Fix some test failures.
1870
            except errors.UnknownSmartMethod:
3441.5.23 by Andrew Bennetts
Fix test failures.
1871
                medium._remember_remote_is_before((1, 6))
3441.5.29 by Andrew Bennetts
More review tweaks: whitespace nits in test_smart, add (and use) ._clear_cached_state_of_remote_branch_only method in bzrlib/remote.py.
1872
        self._clear_cached_state_of_remote_branch_only()
4005.2.1 by Robert Collins
Fix RemoteBranch to be used correctly in tests using bzr+ssh, to fire off Branch hooks correctly, and improve the branch_implementations tests to check that making a branch gets the right format under test.
1873
        self.set_revision_history(self._lefthand_history(revision_id,
1874
            last_rev=last_rev,other_branch=other_branch))
2018.5.95 by Andrew Bennetts
Add a Transport.is_readonly remote call, let {Branch,Repository}.lock_write remote call return UnlockableTransport, and miscellaneous test fixes.
1875
2018.5.96 by Andrew Bennetts
Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's
1876
    @property
1877
    def tags(self):
1878
        self._ensure_real()
1879
        return self._real_branch.tags
1880
2018.5.97 by Andrew Bennetts
Fix more tests.
1881
    def set_push_location(self, location):
1882
        self._ensure_real()
1883
        return self._real_branch.set_push_location(location)
1884
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1885
    @needs_write_lock
3445.1.8 by John Arbash Meinel
Clarity tweaks recommended by Ian
1886
    def update_revisions(self, other, stop_revision=None, overwrite=False,
1887
                         graph=None):
3441.5.18 by Andrew Bennetts
Fix some test failures.
1888
        """See Branch.update_revisions."""
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1889
        other.lock_read()
1890
        try:
1891
            if stop_revision is None:
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1892
                stop_revision = other.last_revision()
3441.5.5 by Andrew Bennetts
Some small tweaks and comments.
1893
                if revision.is_null(stop_revision):
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1894
                    # if there are no commits, we're done.
1895
                    return
1896
            self.fetch(other, stop_revision)
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1897
1898
            if overwrite:
3441.5.18 by Andrew Bennetts
Fix some test failures.
1899
                # Just unconditionally set the new revision.  We don't care if
1900
                # the branches have diverged.
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1901
                self._set_last_revision(stop_revision)
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1902
            else:
1903
                medium = self._client._medium
3441.5.23 by Andrew Bennetts
Fix test failures.
1904
                if not medium._is_remote_before((1, 6)):
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1905
                    try:
1906
                        self._set_last_revision_descendant(stop_revision, other)
1907
                        return
3441.5.7 by Andrew Bennetts
Fix unbound global.
1908
                    except errors.UnknownSmartMethod:
3441.5.23 by Andrew Bennetts
Fix test failures.
1909
                        medium._remember_remote_is_before((1, 6))
3441.5.18 by Andrew Bennetts
Fix some test failures.
1910
                # Fallback for pre-1.6 servers: check for divergence
1911
                # client-side, then do _set_last_revision.
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
1912
                last_rev = revision.ensure_null(self.last_revision())
3441.5.18 by Andrew Bennetts
Fix some test failures.
1913
                if graph is None:
1914
                    graph = self.repository.get_graph()
3441.5.27 by Andrew Bennetts
Tweaks suggested by John's review: rename _check_if_descendant_or_diverged, move caching last_revision_info into base Branch, better use of lock decorators.
1915
                if self._check_if_descendant_or_diverged(
3441.5.18 by Andrew Bennetts
Fix some test failures.
1916
                        stop_revision, last_rev, graph, other):
1917
                    # stop_revision is a descendant of last_rev, but we aren't
1918
                    # overwriting, so we're done.
1919
                    return
1920
                self._set_last_revision(stop_revision)
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
1921
        finally:
1922
            other.unlock()
2018.5.97 by Andrew Bennetts
Fix more tests.
1923
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1924
1925
def _extract_tar(tar, to_dir):
1926
    """Extract all the contents of a tarfile object.
1927
1928
    A replacement for extractall, which is not present in python2.4
1929
    """
1930
    for tarinfo in tar:
1931
        tar.extract(tarinfo, to_dir)
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
1932
1933
1934
def _translate_error(err, **context):
1935
    """Translate an ErrorFromSmartServer into a more useful error.
1936
1937
    Possible context keys:
1938
      - branch
1939
      - repository
1940
      - bzrdir
1941
      - token
1942
      - other_branch
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
1943
      - path
3690.1.1 by Andrew Bennetts
Unexpected error responses from a smart server no longer cause the client to traceback.
1944
1945
    If the error from the server doesn't match a known pattern, then
3690.1.2 by Andrew Bennetts
Rename UntranslateableErrorFromSmartServer -> UnknownErrorFromSmartServer.
1946
    UnknownErrorFromSmartServer is raised.
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
1947
    """
1948
    def find(name):
3533.3.4 by Andrew Bennetts
Add tests for _translate_error's robustness.
1949
        try:
1950
            return context[name]
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
1951
        except KeyError, key_err:
1952
            mutter('Missing key %r in context %r', key_err.args[0], context)
3533.3.4 by Andrew Bennetts
Add tests for _translate_error's robustness.
1953
            raise err
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
1954
    def get_path():
3779.3.3 by Andrew Bennetts
Add a docstring.
1955
        """Get the path from the context if present, otherwise use first error
1956
        arg.
1957
        """
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
1958
        try:
1959
            return context['path']
1960
        except KeyError, key_err:
1961
            try:
1962
                return err.error_args[0]
1963
            except IndexError, idx_err:
1964
                mutter(
1965
                    'Missing key %r in context %r', key_err.args[0], context)
1966
                raise err
1967
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
1968
    if err.error_verb == 'NoSuchRevision':
1969
        raise NoSuchRevision(find('branch'), err.error_args[0])
1970
    elif err.error_verb == 'nosuchrevision':
1971
        raise NoSuchRevision(find('repository'), err.error_args[0])
1972
    elif err.error_tuple == ('nobranch',):
3533.3.4 by Andrew Bennetts
Add tests for _translate_error's robustness.
1973
        raise errors.NotBranchError(path=find('bzrdir').root_transport.base)
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
1974
    elif err.error_verb == 'norepository':
1975
        raise errors.NoRepositoryPresent(find('bzrdir'))
1976
    elif err.error_verb == 'LockContention':
1977
        raise errors.LockContention('(remote lock)')
1978
    elif err.error_verb == 'UnlockableTransport':
3533.3.4 by Andrew Bennetts
Add tests for _translate_error's robustness.
1979
        raise errors.UnlockableTransport(find('bzrdir').root_transport)
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
1980
    elif err.error_verb == 'LockFailed':
1981
        raise errors.LockFailed(err.error_args[0], err.error_args[1])
1982
    elif err.error_verb == 'TokenMismatch':
1983
        raise errors.TokenMismatch(find('token'), '(remote token)')
1984
    elif err.error_verb == 'Diverged':
1985
        raise errors.DivergedBranches(find('branch'), find('other_branch'))
3577.1.1 by Andrew Bennetts
Cherry-pick TipChangeRejected changes from pre-branch-tip-changed-hook loom.
1986
    elif err.error_verb == 'TipChangeRejected':
1987
        raise errors.TipChangeRejected(err.error_args[0].decode('utf8'))
3691.2.6 by Martin Pool
Disable RemoteBranch stacking, but get get_stacked_on_url working, and passing back exceptions
1988
    elif err.error_verb == 'UnstackableBranchFormat':
1989
        raise errors.UnstackableBranchFormat(*err.error_args)
1990
    elif err.error_verb == 'UnstackableRepositoryFormat':
1991
        raise errors.UnstackableRepositoryFormat(*err.error_args)
1992
    elif err.error_verb == 'NotStacked':
1993
        raise errors.NotStacked(branch=find('branch'))
3779.3.1 by Andrew Bennetts
Move encoding/decoding logic of PermissionDenied and ReadError so that it happens for all RPCs.
1994
    elif err.error_verb == 'PermissionDenied':
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
1995
        path = get_path()
3779.3.1 by Andrew Bennetts
Move encoding/decoding logic of PermissionDenied and ReadError so that it happens for all RPCs.
1996
        if len(err.error_args) >= 2:
1997
            extra = err.error_args[1]
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
1998
        else:
1999
            extra = None
3779.3.1 by Andrew Bennetts
Move encoding/decoding logic of PermissionDenied and ReadError so that it happens for all RPCs.
2000
        raise errors.PermissionDenied(path, extra=extra)
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2001
    elif err.error_verb == 'ReadError':
2002
        path = get_path()
2003
        raise errors.ReadError(path)
2004
    elif err.error_verb == 'NoSuchFile':
2005
        path = get_path()
2006
        raise errors.NoSuchFile(path)
2007
    elif err.error_verb == 'FileExists':
2008
        raise errors.FileExists(err.error_args[0])
2009
    elif err.error_verb == 'DirectoryNotEmpty':
2010
        raise errors.DirectoryNotEmpty(err.error_args[0])
2011
    elif err.error_verb == 'ShortReadvError':
2012
        args = err.error_args
2013
        raise errors.ShortReadvError(
2014
            args[0], int(args[1]), int(args[2]), int(args[3]))
2015
    elif err.error_verb in ('UnicodeEncodeError', 'UnicodeDecodeError'):
2016
        encoding = str(err.error_args[0]) # encoding must always be a string
2017
        val = err.error_args[1]
2018
        start = int(err.error_args[2])
2019
        end = int(err.error_args[3])
2020
        reason = str(err.error_args[4]) # reason must always be a string
2021
        if val.startswith('u:'):
2022
            val = val[2:].decode('utf-8')
2023
        elif val.startswith('s:'):
2024
            val = val[2:].decode('base64')
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2025
        if err.error_verb == 'UnicodeDecodeError':
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2026
            raise UnicodeDecodeError(encoding, val, start, end, reason)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2027
        elif err.error_verb == 'UnicodeEncodeError':
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2028
            raise UnicodeEncodeError(encoding, val, start, end, reason)
2029
    elif err.error_verb == 'ReadOnlyError':
2030
        raise errors.TransportNotPossible('readonly transport')
3690.1.2 by Andrew Bennetts
Rename UntranslateableErrorFromSmartServer -> UnknownErrorFromSmartServer.
2031
    raise errors.UnknownErrorFromSmartServer(err)