/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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
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 (
2694.5.4 by Jelmer Vernooij
Move bzrlib.util.bencode to bzrlib._bencode_py.
23
    bencode,
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
24
    branch,
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
25
    bzrdir,
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
26
    config,
3192.1.1 by Andrew Bennetts
Add some -Dhpss debugging to get_parent_map.
27
    debug,
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
28
    errors,
3172.5.1 by Robert Collins
Create a RemoteRepository get_graph implementation and delegate get_parents_map to the real repository.
29
    graph,
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
30
    lockdir,
31
    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.
32
    revision,
4307.2.3 by Robert Collins
Change RemoteRepository.has_revision to use get_parent_map to leverage the caching.
33
    revision as _mod_revision,
3228.4.11 by John Arbash Meinel
Deprecations abound.
34
    symbol_versioning,
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
35
)
2535.4.27 by Andrew Bennetts
Remove some unused imports.
36
from bzrlib.branch import BranchReferenceFormat
2018.5.174 by Andrew Bennetts
Various nits discovered by pyflakes.
37
from bzrlib.bzrdir import BzrDir, RemoteBzrDirFormat
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
38
from bzrlib.decorators import needs_read_lock, needs_write_lock
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
39
from bzrlib.errors import (
40
    NoSuchRevision,
41
    SmartProtocolError,
42
    )
2018.5.127 by Andrew Bennetts
Fix most of the lockable_files tests for RemoteBranchLockableFiles.
43
from bzrlib.lockable_files import LockableFiles
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
44
from bzrlib.smart import client, vfs, repository as smart_repo
3297.4.1 by Andrew Bennetts
Merge 'Add Branch.set_last_revision_info smart method'.
45
from bzrlib.revision import ensure_null, NULL_REVISION
3441.5.5 by Andrew Bennetts
Some small tweaks and comments.
46
from bzrlib.trace import mutter, note, warning
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
47
3445.1.5 by John Arbash Meinel
allow passing a 'graph' object into Branch.update_revisions.
48
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
49
class _RpcHelper(object):
50
    """Mixin class that helps with issuing RPCs."""
51
52
    def _call(self, method, *args, **err_context):
53
        try:
54
            return self._client.call(method, *args)
55
        except errors.ErrorFromSmartServer, err:
56
            self._translate_error(err, **err_context)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
57
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
58
    def _call_expecting_body(self, method, *args, **err_context):
59
        try:
60
            return self._client.call_expecting_body(method, *args)
61
        except errors.ErrorFromSmartServer, err:
62
            self._translate_error(err, **err_context)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
63
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
64
    def _call_with_body_bytes_expecting_body(self, method, args, body_bytes,
65
                                             **err_context):
66
        try:
67
            return self._client.call_with_body_bytes_expecting_body(
68
                method, args, body_bytes)
69
        except errors.ErrorFromSmartServer, err:
70
            self._translate_error(err, **err_context)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
71
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
72
73
def response_tuple_to_repo_format(response):
74
    """Convert a response tuple describing a repository format to a format."""
75
    format = RemoteRepositoryFormat()
4118.1.1 by Andrew Bennetts
Fix performance regression (many small round-trips) when pushing to a remote pack, and tidy the tests.
76
    format._rich_root_data = (response[0] == 'yes')
77
    format._supports_tree_reference = (response[1] == 'yes')
78
    format._supports_external_lookups = (response[2] == 'yes')
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
79
    format._network_name = response[3]
80
    return format
81
82
2018.5.25 by Andrew Bennetts
Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).
83
# Note: RemoteBzrDirFormat is in bzrdir.py
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
84
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
85
class RemoteBzrDir(BzrDir, _RpcHelper):
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
86
    """Control directory on a remote server, accessed via bzr:// or similar."""
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
87
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.
88
    def __init__(self, transport, format, _client=None):
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
89
        """Construct a RemoteBzrDir.
90
91
        :param _client: Private parameter for testing. Disables probing and the
92
            use of a real bzrdir.
93
        """
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.
94
        BzrDir.__init__(self, transport, format)
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
95
        # this object holds a delegated bzrdir that uses file-level operations
96
        # to talk to the other side
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
97
        self._real_bzrdir = None
4044.1.3 by Robert Collins
Create a one-shot cache of the result of RemoteBzrDir.create_branch, eliminating 3 round trips for nonstacked branches and 5 for stacked.
98
        # 1-shot cache for the call pattern 'create_branch; open_branch' - see
99
        # create_branch for details.
100
        self._next_open_branch_result = None
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
101
102
        if _client is None:
3313.2.3 by Andrew Bennetts
Deprecate Transport.get_shared_medium.
103
            medium = transport.get_smart_medium()
3431.3.2 by Andrew Bennetts
Remove 'base' from _SmartClient entirely, now that the medium has it.
104
            self._client = client._SmartClient(medium)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
105
        else:
106
            self._client = _client
107
            return
108
109
        path = self._path_for_remote_call(self._client)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
110
        response = self._call('BzrDir.open', path)
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
111
        if response not in [('yes',), ('no',)]:
112
            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.
113
        if response == ('no',):
114
            raise errors.NotBranchError(path=transport.base)
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
115
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
116
    def _ensure_real(self):
117
        """Ensure that there is a _real_bzrdir set.
118
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
119
        Used before calls to self._real_bzrdir.
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
120
        """
121
        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.
122
            self._real_bzrdir = BzrDir.open_from_transport(
123
                self.root_transport, _server_formats=False)
4070.2.1 by Robert Collins
Add a BzrDirFormat.network_name.
124
            self._format._network_name = \
125
                self._real_bzrdir._format.network_name()
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
126
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
127
    def _translate_error(self, err, **context):
128
        _translate_error(err, bzrdir=self, **context)
129
4044.1.3 by Robert Collins
Create a one-shot cache of the result of RemoteBzrDir.create_branch, eliminating 3 round trips for nonstacked branches and 5 for stacked.
130
    def break_lock(self):
131
        # Prevent aliasing problems in the next_open_branch_result cache.
132
        # See create_branch for rationale.
133
        self._next_open_branch_result = None
134
        return BzrDir.break_lock(self)
135
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
136
    def _vfs_cloning_metadir(self, require_stacking=False):
3242.3.28 by Aaron Bentley
Use repository acquisition policy for sprouting
137
        self._ensure_real()
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
138
        return self._real_bzrdir.cloning_metadir(
139
            require_stacking=require_stacking)
140
141
    def cloning_metadir(self, require_stacking=False):
142
        medium = self._client._medium
143
        if medium._is_remote_before((1, 13)):
144
            return self._vfs_cloning_metadir(require_stacking=require_stacking)
145
        verb = 'BzrDir.cloning_metadir'
146
        if require_stacking:
147
            stacking = 'True'
148
        else:
149
            stacking = 'False'
150
        path = self._path_for_remote_call(self._client)
151
        try:
152
            response = self._call(verb, path, stacking)
153
        except errors.UnknownSmartMethod:
4094.1.1 by Andrew Bennetts
Add some medium._remember_is_before((1, 13)) calls.
154
            medium._remember_remote_is_before((1, 13))
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
155
            return self._vfs_cloning_metadir(require_stacking=require_stacking)
4160.2.9 by Andrew Bennetts
Fix BzrDir.cloning_metadir RPC to fail on branch references, and make
156
        except errors.UnknownErrorFromSmartServer, err:
157
            if err.error_tuple != ('BranchReference',):
158
                raise
159
            # We need to resolve the branch reference to determine the
160
            # cloning_metadir.  This causes unnecessary RPCs to open the
161
            # referenced branch (and bzrdir, etc) but only when the caller
162
            # didn't already resolve the branch reference.
163
            referenced_branch = self.open_branch()
164
            return referenced_branch.bzrdir.cloning_metadir()
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
165
        if len(response) != 3:
166
            raise errors.UnexpectedSmartServerResponse(response)
4070.7.4 by Andrew Bennetts
Deal with branch references better in BzrDir.cloning_metadir RPC (changes protocol).
167
        control_name, repo_name, branch_info = response
168
        if len(branch_info) != 2:
169
            raise errors.UnexpectedSmartServerResponse(response)
170
        branch_ref, branch_name = branch_info
4075.2.1 by Robert Collins
Audit and make sure we are registering network_name's as factories, not instances.
171
        format = bzrdir.network_format_registry.get(control_name)
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
172
        if repo_name:
173
            format.repository_format = repository.network_format_registry.get(
174
                repo_name)
4084.2.2 by Robert Collins
Review feedback.
175
        if branch_ref == 'ref':
4070.7.4 by Andrew Bennetts
Deal with branch references better in BzrDir.cloning_metadir RPC (changes protocol).
176
            # XXX: we need possible_transports here to avoid reopening the
4070.7.5 by Andrew Bennetts
Tweak comment.
177
            # connection to the referenced location
4070.7.4 by Andrew Bennetts
Deal with branch references better in BzrDir.cloning_metadir RPC (changes protocol).
178
            ref_bzrdir = BzrDir.open(branch_name)
179
            branch_format = ref_bzrdir.cloning_metadir().get_branch_format()
180
            format.set_branch_format(branch_format)
4084.2.2 by Robert Collins
Review feedback.
181
        elif branch_ref == 'branch':
4070.7.4 by Andrew Bennetts
Deal with branch references better in BzrDir.cloning_metadir RPC (changes protocol).
182
            if branch_name:
183
                format.set_branch_format(
184
                    branch.network_format_registry.get(branch_name))
185
        else:
186
            raise errors.UnexpectedSmartServerResponse(response)
4070.2.3 by Robert Collins
Get BzrDir.cloning_metadir working.
187
        return format
3242.3.28 by Aaron Bentley
Use repository acquisition policy for sprouting
188
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
189
    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.
190
        # as per meta1 formats - just delegate to the format object which may
191
        # be parameterised.
192
        result = self._format.repository_format.initialize(self, shared)
193
        if not isinstance(result, RemoteRepository):
194
            return self.open_repository()
195
        else:
196
            return result
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
197
2796.2.19 by Aaron Bentley
Support reconfigure --lightweight-checkout
198
    def destroy_repository(self):
199
        """See BzrDir.destroy_repository"""
200
        self._ensure_real()
201
        self._real_bzrdir.destroy_repository()
202
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
203
    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.
204
        # as per meta1 formats - just delegate to the format object which may
205
        # be parameterised.
206
        real_branch = self._format.get_branch_format().initialize(self)
207
        if not isinstance(real_branch, RemoteBranch):
4044.1.3 by Robert Collins
Create a one-shot cache of the result of RemoteBzrDir.create_branch, eliminating 3 round trips for nonstacked branches and 5 for stacked.
208
            result = RemoteBranch(self, self.find_repository(), real_branch)
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.
209
        else:
4044.1.3 by Robert Collins
Create a one-shot cache of the result of RemoteBzrDir.create_branch, eliminating 3 round trips for nonstacked branches and 5 for stacked.
210
            result = real_branch
211
        # BzrDir.clone_on_transport() uses the result of create_branch but does
212
        # not return it to its callers; we save approximately 8% of our round
213
        # trips by handing the branch we created back to the first caller to
214
        # open_branch rather than probing anew. Long term we need a API in
215
        # bzrdir that doesn't discard result objects (like result_branch).
216
        # RBC 20090225
217
        self._next_open_branch_result = result
218
        return result
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
219
2796.2.6 by Aaron Bentley
Implement destroy_branch
220
    def destroy_branch(self):
2796.2.16 by Aaron Bentley
Documentation updates from review
221
        """See BzrDir.destroy_branch"""
2796.2.6 by Aaron Bentley
Implement destroy_branch
222
        self._ensure_real()
223
        self._real_bzrdir.destroy_branch()
4044.1.3 by Robert Collins
Create a one-shot cache of the result of RemoteBzrDir.create_branch, eliminating 3 round trips for nonstacked branches and 5 for stacked.
224
        self._next_open_branch_result = None
2796.2.6 by Aaron Bentley
Implement destroy_branch
225
2955.5.3 by Vincent Ladeuil
Fix second unwanted connection by providing the right branch to create_checkout.
226
    def create_workingtree(self, revision_id=None, from_branch=None):
2018.5.174 by Andrew Bennetts
Various nits discovered by pyflakes.
227
        raise errors.NotLocalUrl(self.transport.base)
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
228
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.
229
    def find_branch_format(self):
230
        """Find the branch 'format' for this bzrdir.
231
232
        This might be a synthetic object for e.g. RemoteBranch and SVN.
233
        """
234
        b = self.open_branch()
235
        return b._format
236
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.
237
    def get_branch_reference(self):
238
        """See BzrDir.get_branch_reference()."""
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
239
        response = self._get_branch_reference()
240
        if response[0] == 'ref':
241
            return response[1]
242
        else:
243
            return None
244
245
    def _get_branch_reference(self):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
246
        path = self._path_for_remote_call(self._client)
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
247
        medium = self._client._medium
248
        if not medium._is_remote_before((1, 13)):
249
            try:
250
                response = self._call('BzrDir.open_branchV2', path)
251
                if response[0] not in ('ref', 'branch'):
252
                    raise errors.UnexpectedSmartServerResponse(response)
253
                return response
254
            except errors.UnknownSmartMethod:
4094.1.1 by Andrew Bennetts
Add some medium._remember_is_before((1, 13)) calls.
255
                medium._remember_remote_is_before((1, 13))
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
256
        response = self._call('BzrDir.open_branch', path)
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
257
        if response[0] != 'ok':
258
            raise errors.UnexpectedSmartServerResponse(response)
259
        if response[1] != '':
260
            return ('ref', response[1])
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
261
        else:
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
262
            return ('branch', '')
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.
263
3211.4.1 by Robert Collins
* ``RemoteBzrDir._get_tree_branch`` no longer triggers ``_ensure_real``,
264
    def _get_tree_branch(self):
265
        """See BzrDir._get_tree_branch()."""
266
        return None, self.open_branch()
267
4160.2.6 by Andrew Bennetts
Add ignore_fallbacks flag.
268
    def open_branch(self, _unsupported=False, ignore_fallbacks=False):
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
269
        if _unsupported:
270
            raise NotImplementedError('unsupported flag support not implemented yet.')
4044.1.3 by Robert Collins
Create a one-shot cache of the result of RemoteBzrDir.create_branch, eliminating 3 round trips for nonstacked branches and 5 for stacked.
271
        if self._next_open_branch_result is not None:
272
            # See create_branch for details.
273
            result = self._next_open_branch_result
274
            self._next_open_branch_result = None
275
            return result
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
276
        response = self._get_branch_reference()
277
        if response[0] == 'ref':
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.
278
            # a branch reference, use the existing BranchReference logic.
279
            format = BranchReferenceFormat()
4160.2.6 by Andrew Bennetts
Add ignore_fallbacks flag.
280
            return format.open(self, _found=True, location=response[1],
281
                ignore_fallbacks=ignore_fallbacks)
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
282
        branch_format_name = response[1]
283
        if not branch_format_name:
284
            branch_format_name = None
285
        format = RemoteBranchFormat(network_name=branch_format_name)
4160.2.6 by Andrew Bennetts
Add ignore_fallbacks flag.
286
        return RemoteBranch(self, self.find_repository(), format=format,
287
            setup_stacking=not ignore_fallbacks)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
288
4053.1.1 by Robert Collins
New version of the BzrDir.find_repository verb supporting _network_name to support removing more _ensure_real calls.
289
    def _open_repo_v1(self, path):
290
        verb = 'BzrDir.find_repository'
291
        response = self._call(verb, path)
292
        if response[0] != 'ok':
293
            raise errors.UnexpectedSmartServerResponse(response)
294
        # servers that only support the v1 method don't support external
295
        # references either.
296
        self._ensure_real()
297
        repo = self._real_bzrdir.open_repository()
298
        response = response + ('no', repo._format.network_name())
299
        return response, repo
300
301
    def _open_repo_v2(self, path):
302
        verb = 'BzrDir.find_repositoryV2'
303
        response = self._call(verb, path)
304
        if response[0] != 'ok':
305
            raise errors.UnexpectedSmartServerResponse(response)
306
        self._ensure_real()
307
        repo = self._real_bzrdir.open_repository()
308
        response = response + (repo._format.network_name(),)
309
        return response, repo
310
311
    def _open_repo_v3(self, path):
312
        verb = 'BzrDir.find_repositoryV3'
4053.1.2 by Robert Collins
Actually make this branch work.
313
        medium = self._client._medium
314
        if medium._is_remote_before((1, 13)):
315
            raise errors.UnknownSmartMethod(verb)
4094.1.1 by Andrew Bennetts
Add some medium._remember_is_before((1, 13)) calls.
316
        try:
317
            response = self._call(verb, path)
318
        except errors.UnknownSmartMethod:
319
            medium._remember_remote_is_before((1, 13))
320
            raise
4053.1.1 by Robert Collins
New version of the BzrDir.find_repository verb supporting _network_name to support removing more _ensure_real calls.
321
        if response[0] != 'ok':
322
            raise errors.UnexpectedSmartServerResponse(response)
323
        return response, None
324
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
325
    def open_repository(self):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
326
        path = self._path_for_remote_call(self._client)
4053.1.1 by Robert Collins
New version of the BzrDir.find_repository verb supporting _network_name to support removing more _ensure_real calls.
327
        response = None
328
        for probe in [self._open_repo_v3, self._open_repo_v2,
329
            self._open_repo_v1]:
330
            try:
331
                response, real_repo = probe(path)
332
                break
333
            except errors.UnknownSmartMethod:
334
                pass
335
        if response is None:
336
            raise errors.UnknownSmartMethod('BzrDir.find_repository{3,2,}')
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
337
        if response[0] != 'ok':
338
            raise errors.UnexpectedSmartServerResponse(response)
4053.1.1 by Robert Collins
New version of the BzrDir.find_repository verb supporting _network_name to support removing more _ensure_real calls.
339
        if len(response) != 6:
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
340
            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.
341
        if response[1] == '':
4053.1.1 by Robert Collins
New version of the BzrDir.find_repository verb supporting _network_name to support removing more _ensure_real calls.
342
            # repo is at this dir.
343
            format = response_tuple_to_repo_format(response[2:])
3221.15.10 by Robert Collins
Add test that we can stack on a smart server from Jonathan Lange.
344
            # Used to support creating a real format instance when needed.
345
            format._creating_bzrdir = self
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
346
            remote_repo = RemoteRepository(self, format)
347
            format._creating_repo = remote_repo
