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