4053.1.1 by Robert Collins
New version of the BzrDir.find_repository verb supporting _network_name to support removing more _ensure_real calls.
348
            if real_repo is not None:
349
                remote_repo._set_real_repository(real_repo)
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
350
            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.
351
        else:
352
            raise errors.NoRepositoryPresent(self)
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
353
2018.5.138 by Robert Collins
Merge bzr.dev.
354
    def open_workingtree(self, recommend_upgrade=True):
2445.1.1 by Andrew Bennetts
Make RemoteBzrDir.open_workingtree raise NoWorkingTree rather than NotLocalUrl
355
        self._ensure_real()
356
        if self._real_bzrdir.has_workingtree():
357
            raise errors.NotLocalUrl(self.root_transport)
358
        else:
359
            raise errors.NoWorkingTree(self.root_transport.base)
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
360
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
361
    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.
362
        """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 :).
363
        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.
364
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
365
    def get_branch_transport(self, branch_format):
2018.5.162 by Andrew Bennetts
Add some missing _ensure_real calls, and a missing import.
366
        self._ensure_real()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
367
        return self._real_bzrdir.get_branch_transport(branch_format)
368
1752.2.43 by Andrew Bennetts
Fix get_{branch,repository,workingtree}_transport.
369
    def get_repository_transport(self, repository_format):
2018.5.162 by Andrew Bennetts
Add some missing _ensure_real calls, and a missing import.
370
        self._ensure_real()
1752.2.43 by Andrew Bennetts
Fix get_{branch,repository,workingtree}_transport.
371
        return self._real_bzrdir.get_repository_transport(repository_format)
372
373
    def get_workingtree_transport(self, workingtree_format):
2018.5.162 by Andrew Bennetts
Add some missing _ensure_real calls, and a missing import.
374
        self._ensure_real()
1752.2.43 by Andrew Bennetts
Fix get_{branch,repository,workingtree}_transport.
375
        return self._real_bzrdir.get_workingtree_transport(workingtree_format)
376
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
377
    def can_convert_format(self):
378
        """Upgrading of remote bzrdirs is not supported yet."""
379
        return False
380
381
    def needs_format_conversion(self, format=None):
382
        """Upgrading of remote bzrdirs is not supported yet."""
3943.2.5 by Martin Pool
deprecate needs_format_conversion(format=None)
383
        if format is None:
384
            symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
385
                % 'needs_format_conversion(format=None)')
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
386
        return False
387
3242.3.37 by Aaron Bentley
Updates from reviews
388
    def clone(self, url, revision_id=None, force_new_repo=False,
389
              preserve_stacking=False):
2018.5.94 by Andrew Bennetts
Various small changes in aid of making tests pass (including deleting one invalid test).
390
        self._ensure_real()
391
        return self._real_bzrdir.clone(url, revision_id=revision_id,
3242.3.37 by Aaron Bentley
Updates from reviews
392
            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).
393
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
394
    def _get_config(self):
395
        return RemoteBzrDirConfig(self)
3567.1.3 by Michael Hudson
fix problem
396
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
397
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
398
class RemoteRepositoryFormat(repository.RepositoryFormat):
2018.5.159 by Andrew Bennetts
Rename SmartClient to _SmartClient.
399
    """Format for repositories accessed over a _SmartClient.
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
400
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
401
    Instances of this repository are represented by RemoteRepository
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
402
    instances.
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
403
3128.1.3 by Vincent Ladeuil
Since we are there s/parameteris.*/parameteriz&/.
404
    The RemoteRepositoryFormat is parameterized during construction
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
405
    to reflect the capabilities of the real, remote format. Specifically
2018.5.138 by Robert Collins
Merge bzr.dev.
406
    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.
407
    on a per instance basis, and are not set (and should not be) at
408
    the class level.
3990.5.3 by Robert Collins
Docs and polish on RepositoryFormat.network_name.
409
4032.1.1 by John Arbash Meinel
Merge the removal of all trailing whitespace, and resolve conflicts.
410
    :ivar _custom_format: If set, a specific concrete repository format that
3990.5.3 by Robert Collins
Docs and polish on RepositoryFormat.network_name.
411
        will be used when initializing a repository with this
412
        RemoteRepositoryFormat.
413
    :ivar _creating_repo: If set, the repository object that this
414
        RemoteRepositoryFormat was created for: it can be called into
3990.5.4 by Robert Collins
Review feedback.
415
        to obtain data like the network name.
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
416
    """
417
3543.1.2 by Michael Hudson
the two character fix
418
    _matchingbzrdir = RemoteBzrDirFormat()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
419
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.
420
    def __init__(self):
421
        repository.RepositoryFormat.__init__(self)
422
        self._custom_format = None
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
423
        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.
424
        self._creating_bzrdir = None
4118.1.1 by Andrew Bennetts
Fix performance regression (many small round-trips) when pushing to a remote pack, and tidy the tests.
425
        self._supports_external_lookups = None
426
        self._supports_tree_reference = None
427
        self._rich_root_data = None
428
429
    @property
4183.5.1 by Robert Collins
Add RepositoryFormat.fast_deltas to signal fast delta creation.
430
    def fast_deltas(self):
431
        self._ensure_real()
432
        return self._custom_format.fast_deltas
433
434
    @property
4118.1.1 by Andrew Bennetts
Fix performance regression (many small round-trips) when pushing to a remote pack, and tidy the tests.
435
    def rich_root_data(self):
436
        if self._rich_root_data is None:
437
            self._ensure_real()
438
            self._rich_root_data = self._custom_format.rich_root_data
439
        return self._rich_root_data
440
441
    @property
442
    def supports_external_lookups(self):
443
        if self._supports_external_lookups is None:
444
            self._ensure_real()
445
            self._supports_external_lookups = \
4104.4.2 by Robert Collins
Fix test_source for 1.13 landing.
446
                self._custom_format.supports_external_lookups
4118.1.1 by Andrew Bennetts
Fix performance regression (many small round-trips) when pushing to a remote pack, and tidy the tests.
447
        return self._supports_external_lookups
448
449
    @property
450
    def supports_tree_reference(self):
451
        if self._supports_tree_reference is None:
452
            self._ensure_real()
453
            self._supports_tree_reference = \
454
                self._custom_format.supports_tree_reference
455
        return self._supports_tree_reference
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.
456
457
    def _vfs_initialize(self, a_bzrdir, shared):
458
        """Helper for common code in initialize."""
459
        if self._custom_format:
460
            # Custom format requested
461
            result = self._custom_format.initialize(a_bzrdir, shared=shared)
462
        elif self._creating_bzrdir is not None:
463
            # Use the format that the repository we were created to back
464
            # has.
465
            prior_repo = self._creating_bzrdir.open_repository()
466
            prior_repo._ensure_real()
467
            result = prior_repo._real_repository._format.initialize(
468
                a_bzrdir, shared=shared)
469
        else:
470
            # assume that a_bzr is a RemoteBzrDir but the smart server didn't
471
            # support remote initialization.
472
            # We delegate to a real object at this point (as RemoteBzrDir
473
            # delegate to the repository format which would lead to infinite
474
            # recursion if we just called a_bzrdir.create_repository.
475
            a_bzrdir._ensure_real()
476
            result = a_bzrdir._real_bzrdir.create_repository(shared=shared)
477
        if not isinstance(result, RemoteRepository):
478
            return self.open(a_bzrdir)
479
        else:
480
            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.
481
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
482
    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.
483
        # Being asked to create on a non RemoteBzrDir:
484
        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.
485
            return self._vfs_initialize(a_bzrdir, shared)
486
        medium = a_bzrdir._client._medium
487
        if medium._is_remote_before((1, 13)):
488
            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.
489
        # Creating on a remote bzr dir.
490
        # 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.
491
        if self._custom_format:
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
492
            network_name = self._custom_format.network_name()
4294.2.5 by Robert Collins
Reasonable unit test coverage for initialize_on_transport_ex.
493
        elif self._network_name:
494
            network_name = self._network_name
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
495
        else:
496
            # Select the current bzrlib default and ask for that.
497
            reference_bzrdir_format = bzrdir.format_registry.get('default')()
498
            reference_format = reference_bzrdir_format.repository_format
499
            network_name = reference_format.network_name()
500
        # 2) try direct creation via RPC
501
        path = a_bzrdir._path_for_remote_call(a_bzrdir._client)
502
        verb = 'BzrDir.create_repository'
503
        if shared:
504
            shared_str = 'True'
505
        else:
506
            shared_str = 'False'
507
        try:
508
            response = a_bzrdir._call(verb, path, network_name, shared_str)
509
        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.
510
            # Fallback - use vfs methods
4094.1.1 by Andrew Bennetts
Add some medium._remember_is_before((1, 13)) calls.
511
            medium._remember_remote_is_before((1, 13))
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.
512
            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.
513
        else:
514
            # Turn the response into a RemoteRepository object.
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
515
            format = response_tuple_to_repo_format(response[1:])
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
516
            # Used to support creating a real format instance when needed.
517
            format._creating_bzrdir = a_bzrdir
518
            remote_repo = RemoteRepository(a_bzrdir, format)
519
            format._creating_repo = remote_repo
520
            return remote_repo
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
521
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
522
    def open(self, a_bzrdir):
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
523
        if not isinstance(a_bzrdir, RemoteBzrDir):
524
            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.
525
        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.
526
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
527
    def _ensure_real(self):
528
        if self._custom_format is None:
529
            self._custom_format = repository.network_format_registry.get(
530
                self._network_name)
531
532
    @property
533
    def _fetch_order(self):
534
        self._ensure_real()
535
        return self._custom_format._fetch_order
536
537
    @property
538
    def _fetch_uses_deltas(self):
539
        self._ensure_real()
540
        return self._custom_format._fetch_uses_deltas
541
542
    @property
543
    def _fetch_reconcile(self):
544
        self._ensure_real()
545
        return self._custom_format._fetch_reconcile
546
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
547
    def get_format_description(self):
548
        return 'bzr remote repository'
549
550
    def __eq__(self, other):
4088.3.1 by Benjamin Peterson
compare types with 'is' not ==
551
        return self.__class__ is other.__class__
1752.2.87 by Andrew Bennetts
Make tests pass.
552
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
553
    def check_conversion_target(self, target_format):
554
        if self.rich_root_data and not target_format.rich_root_data:
555
            raise errors.BadConversionTarget(
556
                'Does not support rich root data.', target_format)
2018.5.138 by Robert Collins
Merge bzr.dev.
557
        if (self.supports_tree_reference and
558
            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.
559
            raise errors.BadConversionTarget(
560
                '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.
561
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
562
    def network_name(self):
4017.3.2 by Robert Collins
Reduce the number of round trips required to create a repository over the network.
563
        if self._network_name:
564
            return self._network_name
3990.5.1 by Andrew Bennetts
Add network_name() to RepositoryFormat.
565
        self._creating_repo._ensure_real()
566
        return self._creating_repo._real_repository._format.network_name()
567
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
568
    @property
569
    def _serializer(self):
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
570
        self._ensure_real()
571
        return self._custom_format._serializer
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
572
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
573
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
574
class RemoteRepository(_RpcHelper):
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
575
    """Repository accessed over rpc.
576
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
577
    For the moment most operations are performed using local transport-backed
578
    Repository objects.
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
579
    """
580
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
581
    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.
582
        """Create a RemoteRepository instance.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
583
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
584
        :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.
585
        :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.
586
        :param real_repository: If not None, a local implementation of the
587
            repository logic for the repository, usually accessing the data
588
            via the VFS.
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
589
        :param _client: Private testing parameter - override the smart client
590
            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.
591
        """
592
        if real_repository:
2018.5.36 by Andrew Bennetts
Fix typo, and clean up some ununsed import warnings from pyflakes at the same time.
593
            self._real_repository = real_repository
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
594
        else:
595
            self._real_repository = None
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
596
        self.bzrdir = remote_bzrdir
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
597
        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.
598
            self._client = remote_bzrdir._client
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
599
        else:
600
            self._client = _client
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
601
        self._format = format
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
602
        self._lock_mode = None
603
        self._lock_token = None
604
        self._lock_count = 0
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
605
        self._leave_lock = False
4307.2.4 by Robert Collins
Enable caching of negative revision lookups in RemoteRepository write locks when no _real_repository has been constructed.
606
        # Cache of revision parents; misses are cached during read locks, and
607
        # write locks when no _real_repository has been set.
3835.1.12 by Aaron Bentley
Unify CachingExtraParentsProvider and CachingParentsProvider.
608
        self._unstacked_provider = graph.CachingParentsProvider(
3896.1.1 by Andrew Bennetts
Remove broken debugging cruft, and some unused imports.
609
            get_parent_map=self._get_parent_map_rpc)
3835.1.12 by Aaron Bentley
Unify CachingExtraParentsProvider and CachingParentsProvider.
610
        self._unstacked_provider.disable_cache()
2951.1.10 by Robert Collins
Peer review feedback with Ian.
611
        # For tests:
612
        # These depend on the actual remote format, so force them off for
613
        # maximum compatibility. XXX: In future these should depend on the
614
        # remote repository instance, but this is irrelevant until we perform
615
        # 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.
616
        self._reconcile_does_inventory_gc = False
617
        self._reconcile_fixes_text_parents = False
2951.1.3 by Robert Collins
Partial support for native reconcile with packs.
618
        self._reconcile_backsup_inventory = False
2592.4.5 by Martin Pool
Add Repository.base on all repositories.
619
        self.base = self.bzrdir.transport.base
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
620
        # Additional places to query for data.
621
        self._fallback_repositories = []
2592.4.5 by Martin Pool
Add Repository.base on all repositories.
622
623
    def __str__(self):
624
        return "%s(%s)" % (self.__class__.__name__, self.base)
625
626
    __repr__ = __str__
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
627
3825.4.1 by Andrew Bennetts
Add suppress_errors to abort_write_group.
628
    def abort_write_group(self, suppress_errors=False):
2617.6.7 by Robert Collins
More review feedback.
629
        """Complete a write group on the decorated repository.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
630
4031.3.3 by Matt Nordhoff
Review tweaks from Ben Finney
631
        Smart methods perform operations in a single step so this API
2617.6.6 by Robert Collins
Some review feedback.
632
        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.
633
        for older plugins that don't use e.g. the CommitBuilder
634
        facility.
3825.4.6 by Andrew Bennetts
Document the suppress_errors flag in the docstring.
635
636
        :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.
637
        """
638
        self._ensure_real()
3825.4.1 by Andrew Bennetts
Add suppress_errors to abort_write_group.
639
        return self._real_repository.abort_write_group(
640
            suppress_errors=suppress_errors)
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
641
4253.1.1 by Robert Collins
Add chk_bytes property to RemoteRepository
642
    @property
643
    def chk_bytes(self):
644
        """Decorate the real repository for now.
645
646
        In the long term a full blown network facility is needed to avoid
647
        creating a real repository object locally.
648
        """
649
        self._ensure_real()
650
        return self._real_repository.chk_bytes
651
2617.6.2 by Robert Collins
Add abort_write_group and wire write_groups into fetch and commit.
652
    def commit_write_group(self):
2617.6.7 by Robert Collins
More review feedback.
653
        """Complete a write group on the decorated repository.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
654
4031.3.3 by Matt Nordhoff
Review tweaks from Ben Finney
655
        Smart methods perform operations in a single step so this API
2617.6.6 by Robert Collins
Some review feedback.
656
        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.
657
        for older plugins that don't use e.g. the CommitBuilder
658
        facility.
659
        """
660
        self._ensure_real()
661
        return self._real_repository.commit_write_group()
2617.6.1 by Robert Collins
* New method on Repository - ``start_write_group``, ``end_write_group``
662
4002.1.1 by Andrew Bennetts
Implement suspend_write_group/resume_write_group.
663
    def resume_write_group(self, tokens):
664
        self._ensure_real()
665
        return self._real_repository.resume_write_group(tokens)
666
667
    def suspend_write_group(self):
668
        self._ensure_real()
669
        return self._real_repository.suspend_write_group()
670
4343.3.29 by John Arbash Meinel
Add 'check_for_missing_texts' flag to get_missing_parent_inv..
671
    def get_missing_parent_inventories(self, check_for_missing_texts=True):
4257.4.6 by Andrew Bennetts
Make get_missing_parent_inventories work for all repo formats (it's a no-op for unstackable formats).
672
        self._ensure_real()
4343.3.29 by John Arbash Meinel
Add 'check_for_missing_texts' flag to get_missing_parent_inv..
673
        return self._real_repository.get_missing_parent_inventories(
674
            check_for_missing_texts=check_for_missing_texts)
4257.4.6 by Andrew Bennetts
Make get_missing_parent_inventories work for all repo formats (it's a no-op for unstackable formats).
675
4419.2.5 by Andrew Bennetts
Add Repository.get_rev_id_for_revno, and use it both as the _ensure_real fallback and as the server-side implementation.
676
    def get_rev_id_for_revno(self, revno, known_pair):
677
        """See Repository.get_rev_id_for_revno."""
678
        path = self.bzrdir._path_for_remote_call(self._client)
679
        try:
680
            response = self._call(
681
                'Repository.get_rev_id_for_revno', path, revno, known_pair)
682
        except errors.UnknownSmartMethod:
683
            self._client.medium._remember_remote_is_before((1, 16))
684
            self._ensure_real()
685
            return self._real_repository.get_rev_id_for_revno(
686
                revno, known_pair)
687
        if response[0] == 'ok':
688
            return True, response[1]
689
        elif response[0] == 'history-incomplete':
690
            return False, response[1:3]
691
        else:
692
            raise errors.UnexpectedSmartServerResponse(response)
693
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
694
    def _ensure_real(self):
695
        """Ensure that there is a _real_repository set.
696
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
697
        Used before calls to self._real_repository.
4145.1.1 by Robert Collins
Explicitly prevent fetching while the target repository is in a write group.
698
699
        Note that _ensure_real causes many roundtrips to the server which are
700
        not desirable, and prevents the use of smart one-roundtrip RPC's to
701
        perform complex operations (such as accessing parent data, streaming
702
        revisions etc). Adding calls to _ensure_real should only be done when
703
        bringing up new functionality, adding fallbacks for smart methods that
704
        require a fallback path, and never to replace an existing smart method
705
        invocation. If in doubt chat to the bzr network team.
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
706
        """
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.
707
        if self._real_repository is None:
4347.1.1 by Robert Collins
Show a traceback when VFS operations are started on a smart server hosted repository.
708
            if 'hpss' in debug.debug_flags:
709
                import traceback
710
                warning('VFS Repository access triggered\n%s',
711
                    ''.join(traceback.format_stack()))
4307.2.4 by Robert Collins
Enable caching of negative revision lookups in RemoteRepository write locks when no _real_repository has been constructed.
712
            self._unstacked_provider.missing_keys.clear()
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
713
            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.
714
            self._set_real_repository(
715
                self.bzrdir._real_bzrdir.open_repository())
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
716
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
717
    def _translate_error(self, err, **context):
718
        self.bzrdir._translate_error(err, repository=self, **context)
719
2988.1.2 by Robert Collins
New Repository API find_text_key_references for use by reconcile and check.
720
    def find_text_key_references(self):
721
        """Find the text key references within the repository.
722
723
        :return: a dictionary mapping (file_id, revision_id) tuples to altered file-ids to an iterable of
724
        revision_ids. Each altered file-ids has the exact revision_ids that
725
        altered it listed explicitly.
726
        :return: A dictionary mapping text keys ((fileid, revision_id) tuples)
727
            to whether they were referred to by the inventory of the
728
            revision_id that they contain. The inventory texts from all present
729
            revision ids are assessed to generate this report.
730
        """
731
        self._ensure_real()
732
        return self._real_repository.find_text_key_references()
733
2988.1.3 by Robert Collins
Add a new repositoy method _generate_text_key_index for use by reconcile/check.
734
    def _generate_text_key_index(self):
735
        """Generate a new text key index for the repository.
736
737
        This is an expensive function that will take considerable time to run.
738
739
        :return: A dict mapping (file_id, revision_id) tuples to a list of
740
            parents, also (file_id, revision_id) tuples.
741
        """
742
        self._ensure_real()
743
        return self._real_repository._generate_text_key_index()
744
3287.6.4 by Robert Collins
Fix up deprecation warnings for get_revision_graph.
745
    def _get_revision_graph(self, revision_id):
746
        """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)
747
        if revision_id is None:
748
            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.
749
        elif revision.is_null(revision_id):
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
750
            return {}
751
752
        path = self.bzrdir._path_for_remote_call(self._client)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
753
        response = self._call_expecting_body(
754
            '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.
755
        response_tuple, response_handler = response
756
        if response_tuple[0] != 'ok':
757
            raise errors.UnexpectedSmartServerResponse(response_tuple)
758
        coded = response_handler.read_body_bytes()
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
759
        if coded == '':
760
            # no revisions in this repository!
761
            return {}
762
        lines = coded.split('\n')
763
        revision_graph = {}
764
        for line in lines:
765
            d = tuple(line.split())
766
            revision_graph[d[0]] = d[1:]
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
767
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
768
        return revision_graph
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
769
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
770
    def _get_sink(self):
771
        """See Repository._get_sink()."""
4022.1.6 by Robert Collins
Cherrypick and polish the RemoteSink for streaming push.
772
        return RemoteStreamSink(self)
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
773
4060.1.3 by Robert Collins
Implement the separate source component for fetch - repository.StreamSource.
774
    def _get_source(self, to_format):
775
        """Return a source for streaming from this repository."""
776
        return RemoteStreamSource(self, to_format)
777
4307.2.3 by Robert Collins
Change RemoteRepository.has_revision to use get_parent_map to leverage the caching.
778
    @needs_read_lock
2018.5.40 by Robert Collins
Implement a remote Repository.has_revision method.
779
    def has_revision(self, revision_id):
4307.2.3 by Robert Collins
Change RemoteRepository.has_revision to use get_parent_map to leverage the caching.
780
        """True if this repository has a copy of the revision."""
781
        # Copy of bzrlib.repository.Repository.has_revision
782
        return revision_id in self.has_revisions((revision_id,))
2018.5.40 by Robert Collins
Implement a remote Repository.has_revision method.
783
4307.2.3 by Robert Collins
Change RemoteRepository.has_revision to use get_parent_map to leverage the caching.
784
    @needs_read_lock
3172.3.1 by Robert Collins
Repository has a new method ``has_revisions`` which signals the presence
785
    def has_revisions(self, revision_ids):
4307.2.3 by Robert Collins
Change RemoteRepository.has_revision to use get_parent_map to leverage the caching.
786
        """Probe to find out the presence of multiple revisions.
787
788
        :param revision_ids: An iterable of revision_ids.
789
        :return: A set of the revision_ids that were present.
790
        """
791
        # Copy of bzrlib.repository.Repository.has_revisions
792
        parent_map = self.get_parent_map(revision_ids)
793
        result = set(parent_map)
794
        if _mod_revision.NULL_REVISION in revision_ids:
795
            result.add(_mod_revision.NULL_REVISION)
3172.3.1 by Robert Collins
Repository has a new method ``has_revisions`` which signals the presence
796
        return result
797
2617.6.9 by Robert Collins
Merge bzr.dev.
798
    def has_same_location(self, other):
4088.3.1 by Benjamin Peterson
compare types with 'is' not ==
799
        return (self.__class__ is other.__class__ and
2592.3.162 by Robert Collins
Remove some arbitrary differences from bzr.dev.
800
                self.bzrdir.transport.base == other.bzrdir.transport.base)
3835.1.1 by Aaron Bentley
Stack get_parent_map on fallback repos
801
2490.2.21 by Aaron Bentley
Rename graph to deprecated_graph
802
    def get_graph(self, other_repository=None):
803
        """Return the graph for this repository format"""
3835.1.17 by Aaron Bentley
Fix stacking bug
804
        parents_provider = self._make_parents_provider(other_repository)
3441.5.24 by Andrew Bennetts
Remove RemoteGraph experiment.
805
        return graph.Graph(parents_provider)
2490.2.5 by Aaron Bentley
Use GraphWalker.unique_ancestor to determine merge base
806
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
807
    def gather_stats(self, revid=None, committers=None):
2018.5.62 by Robert Collins
Stub out RemoteRepository.gather_stats while its implemented in parallel.
808
        """See Repository.gather_stats()."""
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
809
        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.
810
        # revid can be None to indicate no revisions, not just NULL_REVISION
811
        if revid is None or revision.is_null(revid):
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
812
            fmt_revid = ''
813
        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.
814
            fmt_revid = revid
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
815
        if committers is None or not committers:
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
816
            fmt_committers = 'no'
817
        else:
818
            fmt_committers = 'yes'
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
819
        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.
820
            '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.
821
        if response_tuple[0] != 'ok':
822
            raise errors.UnexpectedSmartServerResponse(response_tuple)
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
823
3245.4.58 by Andrew Bennetts
Unpack call_expecting_body's return value into variables, to avoid lots of ugly subscripting.
824
        body = response_handler.read_body_bytes()
2018.10.3 by v.ladeuil+lp at free
more tests for gather_stats
825
        result = {}
826
        for line in body.split('\n'):
827
            if not line:
828
                continue
829
            key, val_text = line.split(':')
830
            if key in ('revisions', 'size', 'committers'):
831
                result[key] = int(val_text)
832
            elif key in ('firstrev', 'latestrev'):
833
                values = val_text.split(' ')[1:]
834
                result[key] = (float(values[0]), long(values[1]))
835
836
        return result
2018.5.62 by Robert Collins
Stub out RemoteRepository.gather_stats while its implemented in parallel.
837
3140.1.2 by Aaron Bentley
Add ability to find branches inside repositories
838
    def find_branches(self, using=False):
839
        """See Repository.find_branches()."""
840
        # should be an API call to the server.
841
        self._ensure_real()
842
        return self._real_repository.find_branches(using=using)
843
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
844
    def get_physical_lock_status(self):
845
        """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.
846
        # should be an API call to the server.
847
        self._ensure_real()
848
        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.
849
2617.6.1 by Robert Collins
* New method on Repository - ``start_write_group``, ``end_write_group``
850
    def is_in_write_group(self):
851
        """Return True if there is an open write group.
852
853
        write groups are only applicable locally for the smart server..
854
        """
855
        if self._real_repository:
856
            return self._real_repository.is_in_write_group()
857
858
    def is_locked(self):
859
        return self._lock_count >= 1
860
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
861
    def is_shared(self):
862
        """See Repository.is_shared()."""
863
        path = self.bzrdir._path_for_remote_call(self._client)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
864
        response = self._call('Repository.is_shared', path)
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
865
        if response[0] not in ('yes', 'no'):
866
            raise SmartProtocolError('unexpected response code %s' % (response,))
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
867
        return response[0] == 'yes'
868
2904.1.1 by Robert Collins
* New method ``bzrlib.repository.Repository.is_write_locked`` useful for
869
    def is_write_locked(self):
870
        return self._lock_mode == 'w'
871
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
872
    def lock_read(self):
873
        # wrong eventually - want a local lock cache context
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
874
        if not self._lock_mode:
875
            self._lock_mode = 'r'
876
            self._lock_count = 1
4190.1.1 by Robert Collins
Negatively cache misses during read-locks in RemoteRepository.
877
            self._unstacked_provider.enable_cache(cache_misses=True)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
878
            if self._real_repository is not None:
879
                self._real_repository.lock_read()
4379.2.1 by John Arbash Meinel
Change the fallback repository code to only lock/unlock on transition.
880
            for repo in self._fallback_repositories:
881
                repo.lock_read()
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
882
        else:
883
            self._lock_count += 1
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
884
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
885
    def _remote_lock_write(self, token):
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
886
        path = self.bzrdir._path_for_remote_call(self._client)
887
        if token is None:
888
            token = ''
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
889
        err_context = {'token': token}
890
        response = self._call('Repository.lock_write', path, token,
891
                              **err_context)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
892
        if response[0] == 'ok':
893
            ok, token = response
894
            return token
895
        else:
2555.1.1 by Martin Pool
Remove use of 'assert False' to raise an exception unconditionally
896
            raise errors.UnexpectedSmartServerResponse(response)
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
897
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
898
    def lock_write(self, token=None, _skip_rpc=False):
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
899
        if not self._lock_mode:
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
900
            if _skip_rpc:
901
                if self._lock_token is not None:
902
                    if token != self._lock_token:
3695.1.1 by Andrew Bennetts
Remove some unused imports and fix a couple of trivially broken raise statements.
903
                        raise errors.TokenMismatch(token, self._lock_token)
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
904
                self._lock_token = token
905
            else:
906
                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.
907
            # if self._lock_token is None, then this is something like packs or
908
            # svn where we don't get to lock the repo, or a weave style repository
909
            # where we cannot lock it over the wire and attempts to do so will
910
            # fail.
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
911
            if self._real_repository is not None:
912
                self._real_repository.lock_write(token=self._lock_token)
913
            if token is not None:
914
                self._leave_lock = True
915
            else:
916
                self._leave_lock = False
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
917
            self._lock_mode = 'w'
918
            self._lock_count = 1
4307.2.4 by Robert Collins
Enable caching of negative revision lookups in RemoteRepository write locks when no _real_repository has been constructed.
919
            cache_misses = self._real_repository is None
920
            self._unstacked_provider.enable_cache(cache_misses=cache_misses)
4379.2.1 by John Arbash Meinel
Change the fallback repository code to only lock/unlock on transition.
921
            for repo in self._fallback_repositories:
922
                # Writes don't affect fallback repos
923
                repo.lock_read()
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
924
        elif self._lock_mode == 'r':
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
925
            raise errors.ReadOnlyError(self)
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
926
        else:
927
            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.
928
        return self._lock_token or None
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
929
930
    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.
931
        if not self._lock_token:
932
            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
933
        self._leave_lock = True
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
934
935
    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.
936
        if not self._lock_token:
3015.2.15 by Robert Collins
Review feedback.
937
            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
938
        self._leave_lock = False
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
939
940
    def _set_real_repository(self, repository):
941
        """Set the _real_repository for this repository.
942
943
        :param repository: The repository to fallback to for non-hpss
944
            implemented operations.
945
        """
4053.1.5 by Robert Collins
Review feedback on RemoteRepository._set_real_revision.
946
        if self._real_repository is not None:
947
            # Replacing an already set real repository.
948
            # We cannot do this [currently] if the repository is locked -
949
            # synchronised state might be lost.
950
            if self.is_locked():
951
                raise AssertionError('_real_repository is already set')
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
952
        if isinstance(repository, RemoteRepository):
953
            raise AssertionError()
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
954
        self._real_repository = repository
4226.2.5 by Robert Collins
Fix handling of fallback repositories some more.
955
        # three code paths happen here:
956
        # 1) old servers, RemoteBranch.open() calls _ensure_real before setting
957
        # up stacking. In this case self._fallback_repositories is [], and the
958
        # real repo is already setup. Preserve the real repo and
959
        # RemoteRepository.add_fallback_repository will avoid adding
960
        # duplicates.
961
        # 2) new servers, RemoteBranch.open() sets up stacking, and when
962
        # ensure_real is triggered from a branch, the real repository to
963
        # set already has a matching list with separate instances, but
964
        # as they are also RemoteRepositories we don't worry about making the
965
        # lists be identical.
966
        # 3) new servers, RemoteRepository.ensure_real is triggered before
967
        # RemoteBranch.ensure real, in this case we get a repo with no fallbacks
968
        # and need to populate it.
969
        if (self._fallback_repositories and
970
            len(self._real_repository._fallback_repositories) !=
4226.2.2 by Robert Collins
Fix setting config options to support unicode values and don't attempt to reset repositories _fallback_repositories as the simple approach fails to work.
971
            len(self._fallback_repositories)):
972
            if len(self._real_repository._fallback_repositories):
973
                raise AssertionError(
974
                    "cannot cleanly remove existing _fallback_repositories")
3691.2.12 by Martin Pool
Add test for coping without Branch.get_stacked_on_url
975
        for fb in self._fallback_repositories:
976
            self._real_repository.add_fallback_repository(fb)
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
977
        if self._lock_mode == 'w':
978
            # if we are already locked, the real repository must be able to
979
            # acquire the lock with our token.
980
            self._real_repository.lock_write(self._lock_token)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
981
        elif self._lock_mode == 'r':
982
            self._real_repository.lock_read()
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
983
2617.6.1 by Robert Collins
* New method on Repository - ``start_write_group``, ``end_write_group``
984
    def start_write_group(self):
985
        """Start a write group on the decorated repository.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
986
4031.3.3 by Matt Nordhoff
Review tweaks from Ben Finney
987
        Smart methods perform operations in a single step so this API
2617.6.6 by Robert Collins
Some review feedback.
988
        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``
989
        for older plugins that don't use e.g. the CommitBuilder
990
        facility.
991
        """
992
        self._ensure_real()
993
        return self._real_repository.start_write_group()
994
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
995
    def _unlock(self, token):
996
        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.
997
        if not token:
998
            # with no token the remote repository is not persistently locked.
999
            return
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1000
        err_context = {'token': token}
1001
        response = self._call('Repository.unlock', path, token,
1002
                              **err_context)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1003
        if response == ('ok',):
1004
            return
1005
        else:
2555.1.1 by Martin Pool
Remove use of 'assert False' to raise an exception unconditionally
1006
            raise errors.UnexpectedSmartServerResponse(response)
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1007
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
1008
    def unlock(self):
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1009
        if not self._lock_count:
1010
            raise errors.LockNotHeld(self)
2018.5.75 by Andrew Bennetts
Add Repository.{dont_,}leave_lock_in_place.
1011
        self._lock_count -= 1
2592.3.244 by Martin Pool
unlock while in a write group now aborts the write group, unlocks, and errors.
1012
        if self._lock_count > 0:
1013
            return
3835.1.8 by Aaron Bentley
Make UnstackedParentsProvider manage the cache
1014
        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.
1015
        old_mode = self._lock_mode
1016
        self._lock_mode = None
1017
        try:
1018
            # The real repository is responsible at present for raising an
1019
            # exception if it's in an unfinished write group.  However, it
1020
            # normally will *not* actually remove the lock from disk - that's
1021
            # done by the server on receiving the Repository.unlock call.
1022
            # 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
1023
            if self._real_repository is not None:
1024
                self._real_repository.unlock()
2592.3.244 by Martin Pool
unlock while in a write group now aborts the write group, unlocks, and errors.
1025
        finally:
1026
            # The rpc-level lock should be released even if there was a
1027
            # problem releasing the vfs-based lock.
1028
            if old_mode == 'w':
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1029
                # Only write-locked repositories need to make a remote method
4031.3.1 by Frank Aspell
Fixing various typos
1030
                # call to perform the unlock.
2592.3.244 by Martin Pool
unlock while in a write group now aborts the write group, unlocks, and errors.
1031
                old_token = self._lock_token
1032
                self._lock_token = None
1033
                if not self._leave_lock:
1034
                    self._unlock(old_token)
4379.2.1 by John Arbash Meinel
Change the fallback repository code to only lock/unlock on transition.
1035
        # Fallbacks are always 'lock_read()' so we don't pay attention to
1036
        # self._leave_lock
1037
        for repo in self._fallback_repositories:
1038
            repo.unlock()
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
1039
1040
    def break_lock(self):
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
1041
        # should hand off to the network
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1042
        self._ensure_real()
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
1043
        return self._real_repository.break_lock()
1044
2018.18.8 by Ian Clatworthy
Tarball proxy code & tests
1045
    def _get_tarball(self, compression):
2814.10.2 by Andrew Bennetts
Make the fallback a little tidier.
1046
        """Return a TemporaryFile containing a repository tarball.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1047
2814.10.2 by Andrew Bennetts
Make the fallback a little tidier.
1048
        Returns None if the server does not support sending tarballs.
1049
        """
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1050
        import tempfile
2018.18.8 by Ian Clatworthy
Tarball proxy code & tests
1051
        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.
1052
        try:
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1053
            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.
1054
                'Repository.tarball', path, compression)
1055
        except errors.UnknownSmartMethod:
1056
            protocol.cancel_read_body()
1057
            return None
2018.18.8 by Ian Clatworthy
Tarball proxy code & tests
1058
        if response[0] == 'ok':
1059
            # Extract the tarball and return it
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1060
            t = tempfile.NamedTemporaryFile()
1061
            # TODO: rpc layer should read directly into it...
1062
            t.write(protocol.read_body_bytes())
1063
            t.seek(0)
1064
            return t
2814.10.1 by Andrew Bennetts
Cope gracefully if the server doesn't support the Repository.tarball smart request.
1065
        raise errors.UnexpectedSmartServerResponse(response)
2018.18.8 by Ian Clatworthy
Tarball proxy code & tests
1066
2440.1.1 by Martin Pool
Add new Repository.sprout,
1067
    def sprout(self, to_bzrdir, revision_id=None):
1068
        # 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.
1069
        self._ensure_real()
3047.1.4 by Andrew Bennetts
Simplify RemoteRepository.sprout thanks to review comments.
1070
        dest_repo = self._real_repository._format.initialize(to_bzrdir,
1071
                                                             shared=False)
2535.3.17 by Andrew Bennetts
[broken] Closer to a working Repository.fetch_revisions smart request.
1072
        dest_repo.fetch(self, revision_id=revision_id)
1073
        return dest_repo
2440.1.1 by Martin Pool
Add new Repository.sprout,
1074
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1075
    ### These methods are just thin shims to the VFS object for now.
1076
1077
    def revision_tree(self, revision_id):
1078
        self._ensure_real()
1079
        return self._real_repository.revision_tree(revision_id)
1080
2520.4.113 by Aaron Bentley
Avoid peeking at Repository._serializer
1081
    def get_serializer_format(self):
1082
        self._ensure_real()
1083
        return self._real_repository.get_serializer_format()
1084
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1085
    def get_commit_builder(self, branch, parents, config, timestamp=None,
1086
                           timezone=None, committer=None, revprops=None,
1087
                           revision_id=None):
1088
        # FIXME: It ought to be possible to call this without immediately
1089
        # triggering _ensure_real.  For now it's the easiest thing to do.
1090
        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.
1091
        real_repo = self._real_repository
1092
        builder = real_repo.get_commit_builder(branch, parents,
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1093
                config, timestamp=timestamp, timezone=timezone,
1094
                committer=committer, revprops=revprops, revision_id=revision_id)
1095
        return builder
1096
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
1097
    def add_fallback_repository(self, repository):
1098
        """Add a repository to use for looking up data not held locally.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1099
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
1100
        :param repository: A repository.
1101
        """
4118.1.1 by Andrew Bennetts
Fix performance regression (many small round-trips) when pushing to a remote pack, and tidy the tests.
1102
        if not self._format.supports_external_lookups:
1103
            raise errors.UnstackableRepositoryFormat(
1104
                self._format.network_name(), self.base)
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
1105
        # We need to accumulate additional repositories here, to pass them in
1106
        # on various RPC's.
4035.2.3 by Robert Collins
Fix trailing whitespace.
1107
        #
4379.2.2 by John Arbash Meinel
Change the Repository.add_fallback_repository() contract slightly.
1108
        if self.is_locked():
1109
            # We will call fallback.unlock() when we transition to the unlocked
1110
            # state, so always add a lock here. If a caller passes us a locked
1111
            # repository, they are responsible for unlocking it later.
1112
            repository.lock_read()
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
1113
        self._fallback_repositories.append(repository)
4035.2.2 by Robert Collins
Minor tweaks to fix failing tests.
1114
        # If self._real_repository was parameterised already (e.g. because a
1115
        # _real_branch had its get_stacked_on_url method called), then the
1116
        # repository to be added may already be in the _real_repositories list.
4035.2.1 by Andrew Bennetts
Fix unnecessary get_parent_map calls after insert_stream during push.
1117
        if self._real_repository is not None:
4226.2.5 by Robert Collins
Fix handling of fallback repositories some more.
1118
            fallback_locations = [repo.bzrdir.root_transport.base for repo in
1119
                self._real_repository._fallback_repositories]
1120
            if repository.bzrdir.root_transport.base not in fallback_locations:
4035.2.2 by Robert Collins
Minor tweaks to fix failing tests.
1121
                self._real_repository.add_fallback_repository(repository)
3221.12.1 by Robert Collins
Backport development1 format (stackable packs) to before-shallow-branches.
1122
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1123
    def add_inventory(self, revid, inv, parents):
1124
        self._ensure_real()
1125
        return self._real_repository.add_inventory(revid, inv, parents)
1126
3879.2.2 by John Arbash Meinel
Rename add_inventory_delta to add_inventory_by_delta.
1127
    def add_inventory_by_delta(self, basis_revision_id, delta, new_revision_id,
1128
                               parents):
3775.2.1 by Robert Collins
Create bzrlib.repository.Repository.add_inventory_delta for adding inventories via deltas.
1129
        self._ensure_real()
3879.2.2 by John Arbash Meinel
Rename add_inventory_delta to add_inventory_by_delta.
1130
        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.
1131
            delta, new_revision_id, parents)
1132
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1133
    def add_revision(self, rev_id, rev, inv=None, config=None):
1134
        self._ensure_real()
1135
        return self._real_repository.add_revision(
1136
            rev_id, rev, inv=inv, config=config)
1137
1138
    @needs_read_lock
1139
    def get_inventory(self, revision_id):
1140
        self._ensure_real()
1141
        return self._real_repository.get_inventory(revision_id)
1142
3169.2.1 by Robert Collins
New method ``iter_inventories`` on Repository for access to many
1143
    def iter_inventories(self, revision_ids):
1144
        self._ensure_real()
1145
        return self._real_repository.iter_inventories(revision_ids)
1146
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1147
    @needs_read_lock
1148
    def get_revision(self, revision_id):
1149
        self._ensure_real()
1150
        return self._real_repository.get_revision(revision_id)
1151
1152
    def get_transaction(self):
1153
        self._ensure_real()
1154
        return self._real_repository.get_transaction()
1155
1156
    @needs_read_lock
2018.5.138 by Robert Collins
Merge bzr.dev.
1157
    def clone(self, a_bzrdir, revision_id=None):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1158
        self._ensure_real()
2018.5.138 by Robert Collins
Merge bzr.dev.
1159
        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.
1160
1161
    def make_working_trees(self):
3349.1.1 by Aaron Bentley
Enable setting and getting make_working_trees for all repositories
1162
        """See Repository.make_working_trees"""
1163
        self._ensure_real()
1164
        return self._real_repository.make_working_trees()
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1165
4145.1.2 by Robert Collins
Add a refresh_data method on Repository allowing cleaner handling of insertions into RemoteRepository objects with _real_repository instances.
1166
    def refresh_data(self):
1167
        """Re-read any data needed to to synchronise with disk.
1168
1169
        This method is intended to be called after another repository instance
1170
        (such as one used by a smart server) has inserted data into the
1171
        repository. It may not be called during a write group, but may be
1172
        called at any other time.
1173
        """
1174
        if self.is_in_write_group():
1175
            raise errors.InternalBzrError(
1176
                "May not refresh_data while in a write group.")
1177
        if self._real_repository is not None:
1178
            self._real_repository.refresh_data()
1179
3184.1.9 by Robert Collins
* ``Repository.get_data_stream`` is now deprecated in favour of
1180
    def revision_ids_to_search_result(self, result_set):
1181
        """Convert a set of revision ids to a graph SearchResult."""
1182
        result_parents = set()
1183
        for parents in self.get_graph().get_parent_map(
1184
            result_set).itervalues():
1185
            result_parents.update(parents)
1186
        included_keys = result_set.intersection(result_parents)
1187
        start_keys = result_set.difference(included_keys)
1188
        exclude_keys = result_parents.difference(result_set)
1189
        result = graph.SearchResult(start_keys, exclude_keys,
1190
            len(result_set), result_set)
1191
        return result
1192
1193
    @needs_read_lock
1194
    def search_missing_revision_ids(self, other, revision_id=None, find_ghosts=True):
1195
        """Return the revision ids that other has that this does not.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1196
3184.1.9 by Robert Collins
* ``Repository.get_data_stream`` is now deprecated in favour of
1197
        These are returned in topological order.
1198
1199
        revision_id: only return revision ids included by revision_id.
1200
        """
1201
        return repository.InterRepository.get(
1202
            other, self).search_missing_revision_ids(revision_id, find_ghosts)
1203
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
1204
    def fetch(self, source, revision_id=None, pb=None, find_ghosts=False,
1205
            fetch_spec=None):
4145.1.1 by Robert Collins
Explicitly prevent fetching while the target repository is in a write group.
1206
        # No base implementation to use as RemoteRepository is not a subclass
1207
        # of Repository; so this is a copy of Repository.fetch().
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
1208
        if fetch_spec is not None and revision_id is not None:
1209
            raise AssertionError(
1210
                "fetch_spec and revision_id are mutually exclusive.")
4145.1.1 by Robert Collins
Explicitly prevent fetching while the target repository is in a write group.
1211
        if self.is_in_write_group():
4145.1.3 by Robert Collins
NEWS conflicts.
1212
            raise errors.InternalBzrError(
1213
                "May not fetch while in a write group.")
4145.1.1 by Robert Collins
Explicitly prevent fetching while the target repository is in a write group.
1214
        # fast path same-url fetch operations
4070.9.2 by Andrew Bennetts
Rough prototype of allowing a SearchResult to be passed to fetch, and using that to improve network conversations.
1215
        if self.has_same_location(source) and fetch_spec is None:
2881.4.1 by Robert Collins
Move responsibility for detecting same-repo fetching from the
1216
            # check that last_revision is in 'from' and then return a
1217
            # no-operation.
1218
            if (revision_id is not None and
4145.1.5 by Robert Collins
More fixes from grabbing the Repository implementation of fetch for RemoteRepository.
1219
                not revision.is_null(revision_id)):
2881.4.1 by Robert Collins
Move responsibility for detecting same-repo fetching from the
1220
                self.get_revision(revision_id)
2592.4.5 by Martin Pool
Add Repository.base on all repositories.
1221
            return 0, []
4145.1.1 by Robert Collins
Explicitly prevent fetching while the target repository is in a write group.
1222
        # if there is no specific appropriate InterRepository, this will get
1223
        # the InterRepository base class, which raises an
1224
        # IncompatibleRepositories when asked to fetch.
4145.1.2 by Robert Collins
Add a refresh_data method on Repository allowing cleaner handling of insertions into RemoteRepository objects with _real_repository instances.
1225
        inter = repository.InterRepository.get(source, self)
4145.1.1 by Robert Collins
Explicitly prevent fetching while the target repository is in a write group.
1226
        return inter.fetch(revision_id=revision_id, pb=pb,
1227
            find_ghosts=find_ghosts, fetch_spec=fetch_spec)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1228
2520.4.54 by Aaron Bentley
Hang a create_bundle method off repository
1229
    def create_bundle(self, target, base, fileobj, format=None):
1230
        self._ensure_real()
1231
        self._real_repository.create_bundle(target, base, fileobj, format)
1232
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1233
    @needs_read_lock
2530.1.1 by Aaron Bentley
Make topological sorting optional for get_ancestry
1234
    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.
1235
        self._ensure_real()
2530.1.1 by Aaron Bentley
Make topological sorting optional for get_ancestry
1236
        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.
1237
1238
    def fileids_altered_by_revision_ids(self, revision_ids):
1239
        self._ensure_real()
1240
        return self._real_repository.fileids_altered_by_revision_ids(revision_ids)
1241
3036.1.3 by Robert Collins
Privatise VersionedFileChecker.
1242
    def _get_versioned_file_checker(self, revisions, revision_versions_cache):
2745.6.1 by Aaron Bentley
Initial checking of knit graphs
1243
        self._ensure_real()
3036.1.3 by Robert Collins
Privatise VersionedFileChecker.
1244
        return self._real_repository._get_versioned_file_checker(
2745.6.50 by Andrew Bennetts
Remove find_bad_ancestors; it's not needed anymore.
1245
            revisions, revision_versions_cache)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1246
2708.1.7 by Aaron Bentley
Rename extract_files_bytes to iter_files_bytes
1247
    def iter_files_bytes(self, desired_files):
2708.1.9 by Aaron Bentley
Clean-up docs and imports
1248
        """See Repository.iter_file_bytes.
2708.1.3 by Aaron Bentley
Implement extract_files_bytes on Repository
1249
        """
1250
        self._ensure_real()
2708.1.7 by Aaron Bentley
Rename extract_files_bytes to iter_files_bytes
1251
        return self._real_repository.iter_files_bytes(desired_files)
2708.1.3 by Aaron Bentley
Implement extract_files_bytes on Repository
1252
3835.1.1 by Aaron Bentley
Stack get_parent_map on fallback repos
1253
    def get_parent_map(self, revision_ids):
3835.1.6 by Aaron Bentley
Reduce inefficiency when doing make_parents_provider frequently
1254
        """See bzrlib.Graph.get_parent_map()."""
3835.1.5 by Aaron Bentley
Fix make_parents_provider
1255
        return self._make_parents_provider().get_parent_map(revision_ids)
3835.1.1 by Aaron Bentley
Stack get_parent_map on fallback repos
1256
1257
    def _get_parent_map_rpc(self, keys):
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1258
        """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.
1259
        medium = self._client._medium
3453.4.10 by Andrew Bennetts
Change _is_remote_at_least to _is_remote_before.
1260
        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.
1261
            # We already found out that the server can't understand
3213.1.3 by Andrew Bennetts
Fix typo in comment.
1262
            # 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.
1263
            # graph.
3948.3.7 by Martin Pool
Updated tests for RemoteRepository.get_parent_map on old servers.
1264
            #
1265
            # Note that this reads the whole graph, when only some keys are
1266
            # wanted.  On this old server there's no way (?) to get them all
1267
            # in one go, and the user probably will have seen a warning about
1268
            # the server being old anyhow.
1269
            rg = self._get_revision_graph(None)
4031.3.3 by Matt Nordhoff
Review tweaks from Ben Finney
1270
            # There is an API discrepancy between get_parent_map and
3389.1.1 by John Arbash Meinel
Fix bug #214894. Fix RemoteRepository.get_parent_map() when server is <v1.2
1271
            # get_revision_graph. Specifically, a "key:()" pair in
1272
            # get_revision_graph just means a node has no parents. For
1273
            # "get_parent_map" it means the node is a ghost. So fix up the
1274
            # graph to correct this.
1275
            #   https://bugs.launchpad.net/bzr/+bug/214894
1276
            # There is one other "bug" which is that ghosts in
1277
            # get_revision_graph() are not returned at all. But we won't worry
1278
            # about that for now.
1279
            for node_id, parent_ids in rg.iteritems():
1280
                if parent_ids == ():
1281
                    rg[node_id] = (NULL_REVISION,)
1282
            rg[NULL_REVISION] = ()
1283
            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.
1284
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1285
        keys = set(keys)
3373.5.2 by John Arbash Meinel
Add repository_implementation tests for get_parent_map
1286
        if None in keys:
1287
            raise ValueError('get_parent_map(None) is not valid')
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1288
        if NULL_REVISION in keys:
1289
            keys.discard(NULL_REVISION)
1290
            found_parents = {NULL_REVISION:()}
1291
            if not keys:
1292
                return found_parents
1293
        else:
1294
            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.
1295
        # TODO(Needs analysis): We could assume that the keys being requested
1296
        # from get_parent_map are in a breadth first search, so typically they
1297
        # will all be depth N from some common parent, and we don't have to
1298
        # have the server iterate from the root parent, but rather from the
1299
        # keys we're searching; and just tell the server the keyspace we
1300
        # already have; but this may be more traffic again.
1301
1302
        # Transform self._parents_map into a search request recipe.
1303
        # TODO: Manage this incrementally to avoid covering the same path
1304
        # repeatedly. (The server will have to on each request, but the less
1305
        # work done the better).
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1306
        #
1307
        # Negative caching notes:
1308
        # new server sends missing when a request including the revid
1309
        # 'include-missing:' is present in the request.
1310
        # missing keys are serialised as missing:X, and we then call
1311
        # provider.note_missing(X) for-all X
3835.1.8 by Aaron Bentley
Make UnstackedParentsProvider manage the cache
1312
        parents_map = self._unstacked_provider.get_cached_map()
3213.1.8 by Andrew Bennetts
Merge from bzr.dev.
1313
        if parents_map is None:
1314
            # Repository is not locked, so there's no cache.
1315
            parents_map = {}
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1316
        # start_set is all the keys in the cache
3213.1.8 by Andrew Bennetts
Merge from bzr.dev.
1317
        start_set = set(parents_map)
4190.1.3 by Robert Collins
Allow optional inclusion of ghost data in server get_parent_map calls.
1318
        # result set is all the references to keys in the cache
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.
1319
        result_parents = set()
3213.1.8 by Andrew Bennetts
Merge from bzr.dev.
1320
        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.
1321
            result_parents.update(parents)
1322
        stop_keys = result_parents.difference(start_set)
4190.1.4 by Robert Collins
Cache ghosts when we can get them from a RemoteRepository in get_parent_map.
1323
        # We don't need to send ghosts back to the server as a position to
1324
        # stop either.
1325
        stop_keys.difference_update(self._unstacked_provider.missing_keys)
4214.2.5 by Andrew Bennetts
Fix the bug.
1326
        key_count = len(parents_map)
1327
        if (NULL_REVISION in result_parents
1328
            and NULL_REVISION in self._unstacked_provider.missing_keys):
1329
            # If we pruned NULL_REVISION from the stop_keys because it's also
1330
            # in our cache of "missing" keys we need to increment our key count
1331
            # by 1, because the reconsitituted SearchResult on the server will
1332
            # still consider NULL_REVISION to be an included key.
1333
            key_count += 1
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.
1334
        included_keys = start_set.intersection(result_parents)
1335
        start_set.difference_update(included_keys)
4214.2.5 by Andrew Bennetts
Fix the bug.
1336
        recipe = ('manual', start_set, stop_keys, key_count)
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1337
        body = self._serialise_search_recipe(recipe)
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1338
        path = self.bzrdir._path_for_remote_call(self._client)
1339
        for key in keys:
3360.2.8 by Martin Pool
Change assertion to a plain raise
1340
            if type(key) is not str:
1341
                raise ValueError(
1342
                    "key %r not a plain string" % (key,))
3172.5.8 by Robert Collins
Review feedback.
1343
        verb = 'Repository.get_parent_map'
4190.1.4 by Robert Collins
Cache ghosts when we can get them from a RemoteRepository in get_parent_map.
1344
        args = (path, 'include-missing:') + 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.
1345
        try:
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1346
            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.
1347
                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.
1348
        except errors.UnknownSmartMethod:
3213.1.2 by Andrew Bennetts
Add test for reconnection if get_parent_map is unknown by the server.
1349
            # 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.
1350
            # Worse, we have to force a disconnection, because the server now
1351
            # doesn't realise it has a body on the wire to consume, so the
1352
            # only way to recover is to abandon the connection.
3213.1.6 by Andrew Bennetts
Emit warnings when forcing a reconnect.
1353
            warning(
1354
                'Server is too old for fast get_parent_map, reconnecting.  '
1355
                '(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.
1356
            medium.disconnect()
1357
            # To avoid having to disconnect repeatedly, we keep track of the
1358
            # 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.
1359
            medium._remember_remote_is_before((1, 2))
3948.3.7 by Martin Pool
Updated tests for RemoteRepository.get_parent_map on old servers.
1360
            # Recurse just once and we should use the fallback code.
1361
            return self._get_parent_map_rpc(keys)
3245.4.58 by Andrew Bennetts
Unpack call_expecting_body's return value into variables, to avoid lots of ugly subscripting.
1362
        response_tuple, response_handler = response
1363
        if response_tuple[0] not in ['ok']:
1364
            response_handler.cancel_read_body()
1365
            raise errors.UnexpectedSmartServerResponse(response_tuple)
1366
        if response_tuple[0] == 'ok':
1367
            coded = bz2.decompress(response_handler.read_body_bytes())
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1368
            if coded == '':
1369
                # no revisions found
1370
                return {}
1371
            lines = coded.split('\n')
1372
            revision_graph = {}
1373
            for line in lines:
1374
                d = tuple(line.split())
1375
                if len(d) > 1:
1376
                    revision_graph[d[0]] = d[1:]
1377
                else:
4190.1.4 by Robert Collins
Cache ghosts when we can get them from a RemoteRepository in get_parent_map.
1378
                    # No parents:
1379
                    if d[0].startswith('missing:'):
1380
                        revid = d[0][8:]
1381
                        self._unstacked_provider.note_missing_key(revid)
1382
                    else:
1383
                        # no parents - so give the Graph result
1384
                        # (NULL_REVISION,).
1385
                        revision_graph[d[0]] = (NULL_REVISION,)
3172.5.6 by Robert Collins
Create new smart server verb Repository.get_parent_map.
1386
            return revision_graph
1387
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1388
    @needs_read_lock
1389
    def get_signature_text(self, revision_id):
1390
        self._ensure_real()
1391
        return self._real_repository.get_signature_text(revision_id)
1392
1393
    @needs_read_lock
1394
    def get_inventory_xml(self, revision_id):
1395
        self._ensure_real()
1396
        return self._real_repository.get_inventory_xml(revision_id)
1397
1398
    def deserialise_inventory(self, revision_id, xml):
1399
        self._ensure_real()
1400
        return self._real_repository.deserialise_inventory(revision_id, xml)
1401
1402
    def reconcile(self, other=None, thorough=False):
1403
        self._ensure_real()
1404
        return self._real_repository.reconcile(other=other, thorough=thorough)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1405
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1406
    def all_revision_ids(self):
1407
        self._ensure_real()
1408
        return self._real_repository.all_revision_ids()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1409
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1410
    @needs_read_lock
4137.3.2 by Ian Clatworthy
Repository.get_deltas_for_revisions() now supports file-id filtering
1411
    def get_deltas_for_revisions(self, revisions, specific_fileids=None):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1412
        self._ensure_real()
4137.3.2 by Ian Clatworthy
Repository.get_deltas_for_revisions() now supports file-id filtering
1413
        return self._real_repository.get_deltas_for_revisions(revisions,
1414
            specific_fileids=specific_fileids)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1415
1416
    @needs_read_lock
4137.3.2 by Ian Clatworthy
Repository.get_deltas_for_revisions() now supports file-id filtering
1417
    def get_revision_delta(self, revision_id, specific_fileids=None):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1418
        self._ensure_real()
4137.3.2 by Ian Clatworthy
Repository.get_deltas_for_revisions() now supports file-id filtering
1419
        return self._real_repository.get_revision_delta(revision_id,
1420
            specific_fileids=specific_fileids)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1421
1422
    @needs_read_lock
1423
    def revision_trees(self, revision_ids):
1424
        self._ensure_real()
1425
        return self._real_repository.revision_trees(revision_ids)
1426
1427
    @needs_read_lock
1428
    def get_revision_reconcile(self, revision_id):
1429
        self._ensure_real()
1430
        return self._real_repository.get_revision_reconcile(revision_id)
1431
1432
    @needs_read_lock
2745.6.36 by Andrew Bennetts
Deprecate revision_ids arg to Repository.check and other tweaks.
1433
    def check(self, revision_ids=None):
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1434
        self._ensure_real()
2745.6.36 by Andrew Bennetts
Deprecate revision_ids arg to Repository.check and other tweaks.
1435
        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.
1436
2018.5.138 by Robert Collins
Merge bzr.dev.
1437
    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.
1438
        self._ensure_real()
1439
        return self._real_repository.copy_content_into(
2018.5.138 by Robert Collins
Merge bzr.dev.
1440
            destination, revision_id=revision_id)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1441
2814.10.2 by Andrew Bennetts
Make the fallback a little tidier.
1442
    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.
1443
        # get a tarball of the remote repository, and copy from that into the
1444
        # destination
1445
        from bzrlib import osutils
2018.18.9 by Martin Pool
remote Repository.tarball builds a temporary directory and tars that
1446
        import tarfile
2018.18.20 by Martin Pool
Route branch operations through remote copy_content_into
1447
        # TODO: Maybe a progress bar while streaming the tarball?
1448
        note("Copying repository content as tarball...")
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1449
        tar_file = self._get_tarball('bz2')
2814.10.2 by Andrew Bennetts
Make the fallback a little tidier.
1450
        if tar_file is None:
1451
            return None
1452
        destination = to_bzrdir.create_repository()
2018.18.10 by Martin Pool
copy_content_into from Remote repositories by using temporary directories on both ends.
1453
        try:
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1454
            tar = tarfile.open('repository', fileobj=tar_file,
1455
                mode='r|bz2')
3638.3.2 by Vincent Ladeuil
Fix all calls to tempfile.mkdtemp to osutils.mkdtemp.
1456
            tmpdir = osutils.mkdtemp()
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1457
            try:
1458
                _extract_tar(tar, tmpdir)
1459
                tmp_bzrdir = BzrDir.open(tmpdir)
1460
                tmp_repo = tmp_bzrdir.open_repository()
1461
                tmp_repo.copy_content_into(destination, revision_id)
1462
            finally:
1463
                osutils.rmtree(tmpdir)
2018.18.10 by Martin Pool
copy_content_into from Remote repositories by using temporary directories on both ends.
1464
        finally:
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
1465
            tar_file.close()
2814.10.2 by Andrew Bennetts
Make the fallback a little tidier.
1466
        return destination
2018.18.23 by Martin Pool
review cleanups
1467
        # TODO: Suggestion from john: using external tar is much faster than
1468
        # 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.
1469
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1470
    @property
1471
    def inventories(self):
1472
        """Decorate the real repository for now.
1473
1474
        In the long term a full blown network facility is needed to
1475
        avoid creating a real repository object locally.
1476
        """
1477
        self._ensure_real()
1478
        return self._real_repository.inventories
1479
2604.2.1 by Robert Collins
(robertc) Introduce a pack command.
1480
    @needs_write_lock
1481
    def pack(self):
1482
        """Compress the data within the repository.
1483
1484
        This is not currently implemented within the smart server.
1485
        """
1486
        self._ensure_real()
1487
        return self._real_repository.pack()
1488
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1489
    @property
1490
    def revisions(self):
1491
        """Decorate the real repository for now.
1492
1493
        In the short term this should become a real object to intercept graph
1494
        lookups.
1495
1496
        In the long term a full blown network facility is needed.
1497
        """
1498
        self._ensure_real()
1499
        return self._real_repository.revisions
1500
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1501
    def set_make_working_trees(self, new_value):
4017.3.4 by Robert Collins
Create a verb for Repository.set_make_working_trees.
1502
        if new_value:
1503
            new_value_str = "True"
1504
        else:
1505
            new_value_str = "False"
1506
        path = self.bzrdir._path_for_remote_call(self._client)
1507
        try:
1508
            response = self._call(
1509
                'Repository.set_make_working_trees', path, new_value_str)
1510
        except errors.UnknownSmartMethod:
1511
            self._ensure_real()
1512
            self._real_repository.set_make_working_trees(new_value)
1513
        else:
1514
            if response[0] != 'ok':
1515
                raise errors.UnexpectedSmartServerResponse(response)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1516
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1517
    @property
1518
    def signatures(self):
1519
        """Decorate the real repository for now.
1520
1521
        In the long term a full blown network facility is needed to avoid
1522
        creating a real repository object locally.
1523
        """
1524
        self._ensure_real()
1525
        return self._real_repository.signatures
1526
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1527
    @needs_write_lock
1528
    def sign_revision(self, revision_id, gpg_strategy):
1529
        self._ensure_real()
1530
        return self._real_repository.sign_revision(revision_id, gpg_strategy)
1531
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1532
    @property
1533
    def texts(self):
1534
        """Decorate the real repository for now.
1535
1536
        In the long term a full blown network facility is needed to avoid
1537
        creating a real repository object locally.
1538
        """
1539
        self._ensure_real()
1540
        return self._real_repository.texts
1541
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1542
    @needs_read_lock
1543
    def get_revisions(self, revision_ids):
1544
        self._ensure_real()
1545
        return self._real_repository.get_revisions(revision_ids)
1546
1547
    def supports_rich_root(self):
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
1548
        return self._format.rich_root_data
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
1549
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
1550
    def iter_reverse_revision_history(self, revision_id):
1551
        self._ensure_real()
1552
        return self._real_repository.iter_reverse_revision_history(revision_id)
1553
2018.5.96 by Andrew Bennetts
Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's
1554
    @property
1555
    def _serializer(self):
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
1556
        return self._format._serializer
2018.5.96 by Andrew Bennetts
Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's
1557
2018.5.97 by Andrew Bennetts
Fix more tests.
1558
    def store_revision_signature(self, gpg_strategy, plaintext, revision_id):
1559
        self._ensure_real()
1560
        return self._real_repository.store_revision_signature(
1561
            gpg_strategy, plaintext, revision_id)
1562
2996.2.8 by Aaron Bentley
Fix add_signature discrepancies
1563
    def add_signature_text(self, revision_id, signature):
2996.2.3 by Aaron Bentley
Add tests for install_revisions and add_signature
1564
        self._ensure_real()
2996.2.8 by Aaron Bentley
Fix add_signature discrepancies
1565
        return self._real_repository.add_signature_text(revision_id, signature)
2996.2.3 by Aaron Bentley
Add tests for install_revisions and add_signature
1566
2018.5.97 by Andrew Bennetts
Fix more tests.
1567
    def has_signature_for_revision_id(self, revision_id):
1568
        self._ensure_real()
1569
        return self._real_repository.has_signature_for_revision_id(revision_id)
1570
2535.3.45 by Andrew Bennetts
Add item_keys_introduced_by to RemoteRepository.
1571
    def item_keys_introduced_by(self, revision_ids, _files_pb=None):
1572
        self._ensure_real()
1573
        return self._real_repository.item_keys_introduced_by(revision_ids,
1574
            _files_pb=_files_pb)
1575
2819.2.4 by Andrew Bennetts
Add a 'revision_graph_can_have_wrong_parents' method to repository.
1576
    def revision_graph_can_have_wrong_parents(self):
1577
        # The answer depends on the remote repo format.
1578
        self._ensure_real()
1579
        return self._real_repository.revision_graph_can_have_wrong_parents()
1580
2819.2.5 by Andrew Bennetts
Make reconcile abort gracefully if the revision index has bad parents.
1581
    def _find_inconsistent_revision_parents(self):
1582
        self._ensure_real()
1583
        return self._real_repository._find_inconsistent_revision_parents()
1584
1585
    def _check_for_inconsistent_revision_parents(self):
1586
        self._ensure_real()
1587
        return self._real_repository._check_for_inconsistent_revision_parents()
1588
3835.1.17 by Aaron Bentley
Fix stacking bug
1589
    def _make_parents_provider(self, other=None):
3835.1.8 by Aaron Bentley
Make UnstackedParentsProvider manage the cache
1590
        providers = [self._unstacked_provider]
3835.1.17 by Aaron Bentley
Fix stacking bug
1591
        if other is not None:
1592
            providers.insert(0, other)
3835.1.7 by Aaron Bentley
Updates from review
1593
        providers.extend(r._make_parents_provider() for r in
1594
                         self._fallback_repositories)
1595
        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.
1596
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1597
    def _serialise_search_recipe(self, recipe):
1598
        """Serialise a graph search recipe.
1599
1600
        :param recipe: A search recipe (start, stop, count).
1601
        :return: Serialised bytes.
1602
        """
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
1603
        start_keys = ' '.join(recipe[1])
1604
        stop_keys = ' '.join(recipe[2])
1605
        count = str(recipe[3])
3842.3.20 by Andrew Bennetts
Re-revert changes from another thread that accidentally got reinstated here.
1606
        return '\n'.join((start_keys, stop_keys, count))
1607
4070.9.5 by Andrew Bennetts
Better wire protocol: don't shoehorn MiniSearchResult serialisation into previous serialisation format.
1608
    def _serialise_search_result(self, search_result):
4070.9.14 by Andrew Bennetts
Tweaks requested by Robert's review.
1609
        if isinstance(search_result, graph.PendingAncestryResult):
1610
            parts = ['ancestry-of']
1611
            parts.extend(search_result.heads)
4070.9.5 by Andrew Bennetts
Better wire protocol: don't shoehorn MiniSearchResult serialisation into previous serialisation format.
1612
        else:
1613
            recipe = search_result.get_recipe()
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
1614
            parts = [recipe[0], self._serialise_search_recipe(recipe)]
4070.9.5 by Andrew Bennetts
Better wire protocol: don't shoehorn MiniSearchResult serialisation into previous serialisation format.
1615
        return '\n'.join(parts)
1616
3842.3.2 by Andrew Bennetts
Revert the RemoteVersionedFiles.get_parent_map implementation, leaving just the skeleton of RemoteVersionedFiles.
1617
    def autopack(self):
1618
        path = self.bzrdir._path_for_remote_call(self._client)
1619
        try:
1620
            response = self._call('PackRepository.autopack', path)
1621
        except errors.UnknownSmartMethod:
1622
            self._ensure_real()
1623
            self._real_repository._pack_collection.autopack()
1624
            return
4145.1.2 by Robert Collins
Add a refresh_data method on Repository allowing cleaner handling of insertions into RemoteRepository objects with _real_repository instances.
1625
        self.refresh_data()
3842.3.2 by Andrew Bennetts
Revert the RemoteVersionedFiles.get_parent_map implementation, leaving just the skeleton of RemoteVersionedFiles.
1626
        if response[0] != 'ok':
1627
            raise errors.UnexpectedSmartServerResponse(response)
1628
1629
4022.1.6 by Robert Collins
Cherrypick and polish the RemoteSink for streaming push.
1630
class RemoteStreamSink(repository.StreamSink):
1631
4032.3.7 by Robert Collins
Move write locking and write group responsibilities into the Sink objects themselves, allowing complete avoidance of unnecessary calls when the sink is a RemoteSink.
1632
    def _insert_real(self, stream, src_format, resume_tokens):
4022.1.6 by Robert Collins
Cherrypick and polish the RemoteSink for streaming push.
1633
        self.target_repo._ensure_real()
1634
        sink = self.target_repo._real_repository._get_sink()
4032.3.7 by Robert Collins
Move write locking and write group responsibilities into the Sink objects themselves, allowing complete avoidance of unnecessary calls when the sink is a RemoteSink.
1635
        result = sink.insert_stream(stream, src_format, resume_tokens)
4029.2.1 by Robert Collins
Support streaming push to stacked branches.
1636
        if not result:
1637
            self.target_repo.autopack()
1638
        return result
4022.1.6 by Robert Collins
Cherrypick and polish the RemoteSink for streaming push.
1639
4032.3.7 by Robert Collins
Move write locking and write group responsibilities into the Sink objects themselves, allowing complete avoidance of unnecessary calls when the sink is a RemoteSink.
1640
    def insert_stream(self, stream, src_format, resume_tokens):
4144.3.2 by Andrew Bennetts
Use Repository.insert_stream_locked if there is a lock_token for the remote repo.
1641
        target = self.target_repo
4307.2.4 by Robert Collins
Enable caching of negative revision lookups in RemoteRepository write locks when no _real_repository has been constructed.
1642
        target._unstacked_provider.missing_keys.clear()
4144.3.2 by Andrew Bennetts
Use Repository.insert_stream_locked if there is a lock_token for the remote repo.
1643
        if target._lock_token:
1644
            verb = 'Repository.insert_stream_locked'
1645
            extra_args = (target._lock_token or '',)
1646
            required_version = (1, 14)
1647
        else:
1648
            verb = 'Repository.insert_stream'
1649
            extra_args = ()
1650
            required_version = (1, 13)
1651
        client = target._client
4022.1.9 by Robert Collins
Fix critical issue in bzr.dev - pushing to an old bzr:// server fails because the stream being consumed before the fallback code occurs, which makes it fail to do the fetch. (Robert Collins, Andrew Bennetts, #332314)
1652
        medium = client._medium
4144.3.2 by Andrew Bennetts
Use Repository.insert_stream_locked if there is a lock_token for the remote repo.
1653
        if medium._is_remote_before(required_version):
4022.1.9 by Robert Collins
Fix critical issue in bzr.dev - pushing to an old bzr:// server fails because the stream being consumed before the fallback code occurs, which makes it fail to do the fetch. (Robert Collins, Andrew Bennetts, #332314)
1654
            # No possible way this can work.
4032.3.7 by Robert Collins
Move write locking and write group responsibilities into the Sink objects themselves, allowing complete avoidance of unnecessary calls when the sink is a RemoteSink.
1655
            return self._insert_real(stream, src_format, resume_tokens)
4144.3.2 by Andrew Bennetts
Use Repository.insert_stream_locked if there is a lock_token for the remote repo.
1656
        path = target.bzrdir._path_for_remote_call(client)
4032.3.7 by Robert Collins
Move write locking and write group responsibilities into the Sink objects themselves, allowing complete avoidance of unnecessary calls when the sink is a RemoteSink.
1657
        if not resume_tokens:
4029.2.1 by Robert Collins
Support streaming push to stacked branches.
1658
            # XXX: Ugly but important for correctness, *will* be fixed during
1659
            # 1.13 cycle. Pushing a stream that is interrupted results in a
1660
            # fallback to the _real_repositories sink *with a partial stream*.
1661
            # Thats bad because we insert less data than bzr expected. To avoid
1662
            # this we do a trial push to make sure the verb is accessible, and
1663
            # do not fallback when actually pushing the stream. A cleanup patch
1664
            # is going to look at rewinding/restarting the stream/partial
1665
            # buffering etc.
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
1666
            byte_stream = smart_repo._stream_to_byte_stream([], src_format)
4029.2.1 by Robert Collins
Support streaming push to stacked branches.
1667
            try:
1668
                response = client.call_with_body_stream(
4144.3.2 by Andrew Bennetts
Use Repository.insert_stream_locked if there is a lock_token for the remote repo.
1669
                    (verb, path, '') + extra_args, byte_stream)
4029.2.1 by Robert Collins
Support streaming push to stacked branches.
1670
            except errors.UnknownSmartMethod:
4144.3.2 by Andrew Bennetts
Use Repository.insert_stream_locked if there is a lock_token for the remote repo.
1671
                medium._remember_remote_is_before(required_version)
4032.3.7 by Robert Collins
Move write locking and write group responsibilities into the Sink objects themselves, allowing complete avoidance of unnecessary calls when the sink is a RemoteSink.
1672
                return self._insert_real(stream, src_format, resume_tokens)
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
1673
        byte_stream = smart_repo._stream_to_byte_stream(
1674
            stream, src_format)
4032.3.7 by Robert Collins
Move write locking and write group responsibilities into the Sink objects themselves, allowing complete avoidance of unnecessary calls when the sink is a RemoteSink.
1675
        resume_tokens = ' '.join(resume_tokens)
4022.1.9 by Robert Collins
Fix critical issue in bzr.dev - pushing to an old bzr:// server fails because the stream being consumed before the fallback code occurs, which makes it fail to do the fetch. (Robert Collins, Andrew Bennetts, #332314)
1676
        response = client.call_with_body_stream(
4144.3.2 by Andrew Bennetts
Use Repository.insert_stream_locked if there is a lock_token for the remote repo.
1677
            (verb, path, resume_tokens) + extra_args, byte_stream)
4029.2.1 by Robert Collins
Support streaming push to stacked branches.
1678
        if response[0][0] not in ('ok', 'missing-basis'):
4022.1.9 by Robert Collins
Fix critical issue in bzr.dev - pushing to an old bzr:// server fails because the stream being consumed before the fallback code occurs, which makes it fail to do the fetch. (Robert Collins, Andrew Bennetts, #332314)
1679
            raise errors.UnexpectedSmartServerResponse(response)
4029.2.1 by Robert Collins
Support streaming push to stacked branches.
1680
        if response[0][0] == 'missing-basis':
1681
            tokens, missing_keys = bencode.bdecode_as_tuple(response[0][1])
4032.3.7 by Robert Collins
Move write locking and write group responsibilities into the Sink objects themselves, allowing complete avoidance of unnecessary calls when the sink is a RemoteSink.
1682
            resume_tokens = tokens
4257.3.3 by Andrew Bennetts
missing_keys from sink.insert_stream should be a set, not a tuple.
1683
            return resume_tokens, set(missing_keys)
4029.2.1 by Robert Collins
Support streaming push to stacked branches.
1684
        else:
4145.1.2 by Robert Collins
Add a refresh_data method on Repository allowing cleaner handling of insertions into RemoteRepository objects with _real_repository instances.
1685
            self.target_repo.refresh_data()
4032.3.7 by Robert Collins
Move write locking and write group responsibilities into the Sink objects themselves, allowing complete avoidance of unnecessary calls when the sink is a RemoteSink.
1686
            return [], set()
4032.1.1 by John Arbash Meinel
Merge the removal of all trailing whitespace, and resolve conflicts.
1687
4022.1.1 by Robert Collins
Refactoring of fetch to have a sender and sink component enabling splitting the logic over a network stream. (Robert Collins, Andrew Bennetts)
1688
4060.1.3 by Robert Collins
Implement the separate source component for fetch - repository.StreamSource.
1689
class RemoteStreamSource(repository.StreamSource):
1690
    """Stream data from a remote server."""
1691
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
1692
    def get_stream(self, search):
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
1693
        if (self.from_repository._fallback_repositories and
1694
            self.to_format._fetch_order == 'topological'):
1695
            return self._real_stream(self.from_repository, search)
1696
        return self.missing_parents_chain(search, [self.from_repository] +
1697
            self.from_repository._fallback_repositories)
1698
1699
    def _real_stream(self, repo, search):
1700
        """Get a stream for search from repo.
1701
        
1702
        This never called RemoteStreamSource.get_stream, and is a heler
1703
        for RemoteStreamSource._get_stream to allow getting a stream 
1704
        reliably whether fallback back because of old servers or trying
1705
        to stream from a non-RemoteRepository (which the stacked support
1706
        code will do).
1707
        """
1708
        source = repo._get_source(self.to_format)
1709
        if isinstance(source, RemoteStreamSource):
1710
            return repository.StreamSource.get_stream(source, search)
1711
        return source.get_stream(search)
1712
1713
    def _get_stream(self, repo, search):
1714
        """Core worker to get a stream from repo for search.
1715
1716
        This is used by both get_stream and the stacking support logic. It
1717
        deliberately gets a stream for repo which does not need to be
1718
        self.from_repository. In the event that repo is not Remote, or
1719
        cannot do a smart stream, a fallback is made to the generic
1720
        repository._get_stream() interface, via self._real_stream.
1721
1722
        In the event of stacking, streams from _get_stream will not
1723
        contain all the data for search - this is normal (see get_stream).
1724
1725
        :param repo: A repository.
1726
        :param search: A search.
1727
        """
1728
        # Fallbacks may be non-smart
1729
        if not isinstance(repo, RemoteRepository):
1730
            return self._real_stream(repo, search)
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
1731
        client = repo._client
1732
        medium = client._medium
1733
        if medium._is_remote_before((1, 13)):
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
1734
            # streaming was added in 1.13
1735
            return self._real_stream(repo, search)
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
1736
        path = repo.bzrdir._path_for_remote_call(client)
1737
        try:
4070.9.5 by Andrew Bennetts
Better wire protocol: don't shoehorn MiniSearchResult serialisation into previous serialisation format.
1738
            search_bytes = repo._serialise_search_result(search)
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
1739
            response = repo._call_with_body_bytes_expecting_body(
4060.1.5 by Robert Collins
Verb change name requested by Andrew.
1740
                'Repository.get_stream',
4070.9.5 by Andrew Bennetts
Better wire protocol: don't shoehorn MiniSearchResult serialisation into previous serialisation format.
1741
                (path, self.to_format.network_name()), search_bytes)
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
1742
            response_tuple, response_handler = response
1743
        except errors.UnknownSmartMethod:
1744
            medium._remember_remote_is_before((1,13))
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
1745
            return self._real_stream(repo, search)
4060.1.4 by Robert Collins
Streaming fetch from remote servers.
1746
        if response_tuple[0] != 'ok':
1747
            raise errors.UnexpectedSmartServerResponse(response_tuple)
1748
        byte_stream = response_handler.read_streamed_body()
1749
        src_format, stream = smart_repo._byte_stream_to_stream(byte_stream)
1750
        if src_format.network_name() != repo._format.network_name():
1751
            raise AssertionError(
1752
                "Mismatched RemoteRepository and stream src %r, %r" % (
1753
                src_format.network_name(), repo._format.network_name()))
1754
        return stream
1755
4152.1.2 by Robert Collins
Add streaming from a stacked branch when the sort order is compatible with doing so.
1756
    def missing_parents_chain(self, search, sources):
1757
        """Chain multiple streams together to handle stacking.
1758
1759
        :param search: The overall search to satisfy with streams.
1760
        :param sources: A list of Repository objects to query.
1761
        """
1762
        self.serialiser = self.to_format._serializer
1763
        self.seen_revs = set()
1764
        self.referenced_revs = set()
1765
        # If there are heads in the search, or the key count is > 0, we are not
1766
        # done.
1767
        while not search.is_empty() and len(sources) > 1:
1768
            source = sources.pop(0)
1769
            stream = self._get_stream(source, search)
1770
            for kind, substream in stream:
1771
                if kind != 'revisions':
1772
                    yield kind, substream
1773
                else:
1774
                    yield kind, self.missing_parents_rev_handler(substream)
1775
            search = search.refine(self.seen_revs, self.referenced_revs)
1776
            self.seen_revs = set()
1777
            self.referenced_revs = set()
1778
        if not search.is_empty():
1779
            for kind, stream in self._get_stream(sources[0], search):
1780
                yield kind, stream
1781
1782
    def missing_parents_rev_handler(self, substream):
1783
        for content in substream:
1784
            revision_bytes = content.get_bytes_as('fulltext')
1785
            revision = self.serialiser.read_revision_from_string(revision_bytes)
1786
            self.seen_revs.add(content.key[-1])
1787
            self.referenced_revs.update(revision.parent_ids)
1788
            yield content
1789
4060.1.3 by Robert Collins
Implement the separate source component for fetch - repository.StreamSource.
1790
2018.5.127 by Andrew Bennetts
Fix most of the lockable_files tests for RemoteBranchLockableFiles.
1791
class RemoteBranchLockableFiles(LockableFiles):
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
1792
    """A 'LockableFiles' implementation that talks to a smart server.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1793
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
1794
    This is not a public interface class.
1795
    """
1796
1797
    def __init__(self, bzrdir, _client):
1798
        self.bzrdir = bzrdir
1799
        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.
1800
        self._need_find_modes = True
2018.5.133 by Andrew Bennetts
All TestLockableFiles_RemoteLockDir tests passing.
1801
        LockableFiles.__init__(
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1802
            self, bzrdir.get_branch_transport(None),
2018.5.133 by Andrew Bennetts
All TestLockableFiles_RemoteLockDir tests passing.
1803
            'lock', lockdir.LockDir)
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
1804
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.
1805
    def _find_modes(self):
1806
        # RemoteBranches don't let the client set the mode of control files.
1807
        self._dir_mode = None
1808
        self._file_mode = None
1809
2018.5.59 by Robert Collins
Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).
1810
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1811
class RemoteBranchFormat(branch.BranchFormat):
1812
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1813
    def __init__(self, network_name=None):
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.
1814
        super(RemoteBranchFormat, self).__init__()
1815
        self._matchingbzrdir = RemoteBzrDirFormat()
1816
        self._matchingbzrdir.set_branch_format(self)
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1817
        self._custom_format = None
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1818
        self._network_name = network_name
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.
1819
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.
1820
    def __eq__(self, other):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1821
        return (isinstance(other, RemoteBranchFormat) and
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.
1822
            self.__dict__ == other.__dict__)
1823
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1824
    def _ensure_real(self):
1825
        if self._custom_format is None:
1826
            self._custom_format = branch.network_format_registry.get(
1827
                self._network_name)
1828
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
1829
    def get_format_description(self):
1830
        return 'Remote BZR Branch'
1831
4032.3.1 by Robert Collins
Add a BranchFormat.network_name() method as preparation for creating branches via RPC calls.
1832
    def network_name(self):
1833
        return self._network_name
1834
4160.2.6 by Andrew Bennetts
Add ignore_fallbacks flag.
1835
    def open(self, a_bzrdir, ignore_fallbacks=False):
1836
        return a_bzrdir.open_branch(ignore_fallbacks=ignore_fallbacks)
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1837
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1838
    def _vfs_initialize(self, a_bzrdir):
1839
        # Initialisation when using a local bzrdir object, or a non-vfs init
1840
        # method is not available on the server.
1841
        # self._custom_format is always set - the start of initialize ensures
1842
        # that.
1843
        if isinstance(a_bzrdir, RemoteBzrDir):
1844
            a_bzrdir._ensure_real()
1845
            result = self._custom_format.initialize(a_bzrdir._real_bzrdir)
1846
        else:
1847
            # We assume the bzrdir is parameterised; it may not be.
1848
            result = self._custom_format.initialize(a_bzrdir)
1849
        if (isinstance(a_bzrdir, RemoteBzrDir) and
1850
            not isinstance(result, RemoteBranch)):
1851
            result = RemoteBranch(a_bzrdir, a_bzrdir.find_repository(), result)
1852
        return result
1853
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
1854
    def initialize(self, a_bzrdir):
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1855
        # 1) get the network name to use.
1856
        if self._custom_format:
1857
            network_name = self._custom_format.network_name()
1858
        else:
1859
            # Select the current bzrlib default and ask for that.
1860
            reference_bzrdir_format = bzrdir.format_registry.get('default')()
1861
            reference_format = reference_bzrdir_format.get_branch_format()
1862
            self._custom_format = reference_format
1863
            network_name = reference_format.network_name()
1864
        # Being asked to create on a non RemoteBzrDir:
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
        if not isinstance(a_bzrdir, RemoteBzrDir):
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1866
            return self._vfs_initialize(a_bzrdir)
1867
        medium = a_bzrdir._client._medium
1868
        if medium._is_remote_before((1, 13)):
1869
            return self._vfs_initialize(a_bzrdir)
1870
        # Creating on a remote bzr dir.
1871
        # 2) try direct creation via RPC
1872
        path = a_bzrdir._path_for_remote_call(a_bzrdir._client)
1873
        verb = 'BzrDir.create_branch'
1874
        try:
1875
            response = a_bzrdir._call(verb, path, network_name)
1876
        except errors.UnknownSmartMethod:
1877
            # Fallback - use vfs methods
4094.1.1 by Andrew Bennetts
Add some medium._remember_is_before((1, 13)) calls.
1878
            medium._remember_remote_is_before((1, 13))
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1879
            return self._vfs_initialize(a_bzrdir)
1880
        if response[0] != 'ok':
1881
            raise errors.UnexpectedSmartServerResponse(response)
1882
        # Turn the response into a RemoteRepository object.
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1883
        format = RemoteBranchFormat(network_name=response[1])
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1884
        repo_format = response_tuple_to_repo_format(response[3:])
1885
        if response[2] == '':
1886
            repo_bzrdir = 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.
1887
        else:
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1888
            repo_bzrdir = RemoteBzrDir(
1889
                a_bzrdir.root_transport.clone(response[2]), a_bzrdir._format,
1890
                a_bzrdir._client)
1891
        remote_repo = RemoteRepository(repo_bzrdir, repo_format)
1892
        remote_branch = RemoteBranch(a_bzrdir, remote_repo,
1893
            format=format, setup_stacking=False)
4044.1.4 by Robert Collins
Remove a wasted round trip determining the revno and revid of a newly created branch.
1894
        # XXX: We know this is a new branch, so it must have revno 0, revid
1895
        # NULL_REVISION. Creating the branch locked would make this be unable
1896
        # to be wrong; here its simply very unlikely to be wrong. RBC 20090225
1897
        remote_branch._last_revision_info_cache = 0, NULL_REVISION
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1898
        return remote_branch
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1899
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1900
    def make_tags(self, branch):
1901
        self._ensure_real()
1902
        return self._custom_format.make_tags(branch)
1903
2696.3.6 by Martin Pool
Mark RemoteBranch as (possibly) supporting tags
1904
    def supports_tags(self):
1905
        # Remote branches might support tags, but we won't know until we
1906
        # access the real remote branch.
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1907
        self._ensure_real()
1908
        return self._custom_format.supports_tags()
2696.3.6 by Martin Pool
Mark RemoteBranch as (possibly) supporting tags
1909
4103.2.2 by Andrew Bennetts
Fix RemoteBranchFormat.supports_stacking()
1910
    def supports_stacking(self):
1911
        self._ensure_real()
1912
        return self._custom_format.supports_stacking()
1913
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1914
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
1915
class RemoteBranch(branch.Branch, _RpcHelper):
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
1916
    """Branch stored on a server accessed by HPSS RPC.
1917
1918
    At the moment most operations are mapped down to simple file operations.
1919
    """
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
1920
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
1921
    def __init__(self, remote_bzrdir, remote_repository, real_branch=None,
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1922
        _client=None, format=None, setup_stacking=True):
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
1923
        """Create a RemoteBranch instance.
1924
1925
        :param real_branch: An optional local implementation of the branch
1926
            format, usually accessing the data via the VFS.
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
1927
        :param _client: Private parameter for testing.
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1928
        :param format: A RemoteBranchFormat object, None to create one
1929
            automatically. If supplied it should have a network_name already
1930
            supplied.
1931
        :param setup_stacking: If True make an RPC call to determine the
1932
            stacked (or not) status of the branch. If False assume the branch
1933
            is not stacked.
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
1934
        """
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
1935
        # We intentionally don't call the parent class's __init__, because it
1936
        # will try to assign to self.tags, which is a property in this subclass.
1937
        # And the parent's __init__ doesn't do much anyway.
1752.2.64 by Andrew Bennetts
Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.
1938
        self.bzrdir = remote_bzrdir
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
1939
        if _client is not None:
1940
            self._client = _client
1941
        else:
3313.2.1 by Andrew Bennetts
Change _SmartClient's API to accept a medium and a base, rather than a _SharedConnection.
1942
            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.
1943
        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.
1944
        if real_branch is not None:
1945
            self._real_branch = real_branch
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1946
            # Give the remote repository the matching real repo.
2018.5.97 by Andrew Bennetts
Fix more tests.
1947
            real_repo = self._real_branch.repository
1948
            if isinstance(real_repo, RemoteRepository):
1949
                real_repo._ensure_real()
1950
                real_repo = real_repo._real_repository
1951
            self.repository._set_real_repository(real_repo)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1952
            # Give the branch the remote repository to let fast-pathing happen.
1953
            self._real_branch.repository = self.repository
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
1954
        else:
1955
            self._real_branch = None
4031.3.3 by Matt Nordhoff
Review tweaks from Ben Finney
1956
        # Fill out expected attributes of branch for bzrlib API users.
4419.2.2 by Andrew Bennetts
Read lock branch_from in cmd_pull, avoids refetching last_revision_info and so reduces test_pull acceptance ratchet.
1957
        self._clear_cached_state()
2018.5.55 by Robert Collins
Give RemoteBranch a base url in line with the Branch protocol.
1958
        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.
1959
        self._control_files = None
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1960
        self._lock_mode = None
1961
        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.
1962
        self._repo_lock_token = None
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
1963
        self._lock_count = 0
1964
        self._leave_lock = False
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1965
        # Setup a format: note that we cannot call _ensure_real until all the
1966
        # attributes above are set: This code cannot be moved higher up in this
1967
        # function.
1968
        if format is None:
1969
            self._format = RemoteBranchFormat()
1970
            if real_branch is not None:
1971
                self._format._network_name = \
1972
                    self._real_branch._format.network_name()
4032.3.1 by Robert Collins
Add a BranchFormat.network_name() method as preparation for creating branches via RPC calls.
1973
        else:
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1974
            self._format = format
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
1975
        if not self._format._network_name:
1976
            # Did not get from open_branchV2 - old server.
1977
            self._ensure_real()
1978
            self._format._network_name = \
1979
                self._real_branch._format.network_name()
1980
        self.tags = self._format.make_tags(self)
3681.1.2 by Robert Collins
Adjust for trunk.
1981
        # 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)
1982
        hooks = branch.Branch.hooks['open']
1983
        for hook in hooks:
1984
            hook(self)
4419.1.3 by Andrew Bennetts
Quick fix by using self._ensure_real.
1985
        self._is_stacked = False
4032.3.2 by Robert Collins
Create and use a RPC call to create branches on bzr servers rather than using VFS calls.
1986
        if setup_stacking:
1987
            self._setup_stacking()
3691.2.1 by Martin Pool
RemoteBranch must configure stacking into the repository
1988
1989
    def _setup_stacking(self):
1990
        # 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
1991
        # the vfs branch.
3691.2.1 by Martin Pool
RemoteBranch must configure stacking into the repository
1992
        try:
1993
            fallback_url = self.get_stacked_on_url()
1994
        except (errors.NotStacked, errors.UnstackableBranchFormat,
1995
            errors.UnstackableRepositoryFormat), e:
3691.2.7 by Martin Pool
FakeClient can know what calls to expect
1996
            return
4419.1.3 by Andrew Bennetts
Quick fix by using self._ensure_real.
1997
        self._is_stacked = True
4379.2.2 by John Arbash Meinel
Change the Repository.add_fallback_repository() contract slightly.
1998
        self._activate_fallback_location(fallback_url)
1752.2.64 by Andrew Bennetts
Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.
1999
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
2000
    def _get_config(self):
2001
        return RemoteBranchConfig(self)
2002
3407.2.17 by Martin Pool
better name: _get_real_transport
2003
    def _get_real_transport(self):
3407.2.16 by Martin Pool
Remove RemoteBranch reliance on control_files._transport
2004
        # if we try vfs access, return the real branch's vfs transport
2005
        self._ensure_real()
2006
        return self._real_branch._transport
2007
3407.2.17 by Martin Pool
better name: _get_real_transport
2008
    _transport = property(_get_real_transport)
3407.2.16 by Martin Pool
Remove RemoteBranch reliance on control_files._transport
2009
2477.1.1 by Martin Pool
Add RemoteBranch repr
2010
    def __str__(self):
2011
        return "%s(%s)" % (self.__class__.__name__, self.base)
2012
2013
    __repr__ = __str__
2014
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
2015
    def _ensure_real(self):
2016
        """Ensure that there is a _real_branch set.
2017
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
2018
        Used before calls to self._real_branch.
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
2019
        """
3407.2.16 by Martin Pool
Remove RemoteBranch reliance on control_files._transport
2020
        if self._real_branch is None:
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
2021
            if not vfs.vfs_enabled():
2022
                raise AssertionError('smart server vfs must be enabled '
2023
                    'to use vfs implementation')
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
2024
            self.bzrdir._ensure_real()
2025
            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.
2026
            if self.repository._real_repository is None:
2027
                # Give the remote repository the matching real repo.
2028
                real_repo = self._real_branch.repository
2029
                if isinstance(real_repo, RemoteRepository):
2030
                    real_repo._ensure_real()
2031
                    real_repo = real_repo._real_repository
2032
                self.repository._set_real_repository(real_repo)
2033
            # Give the real branch the remote repository to let fast-pathing
2034
            # happen.
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
2035
            self._real_branch.repository = self.repository
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
2036
            if self._lock_mode == 'r':
2037
                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.
2038
            elif self._lock_mode == 'w':
2039
                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.
2040
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
2041
    def _translate_error(self, err, **context):
2042
        self.repository._translate_error(err, branch=self, **context)
2043
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
2044
    def _clear_cached_state(self):
2045
        super(RemoteBranch, self)._clear_cached_state()
3441.5.5 by Andrew Bennetts
Some small tweaks and comments.
2046
        if self._real_branch is not None:
2047
            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.
2048
2049
    def _clear_cached_state_of_remote_branch_only(self):
2050
        """Like _clear_cached_state, but doesn't clear the cache of
2051
        self._real_branch.
2052
2053
        This is useful when falling back to calling a method of
2054
        self._real_branch that changes state.  In that case the underlying
2055
        branch changes, so we need to invalidate this RemoteBranch's cache of
2056
        it.  However, there's no need to invalidate the _real_branch's cache
2057
        too, in fact doing so might harm performance.
2058
        """
2059
        super(RemoteBranch, self)._clear_cached_state()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2060
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.
2061
    @property
2062
    def control_files(self):
2063
        # Defer actually creating RemoteBranchLockableFiles until its needed,
2064
        # because it triggers an _ensure_real that we otherwise might not need.
2065
        if self._control_files is None:
2066
            self._control_files = RemoteBranchLockableFiles(
2067
                self.bzrdir, self._client)
2068
        return self._control_files
2069
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
2070
    def _get_checkout_format(self):
2071
        self._ensure_real()
2072
        return self._real_branch._get_checkout_format()
2073
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
2074
    def get_physical_lock_status(self):
2075
        """See Branch.get_physical_lock_status()."""
2076
        # 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.
2077
        self._ensure_real()
2018.5.60 by Robert Collins
More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.
2078
        return self._real_branch.get_physical_lock_status()
2079
3537.3.1 by Martin Pool
Rename branch.get_stacked_on to get_stacked_on_url
2080
    def get_stacked_on_url(self):
3221.11.2 by Robert Collins
Create basic stackable branch facility.
2081
        """Get the URL this branch is stacked against.
2082
2083
        :raises NotStacked: If the branch is not stacked.
2084
        :raises UnstackableBranchFormat: If the branch does not support
2085
            stacking.
2086
        :raises UnstackableRepositoryFormat: If the repository does not support
2087
            stacking.
2088
        """
3691.2.12 by Martin Pool
Add test for coping without Branch.get_stacked_on_url
2089
        try:
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2090
            # there may not be a repository yet, so we can't use
2091
            # 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
2092
            response = self._client.call('Branch.get_stacked_on_url',
2093
                self._remote_path())
2094
        except errors.ErrorFromSmartServer, err:
2095
            # there may not be a repository yet, so we can't call through
2096
            # its _translate_error
2097
            _translate_error(err, branch=self)
2098
        except errors.UnknownSmartMethod, err:
2099
            self._ensure_real()
2100
            return self._real_branch.get_stacked_on_url()
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2101
        if response[0] != 'ok':
2102
            raise errors.UnexpectedSmartServerResponse(response)
2103
        return response[1]
3221.11.2 by Robert Collins
Create basic stackable branch facility.
2104
4419.1.3 by Andrew Bennetts
Quick fix by using self._ensure_real.
2105
    def set_stacked_on_url(self, url):
2106
        branch.Branch.set_stacked_on_url(self, url)
2107
        if not url:
2108
            self._is_stacked = False
2109
        else:
2110
            self._is_stacked = True
2111
        
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
2112
    def _vfs_get_tags_bytes(self):
2113
        self._ensure_real()
2114
        return self._real_branch._get_tags_bytes()
2115
2116
    def _get_tags_bytes(self):
2117
        medium = self._client._medium
2118
        if medium._is_remote_before((1, 13)):
2119
            return self._vfs_get_tags_bytes()
2120
        try:
2121
            response = self._call('Branch.get_tags_bytes', self._remote_path())
2122
        except errors.UnknownSmartMethod:
4094.1.1 by Andrew Bennetts
Add some medium._remember_is_before((1, 13)) calls.
2123
            medium._remember_remote_is_before((1, 13))
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
2124
            return self._vfs_get_tags_bytes()
2125
        return response[0]
2126
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
2127
    def lock_read(self):
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
2128
        self.repository.lock_read()
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
2129
        if not self._lock_mode:
2130
            self._lock_mode = 'r'
2131
            self._lock_count = 1
2132
            if self._real_branch is not None:
2133
                self._real_branch.lock_read()
2134
        else:
2135
            self._lock_count += 1
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
2136
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).
2137
    def _remote_lock_write(self, token):
2138
        if token is None:
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2139
            branch_token = repo_token = ''
2140
        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).
2141
            branch_token = token
2142
            repo_token = self.repository.lock_write()
2143
            self.repository.unlock()
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2144
        err_context = {'token': token}
2145
        response = self._call(
2146
            'Branch.lock_write', self._remote_path(), branch_token,
2147
            repo_token or '', **err_context)
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
2148
        if response[0] != 'ok':
2555.1.1 by Martin Pool
Remove use of 'assert False' to raise an exception unconditionally
2149
            raise errors.UnexpectedSmartServerResponse(response)
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
2150
        ok, branch_token, repo_token = response
2151
        return branch_token, repo_token
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2152
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).
2153
    def lock_write(self, token=None):
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2154
        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.
2155
            # 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).
2156
            remote_tokens = self._remote_lock_write(token)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2157
            self._lock_token, self._repo_lock_token = remote_tokens
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
2158
            if not self._lock_token:
2159
                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.
2160
            # 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.
2161
            self.repository.lock_write(
2162
                self._repo_lock_token, _skip_rpc=True)
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
2163
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2164
            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.
2165
                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).
2166
            if token is not None:
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2167
                self._leave_lock = True
2168
            else:
2169
                self._leave_lock = False
2170
            self._lock_mode = 'w'
2171
            self._lock_count = 1
2172
        elif self._lock_mode == 'r':
2173
            raise errors.ReadOnlyTransaction
2174
        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).
2175
            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.
2176
                # A token was given to lock_write, and we're relocking, so
2177
                # check that the given token actually matches the one we
2178
                # 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).
2179
                if token != self._lock_token:
2180
                    raise errors.TokenMismatch(token, self._lock_token)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2181
            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.
2182
            # Re-lock the repository too.
3692.1.2 by Andrew Bennetts
Fix regression introduced by fix, and add a test for that regression.
2183
            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.
2184
        return self._lock_token or None
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2185
4084.2.1 by Robert Collins
Make accessing a branch.tags.get_tag_dict use a smart[er] method rather than VFS calls and real objects.
2186
    def _set_tags_bytes(self, bytes):
2187
        self._ensure_real()
2188
        return self._real_branch._set_tags_bytes(bytes)
2189
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2190
    def _unlock(self, branch_token, repo_token):
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2191
        err_context = {'token': str((branch_token, repo_token))}
2192
        response = self._call(
2193
            'Branch.unlock', self._remote_path(), branch_token,
2194
            repo_token or '', **err_context)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2195
        if response == ('ok',):
2196
            return
3245.4.24 by Andrew Bennetts
Consistently raise errors from the server as ErrorFromSmartServer exceptions.
2197
        raise errors.UnexpectedSmartServerResponse(response)
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
2198
2199
    def unlock(self):
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
2200
        try:
2201
            self._lock_count -= 1
2202
            if not self._lock_count:
2203
                self._clear_cached_state()
2204
                mode = self._lock_mode
2205
                self._lock_mode = None
2206
                if self._real_branch is not None:
2207
                    if (not self._leave_lock and mode == 'w' and
2208
                        self._repo_lock_token):
2209
                        # If this RemoteBranch will remove the physical lock
2210
                        # for the repository, make sure the _real_branch
2211
                        # doesn't do it first.  (Because the _real_branch's
2212
                        # repository is set to be the RemoteRepository.)
2213
                        self._real_branch.repository.leave_lock_in_place()
2214
                    self._real_branch.unlock()
2215
                if mode != 'w':
2216
                    # Only write-locked branched need to make a remote method
4031.3.1 by Frank Aspell
Fixing various typos
2217
                    # call to perform the unlock.
3692.1.1 by Andrew Bennetts
Make RemoteBranch.lock_write lock the repository too.
2218
                    return
2219
                if not self._lock_token:
2220
                    raise AssertionError('Locked, but no token!')
2221
                branch_token = self._lock_token
2222
                repo_token = self._repo_lock_token
2223
                self._lock_token = None
2224
                self._repo_lock_token = None
2225
                if not self._leave_lock:
2226
                    self._unlock(branch_token, repo_token)
2227
        finally:
2228
            self.repository.unlock()
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
2229
2230
    def break_lock(self):
2018.5.70 by Robert Collins
Only try to get real repositories when an operation requires them.
2231
        self._ensure_real()
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
2232
        return self._real_branch.break_lock()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
2233
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2234
    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.
2235
        if not self._lock_token:
2236
            raise NotImplementedError(self.leave_lock_in_place)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2237
        self._leave_lock = True
2238
2239
    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.
2240
        if not self._lock_token:
3015.2.15 by Robert Collins
Review feedback.
2241
            raise NotImplementedError(self.dont_leave_lock_in_place)
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
2242
        self._leave_lock = False
2243
4419.2.4 by Andrew Bennetts
Add Repository.get_rev_id_for_revno RPC, removes VFS calls from 'pull -r 123' case.
2244
    def get_rev_id(self, revno, history=None):
2245
        last_revision_info = self.last_revision_info()
2246
        result = last_revision_info
2247
        for repo in [self.repository] + self.repository._fallback_repositories:
4419.2.5 by Andrew Bennetts
Add Repository.get_rev_id_for_revno, and use it both as the _ensure_real fallback and as the server-side implementation.
2248
            ok, result = repo.get_rev_id_for_revno(revno, result)
4419.2.4 by Andrew Bennetts
Add Repository.get_rev_id_for_revno RPC, removes VFS calls from 'pull -r 123' case.
2249
            if ok:
2250
                return result
2251
        closest = result[1]
2252
        missing_parent = self.repository.get_parent_map([closest])[closest][0]
2253
        raise errors.RevisionNotPresent(missing_parent, self.repository)
2254
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
2255
    def _last_revision_info(self):
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2256
        response = self._call('Branch.last_revision_info', self._remote_path())
3376.2.4 by Martin Pool
Remove every assert statement from bzrlib!
2257
        if response[0] != 'ok':
2258
            raise SmartProtocolError('unexpected response code %s' % (response,))
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
2259
        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.
2260
        last_revision = response[2]
2018.5.51 by Wouter van Heyst
Test and implement RemoteBranch.last_revision_info()
2261
        return (revno, last_revision)
2262
2018.5.105 by Andrew Bennetts
Implement revision_history caching for RemoteBranch.
2263
    def _gen_revision_history(self):
2264
        """See Branch._gen_revision_history()."""
4419.1.3 by Andrew Bennetts
Quick fix by using self._ensure_real.
2265
        if self._is_stacked:
2266
            self._ensure_real()
2267
            return self._real_branch._gen_revision_history()
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2268
        response_tuple, response_handler = self._call_expecting_body(
3691.2.3 by Martin Pool
Factor out RemoteBranch._remote_path() and disable RemoteBranch stacking
2269
            '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.
2270
        if response_tuple[0] != 'ok':
3452.2.2 by Andrew Bennetts
Experimental PackRepository.{check_references,autopack} RPCs.
2271
            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.
2272
        result = response_handler.read_body_bytes().split('\x00')
2018.5.38 by Robert Collins
Implement RemoteBranch.revision_history().
2273
        if result == ['']:
2274
            return []
2275
        return result
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
2276
3691.2.3 by Martin Pool
Factor out RemoteBranch._remote_path() and disable RemoteBranch stacking
2277
    def _remote_path(self):
2278
        return self.bzrdir._path_for_remote_call(self._client)
2279
3441.5.18 by Andrew Bennetts
Fix some test failures.
2280
    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.
2281
            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.
2282
        # This performs additional work to meet the hook contract; while its
2283
        # undesirable, we have to synthesise the revno to call the hook, and
2284
        # not calling the hook is worse as it means changes can't be prevented.
2285
        # Having calculated this though, we can't just call into
2286
        # set_last_revision_info as a simple call, because there is a set_rh
2287
        # hook that some folk may still be using.
2288
        old_revno, old_revid = self.last_revision_info()
2289
        history = self._lefthand_history(revision_id)
2290
        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.
2291
        err_context = {'other_branch': other_branch}
2292
        response = self._call('Branch.set_last_revision_ex',
2293
            self._remote_path(), self._lock_token, self._repo_lock_token,
2294
            revision_id, int(allow_diverged), int(allow_overwrite_descendant),
2295
            **err_context)
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
2296
        self._clear_cached_state()
3441.5.18 by Andrew Bennetts
Fix some test failures.
2297
        if len(response) != 3 and response[0] != 'ok':
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
2298
            raise errors.UnexpectedSmartServerResponse(response)
3441.5.18 by Andrew Bennetts
Fix some test failures.
2299
        new_revno, new_revision_id = response[1:]
2300
        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.
2301
        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.
2302
        if self._real_branch is not None:
2303
            cache = new_revno, new_revision_id
2304
            self._real_branch._last_revision_info_cache = cache
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
2305
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
2306
    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.
2307
        old_revno, old_revid = self.last_revision_info()
2308
        # This performs additional work to meet the hook contract; while its
2309
        # undesirable, we have to synthesise the revno to call the hook, and
2310
        # not calling the hook is worse as it means changes can't be prevented.
2311
        # Having calculated this though, we can't just call into
2312
        # set_last_revision_info as a simple call, because there is a set_rh
2313
        # hook that some folk may still be using.
2314
        history = self._lefthand_history(revision_id)
2315
        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.
2316
        self._clear_cached_state()
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2317
        response = self._call('Branch.set_last_revision',
2318
            self._remote_path(), self._lock_token, self._repo_lock_token,
2319
            revision_id)
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
2320
        if response != ('ok',):
2321
            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.
2322
        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.
2323
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
2324
    @needs_write_lock
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
2325
    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.
2326
        # Send just the tip revision of the history; the server will generate
2327
        # the full history from that.  If the revision doesn't exist in this
2328
        # branch, NoSuchRevision will be raised.
2329
        if rev_history == []:
2018.5.170 by Andrew Bennetts
Use 'null:' instead of '' to mean NULL_REVISION on the wire.
2330
            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.
2331
        else:
2332
            rev_id = rev_history[-1]
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
2333
        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.
2334
        for hook in branch.Branch.hooks['set_rh']:
2335
            hook(self, rev_history)
2018.5.105 by Andrew Bennetts
Implement revision_history caching for RemoteBranch.
2336
        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.
2337
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
2338
    def _get_parent_location(self):
2339
        medium = self._client._medium
2340
        if medium._is_remote_before((1, 13)):
2341
            return self._vfs_get_parent_location()
2342
        try:
4083.1.4 by Andrew Bennetts
Fix trivial bug in get_parent RPC.
2343
            response = self._call('Branch.get_parent', self._remote_path())
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
2344
        except errors.UnknownSmartMethod:
4094.1.1 by Andrew Bennetts
Add some medium._remember_is_before((1, 13)) calls.
2345
            medium._remember_remote_is_before((1, 13))
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
2346
            return self._vfs_get_parent_location()
4083.1.4 by Andrew Bennetts
Fix trivial bug in get_parent RPC.
2347
        if len(response) != 1:
4083.1.6 by Andrew Bennetts
Fix trivial bug in my trivial bug fix :)
2348
            raise errors.UnexpectedSmartServerResponse(response)
4083.1.4 by Andrew Bennetts
Fix trivial bug in get_parent RPC.
2349
        parent_location = response[0]
2350
        if parent_location == '':
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
2351
            return None
4083.1.4 by Andrew Bennetts
Fix trivial bug in get_parent RPC.
2352
        return parent_location
4078.2.1 by Robert Collins
Add a Branch.get_parent remote call for RemoteBranch.
2353
2354
    def _vfs_get_parent_location(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.
2355
        self._ensure_real()
4083.1.5 by Andrew Bennetts
Fix trivial bug in get_parent RPC.
2356
        return self._real_branch._get_parent_location()
4032.1.1 by John Arbash Meinel
Merge the removal of all trailing whitespace, and resolve conflicts.
2357
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.
2358
    def _set_parent_location(self, url):
4288.1.7 by Robert Collins
Add new remote server verb Branch.set_parent_location, dropping roundtrips further on push operations.
2359
        medium = self._client._medium
2360
        if medium._is_remote_before((1, 15)):
2361
            return self._vfs_set_parent_location(url)
2362
        try:
2363
            call_url = url or ''
2364
            if type(call_url) is not str:
2365
                raise AssertionError('url must be a str or None (%s)' % url)
2366
            response = self._call('Branch.set_parent_location',
2367
                self._remote_path(), self._lock_token, self._repo_lock_token,
2368
                call_url)
2369
        except errors.UnknownSmartMethod:
2370
            medium._remember_remote_is_before((1, 15))
2371
            return self._vfs_set_parent_location(url)
2372
        if response != ():
2373
            raise errors.UnexpectedSmartServerResponse(response)
2374
2375
    def _vfs_set_parent_location(self, url):
4288.1.4 by Robert Collins
Remove the explicit set_parent method on RemoteBranch in favour of inheriting from Branch.
2376
        self._ensure_real()
2377
        return self._real_branch._set_parent_location(url)
4032.1.1 by John Arbash Meinel
Merge the removal of all trailing whitespace, and resolve conflicts.
2378
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
2379
    @needs_write_lock
2477.1.2 by Martin Pool
Rename push/pull back to 'run_hooks' (jameinel)
2380
    def pull(self, source, overwrite=False, stop_revision=None,
2477.1.9 by Martin Pool
Review cleanups from John, mostly docs
2381
             **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.
2382
        self._clear_cached_state_of_remote_branch_only()
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
2383
        self._ensure_real()
3482.1.1 by John Arbash Meinel
Fix bug #238149, RemoteBranch.pull needs to return the _real_branch's pull result.
2384
        return self._real_branch.pull(
2477.1.2 by Martin Pool
Rename push/pull back to 'run_hooks' (jameinel)
2385
            source, overwrite=overwrite, stop_revision=stop_revision,
3489.2.4 by Andrew Bennetts
Fix all tests broken by fixing make_branch_and_tree.
2386
            _override_hook_target=self, **kwargs)
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
2387
2018.14.3 by Andrew Bennetts
Make a couple more branch_implementations tests pass.
2388
    @needs_read_lock
2389
    def push(self, target, overwrite=False, stop_revision=None):
2390
        self._ensure_real()
2018.5.97 by Andrew Bennetts
Fix more tests.
2391
        return self._real_branch.push(
2477.1.5 by Martin Pool
More cleanups of Branch.push to get the right behaviour with RemoteBranches
2392
            target, overwrite=overwrite, stop_revision=stop_revision,
2393
            _override_hook_source_branch=self)
2018.14.3 by Andrew Bennetts
Make a couple more branch_implementations tests pass.
2394
2395
    def is_locked(self):
2396
        return self._lock_count >= 1
2397
3634.2.1 by John Arbash Meinel
Thunk over to the real branch's revision_id_to_revno.
2398
    @needs_read_lock
2399
    def revision_id_to_revno(self, revision_id):
2400
        self._ensure_real()
2401
        return self._real_branch.revision_id_to_revno(revision_id)
2402
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
2403
    @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.
2404
    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.
2405
        # XXX: These should be returned by the set_last_revision_info verb
2406
        old_revno, old_revid = self.last_revision_info()
2407
        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.
2408
        revision_id = ensure_null(revision_id)
3297.4.2 by Andrew Bennetts
Add backwards compatibility for servers older than 1.4.
2409
        try:
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2410
            response = self._call('Branch.set_last_revision_info',
2411
                self._remote_path(), self._lock_token, self._repo_lock_token,
2412
                str(revno), revision_id)
3297.4.2 by Andrew Bennetts
Add backwards compatibility for servers older than 1.4.
2413
        except errors.UnknownSmartMethod:
2414
            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.
2415
            self._clear_cached_state_of_remote_branch_only()
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
2416
            self._real_branch.set_last_revision_info(revno, revision_id)
2417
            self._last_revision_info_cache = revno, revision_id
2418
            return
2892.2.1 by Andrew Bennetts
Add Branch.set_last_revision_info smart method, and make the RemoteBranch client use it.
2419
        if response == ('ok',):
2420
            self._clear_cached_state()
3441.5.1 by Andrew Bennetts
Avoid necessarily calling get_parent_map when pushing.
2421
            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.
2422
            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.
2423
            # Update the _real_branch's cache too.
2424
            if self._real_branch is not None:
2425
                cache = self._last_revision_info_cache
2426
                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.
2427
        else:
2428
            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.
2429
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.
2430
    @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.
2431
    def generate_revision_history(self, revision_id, last_rev=None,
2432
                                  other_branch=None):
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
2433
        medium = self._client._medium
3441.5.23 by Andrew Bennetts
Fix test failures.
2434
        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.
2435
            # 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.
2436
            try:
3441.5.18 by Andrew Bennetts
Fix some test failures.
2437
                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.
2438
                    allow_diverged=True, allow_overwrite_descendant=True)
3441.5.6 by Andrew Bennetts
Greatly simplify RemoteBranch.update_revisions. Still needs more tests.
2439
                return
3441.5.18 by Andrew Bennetts
Fix some test failures.
2440
            except errors.UnknownSmartMethod:
3441.5.23 by Andrew Bennetts
Fix test failures.
2441
                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.
2442
        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.
2443
        self.set_revision_history(self._lefthand_history(revision_id,
2444
            last_rev=last_rev,other_branch=other_branch))
2018.5.96 by Andrew Bennetts
Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's
2445
2018.5.97 by Andrew Bennetts
Fix more tests.
2446
    def set_push_location(self, location):
2447
        self._ensure_real()
2448
        return self._real_branch.set_push_location(location)
2449
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
2450
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2451
class RemoteConfig(object):
2452
    """A Config that reads and writes from smart verbs.
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
2453
2454
    It is a low-level object that considers config data to be name/value pairs
2455
    that may be associated with a section. Assigning meaning to the these
2456
    values is done at higher levels like bzrlib.config.TreeConfig.
2457
    """
2458
2459
    def get_option(self, name, section=None, default=None):
2460
        """Return the value associated with a named option.
2461
2462
        :param name: The name of the value
2463
        :param section: The section the option is in (if any)
2464
        :param default: The value to return if the value is not set
2465
        :return: The value or default value
2466
        """
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2467
        try:
2468
            configobj = self._get_configobj()
2469
            if section is None:
2470
                section_obj = configobj
2471
            else:
2472
                try:
2473
                    section_obj = configobj[section]
2474
                except KeyError:
2475
                    return default
2476
            return section_obj.get(name, default)
2477
        except errors.UnknownSmartMethod:
2478
            return self._vfs_get_option(name, section, default)
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
2479
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2480
    def _response_to_configobj(self, response):
4288.1.2 by Robert Collins
Create a server verb for doing BzrDir.get_config()
2481
        if len(response[0]) and response[0][0] != 'ok':
4288.1.4 by Robert Collins
Remove the explicit set_parent method on RemoteBranch in favour of inheriting from Branch.
2482
            raise errors.UnexpectedSmartServerResponse(response)
4241.5.1 by Matt Nordhoff
Fix Branch.get_config_file smart verb on multi-line config files. (Bug #354075)
2483
        lines = response[1].read_body_bytes().splitlines()
2484
        return config.ConfigObj(lines, encoding='utf-8')
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
2485
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2486
2487
class RemoteBranchConfig(RemoteConfig):
2488
    """A RemoteConfig for Branches."""
2489
2490
    def __init__(self, branch):
2491
        self._branch = branch
2492
2493
    def _get_configobj(self):
2494
        path = self._branch._remote_path()
2495
        response = self._branch._client.call_expecting_body(
2496
            'Branch.get_config_file', path)
2497
        return self._response_to_configobj(response)
2498
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
2499
    def set_option(self, value, name, section=None):
2500
        """Set the value associated with a named option.
2501
2502
        :param value: The value to set
2503
        :param name: The name of the value to set
2504
        :param section: The section the option is in (if any)
2505
        """
4226.2.1 by Robert Collins
Set branch config options via a smart method.
2506
        medium = self._branch._client._medium
2507
        if medium._is_remote_before((1, 14)):
2508
            return self._vfs_set_option(value, name, section)
2509
        try:
2510
            path = self._branch._remote_path()
2511
            response = self._branch._client.call('Branch.set_config_option',
2512
                path, self._branch._lock_token, self._branch._repo_lock_token,
4226.2.2 by Robert Collins
Fix setting config options to support unicode values and don't attempt to reset repositories _fallback_repositories as the simple approach fails to work.
2513
                value.encode('utf8'), name, section or '')
4226.2.1 by Robert Collins
Set branch config options via a smart method.
2514
        except errors.UnknownSmartMethod:
2515
            medium._remember_remote_is_before((1, 14))
2516
            return self._vfs_set_option(value, name, section)
2517
        if response != ():
2518
            raise errors.UnexpectedSmartServerResponse(response)
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
2519
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2520
    def _real_object(self):
2521
        self._branch._ensure_real()
2522
        return self._branch._real_branch
2523
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
2524
    def _vfs_set_option(self, value, name, section=None):
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2525
        return self._real_object()._get_config().set_option(
2526
            value, name, section)
2527
2528
2529
class RemoteBzrDirConfig(RemoteConfig):
2530
    """A RemoteConfig for BzrDirs."""
2531
2532
    def __init__(self, bzrdir):
2533
        self._bzrdir = bzrdir
2534
2535
    def _get_configobj(self):
4288.1.4 by Robert Collins
Remove the explicit set_parent method on RemoteBranch in favour of inheriting from Branch.
2536
        medium = self._bzrdir._client._medium
2537
        verb = 'BzrDir.get_config_file'
2538
        if medium._is_remote_before((1, 15)):
2539
            raise errors.UnknownSmartMethod(verb)
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2540
        path = self._bzrdir._path_for_remote_call(self._bzrdir._client)
2541
        response = self._bzrdir._call_expecting_body(
4288.1.4 by Robert Collins
Remove the explicit set_parent method on RemoteBranch in favour of inheriting from Branch.
2542
            verb, path)
4288.1.1 by Robert Collins
Add support for a RemoteBzrDirConfig to support optimising push operations which need to look for default stacking locations.
2543
        return self._response_to_configobj(response)
2544
2545
    def _vfs_get_option(self, name, section, default):
2546
        return self._real_object()._get_config().get_option(
2547
            name, section, default)
2548
2549
    def set_option(self, value, name, section=None):
2550
        """Set the value associated with a named option.
2551
2552
        :param value: The value to set
2553
        :param name: The name of the value to set
2554
        :param section: The section the option is in (if any)
2555
        """
2556
        return self._real_object()._get_config().set_option(
2557
            value, name, section)
2558
2559
    def _real_object(self):
2560
        self._bzrdir._ensure_real()
2561
        return self._bzrdir._real_bzrdir
2562
4226.1.5 by Robert Collins
Reinstate the use of the Branch.get_config_file verb.
2563
2564
2018.18.25 by Martin Pool
Repository.tarball fixes for python2.4
2565
def _extract_tar(tar, to_dir):
2566
    """Extract all the contents of a tarfile object.
2567
2568
    A replacement for extractall, which is not present in python2.4
2569
    """
2570
    for tarinfo in tar:
2571
        tar.extract(tarinfo, to_dir)
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
2572
2573
2574
def _translate_error(err, **context):
2575
    """Translate an ErrorFromSmartServer into a more useful error.
2576
2577
    Possible context keys:
2578
      - branch
2579
      - repository
2580
      - bzrdir
2581
      - token
2582
      - other_branch
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2583
      - path
3690.1.1 by Andrew Bennetts
Unexpected error responses from a smart server no longer cause the client to traceback.
2584
2585
    If the error from the server doesn't match a known pattern, then
3690.1.2 by Andrew Bennetts
Rename UntranslateableErrorFromSmartServer -> UnknownErrorFromSmartServer.
2586
    UnknownErrorFromSmartServer is raised.
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
2587
    """
2588
    def find(name):
3533.3.4 by Andrew Bennetts
Add tests for _translate_error's robustness.
2589
        try:
2590
            return context[name]
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2591
        except KeyError, key_err:
2592
            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.
2593
            raise err
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2594
    def get_path():
3779.3.3 by Andrew Bennetts
Add a docstring.
2595
        """Get the path from the context if present, otherwise use first error
2596
        arg.
2597
        """
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2598
        try:
2599
            return context['path']
2600
        except KeyError, key_err:
2601
            try:
2602
                return err.error_args[0]
2603
            except IndexError, idx_err:
2604
                mutter(
2605
                    'Missing key %r in context %r', key_err.args[0], context)
2606
                raise err
2607
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
2608
    if err.error_verb == 'NoSuchRevision':
2609
        raise NoSuchRevision(find('branch'), err.error_args[0])
2610
    elif err.error_verb == 'nosuchrevision':
2611
        raise NoSuchRevision(find('repository'), err.error_args[0])
2612
    elif err.error_tuple == ('nobranch',):
3533.3.4 by Andrew Bennetts
Add tests for _translate_error's robustness.
2613
        raise errors.NotBranchError(path=find('bzrdir').root_transport.base)
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
2614
    elif err.error_verb == 'norepository':
2615
        raise errors.NoRepositoryPresent(find('bzrdir'))
2616
    elif err.error_verb == 'LockContention':
2617
        raise errors.LockContention('(remote lock)')
2618
    elif err.error_verb == 'UnlockableTransport':
3533.3.4 by Andrew Bennetts
Add tests for _translate_error's robustness.
2619
        raise errors.UnlockableTransport(find('bzrdir').root_transport)
3533.3.1 by Andrew Bennetts
Remove duplication of error translation in bzrlib/remote.py.
2620
    elif err.error_verb == 'LockFailed':
2621
        raise errors.LockFailed(err.error_args[0], err.error_args[1])
2622
    elif err.error_verb == 'TokenMismatch':
2623
        raise errors.TokenMismatch(find('token'), '(remote token)')
2624
    elif err.error_verb == 'Diverged':
2625
        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.
2626
    elif err.error_verb == 'TipChangeRejected':
2627
        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
2628
    elif err.error_verb == 'UnstackableBranchFormat':
2629
        raise errors.UnstackableBranchFormat(*err.error_args)
2630
    elif err.error_verb == 'UnstackableRepositoryFormat':
2631
        raise errors.UnstackableRepositoryFormat(*err.error_args)
2632
    elif err.error_verb == 'NotStacked':
2633
        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.
2634
    elif err.error_verb == 'PermissionDenied':
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2635
        path = get_path()
3779.3.1 by Andrew Bennetts
Move encoding/decoding logic of PermissionDenied and ReadError so that it happens for all RPCs.
2636
        if len(err.error_args) >= 2:
2637
            extra = err.error_args[1]
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2638
        else:
2639
            extra = None
3779.3.1 by Andrew Bennetts
Move encoding/decoding logic of PermissionDenied and ReadError so that it happens for all RPCs.
2640
        raise errors.PermissionDenied(path, extra=extra)
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2641
    elif err.error_verb == 'ReadError':
2642
        path = get_path()
2643
        raise errors.ReadError(path)
2644
    elif err.error_verb == 'NoSuchFile':
2645
        path = get_path()
2646
        raise errors.NoSuchFile(path)
2647
    elif err.error_verb == 'FileExists':
2648
        raise errors.FileExists(err.error_args[0])
2649
    elif err.error_verb == 'DirectoryNotEmpty':
2650
        raise errors.DirectoryNotEmpty(err.error_args[0])
2651
    elif err.error_verb == 'ShortReadvError':
2652
        args = err.error_args
2653
        raise errors.ShortReadvError(
2654
            args[0], int(args[1]), int(args[2]), int(args[3]))
2655
    elif err.error_verb in ('UnicodeEncodeError', 'UnicodeDecodeError'):
2656
        encoding = str(err.error_args[0]) # encoding must always be a string
2657
        val = err.error_args[1]
2658
        start = int(err.error_args[2])
2659
        end = int(err.error_args[3])
2660
        reason = str(err.error_args[4]) # reason must always be a string
2661
        if val.startswith('u:'):
2662
            val = val[2:].decode('utf-8')
2663
        elif val.startswith('s:'):
2664
            val = val[2:].decode('base64')
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2665
        if err.error_verb == 'UnicodeDecodeError':
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2666
            raise UnicodeDecodeError(encoding, val, start, end, reason)
3786.2.3 by Andrew Bennetts
Remove duplicated 'call & translate errors' code in bzrlib.remote.
2667
        elif err.error_verb == 'UnicodeEncodeError':
3779.3.2 by Andrew Bennetts
Unify error translation done in bzrlib.remote and bzrlib.transport.remote.
2668
            raise UnicodeEncodeError(encoding, val, start, end, reason)
2669
    elif err.error_verb == 'ReadOnlyError':
2670
        raise errors.TransportNotPossible('readonly transport')
3690.1.2 by Andrew Bennetts
Rename UntranslateableErrorFromSmartServer -> UnknownErrorFromSmartServer.
2671
    raise errors.UnknownErrorFromSmartServer(err)