bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
1  | 
# Copyright (C) 2006, 2007 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  | 
||
| 
2018.5.59
by Robert Collins
 Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).  | 
20  | 
from cStringIO import StringIO  | 
| 
1752.2.30
by Martin Pool
 Start adding a RemoteBzrDir, etc  | 
21  | 
|
| 
2018.5.127
by Andrew Bennetts
 Fix most of the lockable_files tests for RemoteBranchLockableFiles.  | 
22  | 
from bzrlib import branch, errors, lockdir, repository  | 
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
23  | 
from bzrlib.branch import BranchReferenceFormat  | 
| 
2018.5.174
by Andrew Bennetts
 Various nits discovered by pyflakes.  | 
24  | 
from bzrlib.bzrdir import BzrDir, RemoteBzrDirFormat  | 
| 
2018.14.2
by Andrew Bennetts
 All but one repository_implementation tests for RemoteRepository passing.  | 
25  | 
from bzrlib.config import BranchConfig, TreeConfig  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
26  | 
from bzrlib.decorators import needs_read_lock, needs_write_lock  | 
| 
2018.5.67
by Wouter van Heyst
 Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)  | 
27  | 
from bzrlib.errors import NoSuchRevision  | 
| 
2018.5.127
by Andrew Bennetts
 Fix most of the lockable_files tests for RemoteBranchLockableFiles.  | 
28  | 
from bzrlib.lockable_files import LockableFiles  | 
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
29  | 
from bzrlib.revision import NULL_REVISION  | 
| 
2018.6.1
by Robert Collins
 Implement a BzrDir.open_branch smart server method for opening a branch without VFS.  | 
30  | 
from bzrlib.smart import client, vfs  | 
| 
1752.2.30
by Martin Pool
 Start adding a RemoteBzrDir, etc  | 
31  | 
|
| 
2018.5.25
by Andrew Bennetts
 Make sure RemoteBzrDirFormat is always registered (John Arbash Meinel, Robert Collins, Andrew Bennetts).  | 
32  | 
# Note: RemoteBzrDirFormat is in bzrdir.py
 | 
| 
1752.2.30
by Martin Pool
 Start adding a RemoteBzrDir, etc  | 
33  | 
|
34  | 
class RemoteBzrDir(BzrDir):  | 
|
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
35  | 
"""Control directory on a remote server, accessed via bzr:// or similar."""  | 
| 
1752.2.30
by Martin Pool
 Start adding a RemoteBzrDir, etc  | 
36  | 
|
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
37  | 
def __init__(self, transport, _client=None):  | 
38  | 
"""Construct a RemoteBzrDir.  | 
|
39  | 
||
40  | 
        :param _client: Private parameter for testing. Disables probing and the
 | 
|
41  | 
            use of a real bzrdir.
 | 
|
42  | 
        """
 | 
|
| 
1752.2.39
by Martin Pool
 [broken] implement upgrade apis on remote bzrdirs  | 
43  | 
BzrDir.__init__(self, transport, RemoteBzrDirFormat())  | 
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
44  | 
        # this object holds a delegated bzrdir that uses file-level operations
 | 
45  | 
        # to talk to the other side
 | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
46  | 
self._real_bzrdir = None  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
47  | 
|
48  | 
if _client is None:  | 
|
49  | 
self._medium = transport.get_smart_client()  | 
|
| 
2018.5.159
by Andrew Bennetts
 Rename SmartClient to _SmartClient.  | 
50  | 
self._client = client._SmartClient(self._medium)  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
51  | 
else:  | 
52  | 
self._client = _client  | 
|
53  | 
self._medium = None  | 
|
54  | 
            return
 | 
|
55  | 
||
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
56  | 
self._ensure_real()  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
57  | 
path = self._path_for_remote_call(self._client)  | 
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
58  | 
response = self._client.call('BzrDir.open', path)  | 
59  | 
if response not in [('yes',), ('no',)]:  | 
|
60  | 
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.  | 
61  | 
if response == ('no',):  | 
62  | 
raise errors.NotBranchError(path=transport.base)  | 
|
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
63  | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
64  | 
def _ensure_real(self):  | 
65  | 
"""Ensure that there is a _real_bzrdir set.  | 
|
66  | 
||
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
67  | 
        Used before calls to self._real_bzrdir.
 | 
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
68  | 
        """
 | 
69  | 
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.  | 
70  | 
self._real_bzrdir = BzrDir.open_from_transport(  | 
71  | 
self.root_transport, _server_formats=False)  | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
72  | 
|
| 
1752.2.39
by Martin Pool
 [broken] implement upgrade apis on remote bzrdirs  | 
73  | 
def create_repository(self, shared=False):  | 
| 
2018.5.162
by Andrew Bennetts
 Add some missing _ensure_real calls, and a missing import.  | 
74  | 
self._ensure_real()  | 
| 
2018.5.118
by Robert Collins
 Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.  | 
75  | 
self._real_bzrdir.create_repository(shared=shared)  | 
76  | 
return self.open_repository()  | 
|
| 
1752.2.50
by Andrew Bennetts
 Implement RemoteBzrDir.create_{branch,workingtree}  | 
77  | 
|
78  | 
def create_branch(self):  | 
|
| 
2018.5.162
by Andrew Bennetts
 Add some missing _ensure_real calls, and a missing import.  | 
79  | 
self._ensure_real()  | 
| 
1752.2.72
by Andrew Bennetts
 Make Remote* classes in remote.py more consistent and remove some dead code.  | 
80  | 
real_branch = self._real_bzrdir.create_branch()  | 
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
81  | 
return RemoteBranch(self, self.find_repository(), real_branch)  | 
| 
1752.2.50
by Andrew Bennetts
 Implement RemoteBzrDir.create_{branch,workingtree}  | 
82  | 
|
83  | 
def create_workingtree(self, revision_id=None):  | 
|
| 
2018.5.174
by Andrew Bennetts
 Various nits discovered by pyflakes.  | 
84  | 
raise errors.NotLocalUrl(self.transport.base)  | 
| 
1752.2.39
by Martin Pool
 [broken] implement upgrade apis on remote bzrdirs  | 
85  | 
|
| 
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.  | 
86  | 
def find_branch_format(self):  | 
87  | 
"""Find the branch 'format' for this bzrdir.  | 
|
88  | 
||
89  | 
        This might be a synthetic object for e.g. RemoteBranch and SVN.
 | 
|
90  | 
        """
 | 
|
91  | 
b = self.open_branch()  | 
|
92  | 
return b._format  | 
|
93  | 
||
| 
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.  | 
94  | 
def get_branch_reference(self):  | 
95  | 
"""See BzrDir.get_branch_reference()."""  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
96  | 
path = self._path_for_remote_call(self._client)  | 
97  | 
response = self._client.call('BzrDir.open_branch', path)  | 
|
98  | 
if response[0] == 'ok':  | 
|
99  | 
if response[1] == '':  | 
|
100  | 
                # 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.  | 
101  | 
return None  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
102  | 
else:  | 
103  | 
                # 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.  | 
104  | 
return response[1]  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
105  | 
elif response == ('nobranch',):  | 
| 
2018.6.1
by Robert Collins
 Implement a BzrDir.open_branch smart server method for opening a branch without VFS.  | 
106  | 
raise errors.NotBranchError(path=self.root_transport.base)  | 
107  | 
else:  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
108  | 
assert False, 'unexpected response code %r' % (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.  | 
109  | 
|
110  | 
def open_branch(self, _unsupported=False):  | 
|
111  | 
assert _unsupported == False, 'unsupported flag support not implemented yet.'  | 
|
112  | 
reference_url = self.get_branch_reference()  | 
|
113  | 
if reference_url is None:  | 
|
114  | 
            # branch at this location.
 | 
|
115  | 
return RemoteBranch(self, self.find_repository())  | 
|
116  | 
else:  | 
|
117  | 
            # a branch reference, use the existing BranchReference logic.
 | 
|
118  | 
format = BranchReferenceFormat()  | 
|
119  | 
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.  | 
120  | 
|
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
121  | 
def open_repository(self):  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
122  | 
path = self._path_for_remote_call(self._client)  | 
123  | 
response = self._client.call('BzrDir.find_repository', path)  | 
|
| 
2018.5.42
by Robert Collins
 Various hopefully improvements, but wsgi is broken, handing over to spiv :).  | 
124  | 
assert response[0] in ('ok', 'norepository'), \  | 
| 
2018.5.52
by Wouter van Heyst
 Provide more information when encountering unexpected responses from a smart  | 
125  | 
'unexpected response code %s' % (response,)  | 
| 
2018.5.42
by Robert Collins
 Various hopefully improvements, but wsgi is broken, handing over to spiv :).  | 
126  | 
if response[0] == 'norepository':  | 
127  | 
raise errors.NoRepositoryPresent(self)  | 
|
| 
2018.5.118
by Robert Collins
 Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.  | 
128  | 
assert len(response) == 4, '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.  | 
129  | 
if response[1] == '':  | 
| 
2018.5.118
by Robert Collins
 Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.  | 
130  | 
format = RemoteRepositoryFormat()  | 
| 
2018.5.166
by Andrew Bennetts
 Small changes in response to Aaron's review.  | 
131  | 
format.rich_root_data = (response[2] == 'yes')  | 
132  | 
format.supports_tree_reference = (response[3] == 'yes')  | 
|
| 
2018.5.118
by Robert Collins
 Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.  | 
133  | 
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.  | 
134  | 
else:  | 
135  | 
raise errors.NoRepositoryPresent(self)  | 
|
| 
1752.2.30
by Martin Pool
 Start adding a RemoteBzrDir, etc  | 
136  | 
|
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
137  | 
def open_workingtree(self, recommend_upgrade=True):  | 
| 
2445.1.1
by Andrew Bennetts
 Make RemoteBzrDir.open_workingtree raise NoWorkingTree rather than NotLocalUrl  | 
138  | 
self._ensure_real()  | 
139  | 
if self._real_bzrdir.has_workingtree():  | 
|
140  | 
raise errors.NotLocalUrl(self.root_transport)  | 
|
141  | 
else:  | 
|
142  | 
raise errors.NoWorkingTree(self.root_transport.base)  | 
|
| 
1752.2.50
by Andrew Bennetts
 Implement RemoteBzrDir.create_{branch,workingtree}  | 
143  | 
|
| 
2018.5.42
by Robert Collins
 Various hopefully improvements, but wsgi is broken, handing over to spiv :).  | 
144  | 
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.  | 
145  | 
"""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 :).  | 
146  | 
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.  | 
147  | 
|
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
148  | 
def get_branch_transport(self, branch_format):  | 
| 
2018.5.162
by Andrew Bennetts
 Add some missing _ensure_real calls, and a missing import.  | 
149  | 
self._ensure_real()  | 
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
150  | 
return self._real_bzrdir.get_branch_transport(branch_format)  | 
151  | 
||
| 
1752.2.43
by Andrew Bennetts
 Fix get_{branch,repository,workingtree}_transport.  | 
152  | 
def get_repository_transport(self, repository_format):  | 
| 
2018.5.162
by Andrew Bennetts
 Add some missing _ensure_real calls, and a missing import.  | 
153  | 
self._ensure_real()  | 
| 
1752.2.43
by Andrew Bennetts
 Fix get_{branch,repository,workingtree}_transport.  | 
154  | 
return self._real_bzrdir.get_repository_transport(repository_format)  | 
155  | 
||
156  | 
def get_workingtree_transport(self, workingtree_format):  | 
|
| 
2018.5.162
by Andrew Bennetts
 Add some missing _ensure_real calls, and a missing import.  | 
157  | 
self._ensure_real()  | 
| 
1752.2.43
by Andrew Bennetts
 Fix get_{branch,repository,workingtree}_transport.  | 
158  | 
return self._real_bzrdir.get_workingtree_transport(workingtree_format)  | 
159  | 
||
| 
1752.2.39
by Martin Pool
 [broken] implement upgrade apis on remote bzrdirs  | 
160  | 
def can_convert_format(self):  | 
161  | 
"""Upgrading of remote bzrdirs is not supported yet."""  | 
|
162  | 
return False  | 
|
163  | 
||
164  | 
def needs_format_conversion(self, format=None):  | 
|
165  | 
"""Upgrading of remote bzrdirs is not supported yet."""  | 
|
166  | 
return False  | 
|
167  | 
||
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
168  | 
def clone(self, url, revision_id=None, force_new_repo=False):  | 
| 
2018.5.94
by Andrew Bennetts
 Various small changes in aid of making tests pass (including deleting one invalid test).  | 
169  | 
self._ensure_real()  | 
170  | 
return self._real_bzrdir.clone(url, revision_id=revision_id,  | 
|
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
171  | 
force_new_repo=force_new_repo)  | 
| 
2018.5.94
by Andrew Bennetts
 Various small changes in aid of making tests pass (including deleting one invalid test).  | 
172  | 
|
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
173  | 
|
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
174  | 
class RemoteRepositoryFormat(repository.RepositoryFormat):  | 
| 
2018.5.159
by Andrew Bennetts
 Rename SmartClient to _SmartClient.  | 
175  | 
"""Format for repositories accessed over a _SmartClient.  | 
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
176  | 
|
| 
1752.2.50
by Andrew Bennetts
 Implement RemoteBzrDir.create_{branch,workingtree}  | 
177  | 
    Instances of this repository are represented by RemoteRepository
 | 
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
178  | 
    instances.
 | 
| 
2018.5.118
by Robert Collins
 Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.  | 
179  | 
|
180  | 
    The RemoteRepositoryFormat is parameterised during construction
 | 
|
181  | 
    to reflect the capabilities of the real, remote format. Specifically
 | 
|
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
182  | 
    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.  | 
183  | 
    on a per instance basis, and are not set (and should not be) at
 | 
184  | 
    the class level.
 | 
|
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
185  | 
    """
 | 
186  | 
||
187  | 
_matchingbzrdir = RemoteBzrDirFormat  | 
|
188  | 
||
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
189  | 
def initialize(self, a_bzrdir, shared=False):  | 
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
190  | 
assert isinstance(a_bzrdir, RemoteBzrDir), \  | 
191  | 
'%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.  | 
192  | 
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.  | 
193  | 
|
194  | 
def open(self, a_bzrdir):  | 
|
| 
1752.2.72
by Andrew Bennetts
 Make Remote* classes in remote.py more consistent and remove some dead code.  | 
195  | 
assert isinstance(a_bzrdir, RemoteBzrDir)  | 
196  | 
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.  | 
197  | 
|
198  | 
def get_format_description(self):  | 
|
199  | 
return 'bzr remote repository'  | 
|
200  | 
||
201  | 
def __eq__(self, other):  | 
|
| 
1752.2.87
by Andrew Bennetts
 Make tests pass.  | 
202  | 
return self.__class__ == other.__class__  | 
203  | 
||
| 
2018.5.118
by Robert Collins
 Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.  | 
204  | 
def check_conversion_target(self, target_format):  | 
205  | 
if self.rich_root_data and not target_format.rich_root_data:  | 
|
206  | 
raise errors.BadConversionTarget(  | 
|
207  | 
'Does not support rich root data.', target_format)  | 
|
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
208  | 
if (self.supports_tree_reference and  | 
209  | 
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.  | 
210  | 
raise errors.BadConversionTarget(  | 
211  | 
'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.  | 
212  | 
|
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
213  | 
|
| 
1752.2.50
by Andrew Bennetts
 Implement RemoteBzrDir.create_{branch,workingtree}  | 
214  | 
class RemoteRepository(object):  | 
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
215  | 
"""Repository accessed over rpc.  | 
216  | 
||
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
217  | 
    For the moment most operations are performed using local transport-backed
 | 
218  | 
    Repository objects.
 | 
|
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
219  | 
    """
 | 
220  | 
||
| 
2018.5.118
by Robert Collins
 Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.  | 
221  | 
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.  | 
222  | 
"""Create a RemoteRepository instance.  | 
223  | 
        
 | 
|
224  | 
        :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.  | 
225  | 
        :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.  | 
226  | 
        :param real_repository: If not None, a local implementation of the
 | 
227  | 
            repository logic for the repository, usually accessing the data
 | 
|
228  | 
            via the VFS.
 | 
|
| 
2018.5.57
by Robert Collins
 Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).  | 
229  | 
        :param _client: Private testing parameter - override the smart client
 | 
230  | 
            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.  | 
231  | 
        """
 | 
232  | 
if real_repository:  | 
|
| 
2018.5.36
by Andrew Bennetts
 Fix typo, and clean up some ununsed import warnings from pyflakes at the same time.  | 
233  | 
self._real_repository = real_repository  | 
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
234  | 
else:  | 
235  | 
self._real_repository = None  | 
|
| 
1752.2.50
by Andrew Bennetts
 Implement RemoteBzrDir.create_{branch,workingtree}  | 
236  | 
self.bzrdir = remote_bzrdir  | 
| 
2018.5.57
by Robert Collins
 Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).  | 
237  | 
if _client is None:  | 
| 
2018.5.159
by Andrew Bennetts
 Rename SmartClient to _SmartClient.  | 
238  | 
self._client = client._SmartClient(self.bzrdir._medium)  | 
| 
2018.5.57
by Robert Collins
 Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).  | 
239  | 
else:  | 
240  | 
self._client = _client  | 
|
| 
2018.5.118
by Robert Collins
 Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.  | 
241  | 
self._format = format  | 
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
242  | 
self._lock_mode = None  | 
243  | 
self._lock_token = None  | 
|
244  | 
self._lock_count = 0  | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
245  | 
self._leave_lock = False  | 
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
246  | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
247  | 
def _ensure_real(self):  | 
248  | 
"""Ensure that there is a _real_repository set.  | 
|
249  | 
||
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
250  | 
        Used before calls to self._real_repository.
 | 
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
251  | 
        """
 | 
252  | 
if not self._real_repository:  | 
|
253  | 
self.bzrdir._ensure_real()  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
254  | 
            #self._real_repository = self.bzrdir._real_bzrdir.open_repository()
 | 
255  | 
self._set_real_repository(self.bzrdir._real_bzrdir.open_repository())  | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
256  | 
|
| 
2018.5.67
by Wouter van Heyst
 Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)  | 
257  | 
def get_revision_graph(self, revision_id=None):  | 
258  | 
"""See Repository.get_revision_graph()."""  | 
|
259  | 
if revision_id is None:  | 
|
260  | 
revision_id = ''  | 
|
261  | 
elif revision_id == NULL_REVISION:  | 
|
262  | 
return {}  | 
|
263  | 
||
264  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
|
| 
2018.5.83
by Andrew Bennetts
 Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.  | 
265  | 
assert type(revision_id) is str  | 
| 
2018.5.153
by Andrew Bennetts
 Rename call2 to call_expecting_body, and other small changes prompted by review.  | 
266  | 
response = self._client.call_expecting_body(  | 
| 
2018.5.83
by Andrew Bennetts
 Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.  | 
267  | 
'Repository.get_revision_graph', path, revision_id)  | 
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
268  | 
if response[0][0] not in ['ok', 'nosuchrevision']:  | 
269  | 
raise errors.UnexpectedSmartServerResponse(response[0])  | 
|
| 
2018.5.67
by Wouter van Heyst
 Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)  | 
270  | 
if response[0][0] == 'ok':  | 
271  | 
coded = response[1].read_body_bytes()  | 
|
| 
2018.5.105
by Andrew Bennetts
 Implement revision_history caching for RemoteBranch.  | 
272  | 
if coded == '':  | 
273  | 
                # no revisions in this repository!
 | 
|
274  | 
return {}  | 
|
| 
2018.5.83
by Andrew Bennetts
 Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.  | 
275  | 
lines = coded.split('\n')  | 
| 
2018.5.67
by Wouter van Heyst
 Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)  | 
276  | 
revision_graph = {}  | 
277  | 
for line in lines:  | 
|
278  | 
d = list(line.split())  | 
|
279  | 
revision_graph[d[0]] = d[1:]  | 
|
280  | 
||
281  | 
return revision_graph  | 
|
282  | 
else:  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
283  | 
response_body = response[1].read_body_bytes()  | 
284  | 
assert response_body == ''  | 
|
| 
2018.5.67
by Wouter van Heyst
 Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)  | 
285  | 
raise NoSuchRevision(self, revision_id)  | 
286  | 
||
| 
2018.5.40
by Robert Collins
 Implement a remote Repository.has_revision method.  | 
287  | 
def has_revision(self, revision_id):  | 
288  | 
"""See Repository.has_revision()."""  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
289  | 
if revision_id is None:  | 
290  | 
            # The null revision is always present.
 | 
|
291  | 
return True  | 
|
| 
2018.5.42
by Robert Collins
 Various hopefully improvements, but wsgi is broken, handing over to spiv :).  | 
292  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
| 
2018.5.83
by Andrew Bennetts
 Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.  | 
293  | 
response = self._client.call('Repository.has_revision', path, revision_id)  | 
| 
2018.5.158
by Andrew Bennetts
 Return 'yes'/'no' rather than 'ok'/'no' from the Repository.has_revision smart command.  | 
294  | 
assert response[0] in ('yes', 'no'), 'unexpected response code %s' % (response,)  | 
295  | 
return response[0] == 'yes'  | 
|
| 
2018.5.40
by Robert Collins
 Implement a remote Repository.has_revision method.  | 
296  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
297  | 
def gather_stats(self, revid=None, committers=None):  | 
| 
2018.5.62
by Robert Collins
 Stub out RemoteRepository.gather_stats while its implemented in parallel.  | 
298  | 
"""See Repository.gather_stats()."""  | 
| 
2018.10.3
by v.ladeuil+lp at free
 more tests for gather_stats  | 
299  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
300  | 
if revid in (None, NULL_REVISION):  | 
|
301  | 
fmt_revid = ''  | 
|
302  | 
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.  | 
303  | 
fmt_revid = revid  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
304  | 
if committers is None or not committers:  | 
| 
2018.10.3
by v.ladeuil+lp at free
 more tests for gather_stats  | 
305  | 
fmt_committers = 'no'  | 
306  | 
else:  | 
|
307  | 
fmt_committers = 'yes'  | 
|
| 
2018.5.153
by Andrew Bennetts
 Rename call2 to call_expecting_body, and other small changes prompted by review.  | 
308  | 
response = self._client.call_expecting_body(  | 
309  | 
'Repository.gather_stats', path, fmt_revid, fmt_committers)  | 
|
| 
2018.10.3
by v.ladeuil+lp at free
 more tests for gather_stats  | 
310  | 
assert response[0][0] == 'ok', \  | 
311  | 
'unexpected response code %s' % (response[0],)  | 
|
312  | 
||
313  | 
body = response[1].read_body_bytes()  | 
|
314  | 
result = {}  | 
|
315  | 
for line in body.split('\n'):  | 
|
316  | 
if not line:  | 
|
317  | 
                continue
 | 
|
318  | 
key, val_text = line.split(':')  | 
|
319  | 
if key in ('revisions', 'size', 'committers'):  | 
|
320  | 
result[key] = int(val_text)  | 
|
321  | 
elif key in ('firstrev', 'latestrev'):  | 
|
322  | 
values = val_text.split(' ')[1:]  | 
|
323  | 
result[key] = (float(values[0]), long(values[1]))  | 
|
324  | 
||
325  | 
return result  | 
|
| 
2018.5.62
by Robert Collins
 Stub out RemoteRepository.gather_stats while its implemented in parallel.  | 
326  | 
|
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
327  | 
def get_physical_lock_status(self):  | 
328  | 
"""See Repository.get_physical_lock_status()."""  | 
|
329  | 
return False  | 
|
330  | 
||
| 
2018.5.57
by Robert Collins
 Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).  | 
331  | 
def is_shared(self):  | 
332  | 
"""See Repository.is_shared()."""  | 
|
333  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
|
334  | 
response = self._client.call('Repository.is_shared', path)  | 
|
335  | 
assert response[0] in ('yes', 'no'), 'unexpected response code %s' % (response,)  | 
|
336  | 
return response[0] == 'yes'  | 
|
337  | 
||
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
338  | 
def lock_read(self):  | 
339  | 
        # wrong eventually - want a local lock cache context
 | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
340  | 
if not self._lock_mode:  | 
341  | 
self._lock_mode = 'r'  | 
|
342  | 
self._lock_count = 1  | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
343  | 
if self._real_repository is not None:  | 
344  | 
self._real_repository.lock_read()  | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
345  | 
else:  | 
346  | 
self._lock_count += 1  | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
347  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
348  | 
def _remote_lock_write(self, token):  | 
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
349  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
350  | 
if token is None:  | 
|
351  | 
token = ''  | 
|
352  | 
response = self._client.call('Repository.lock_write', path, token)  | 
|
353  | 
if response[0] == 'ok':  | 
|
354  | 
ok, token = response  | 
|
355  | 
return token  | 
|
356  | 
elif response[0] == 'LockContention':  | 
|
357  | 
raise errors.LockContention('(remote 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.  | 
358  | 
elif response[0] == 'UnlockableTransport':  | 
359  | 
raise errors.UnlockableTransport(self.bzrdir.root_transport)  | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
360  | 
else:  | 
361  | 
assert False, 'unexpected response code %s' % (response,)  | 
|
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
362  | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
363  | 
def lock_write(self, token=None):  | 
364  | 
if not self._lock_mode:  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
365  | 
self._lock_token = self._remote_lock_write(token)  | 
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
366  | 
assert self._lock_token, 'Remote server did not return a token!'  | 
367  | 
if self._real_repository is not None:  | 
|
368  | 
self._real_repository.lock_write(token=self._lock_token)  | 
|
369  | 
if token is not None:  | 
|
370  | 
self._leave_lock = True  | 
|
371  | 
else:  | 
|
372  | 
self._leave_lock = False  | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
373  | 
self._lock_mode = 'w'  | 
374  | 
self._lock_count = 1  | 
|
375  | 
elif self._lock_mode == 'r':  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
376  | 
raise errors.ReadOnlyError(self)  | 
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
377  | 
else:  | 
378  | 
self._lock_count += 1  | 
|
379  | 
return self._lock_token  | 
|
380  | 
||
381  | 
def leave_lock_in_place(self):  | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
382  | 
self._leave_lock = True  | 
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
383  | 
|
384  | 
def dont_leave_lock_in_place(self):  | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
385  | 
self._leave_lock = False  | 
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
386  | 
|
387  | 
def _set_real_repository(self, repository):  | 
|
388  | 
"""Set the _real_repository for this repository.  | 
|
389  | 
||
390  | 
        :param repository: The repository to fallback to for non-hpss
 | 
|
391  | 
            implemented operations.
 | 
|
392  | 
        """
 | 
|
| 
2018.5.97
by Andrew Bennetts
 Fix more tests.  | 
393  | 
assert not isinstance(repository, RemoteRepository)  | 
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
394  | 
self._real_repository = repository  | 
395  | 
if self._lock_mode == 'w':  | 
|
396  | 
            # if we are already locked, the real repository must be able to
 | 
|
397  | 
            # acquire the lock with our token.
 | 
|
398  | 
self._real_repository.lock_write(self._lock_token)  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
399  | 
elif self._lock_mode == 'r':  | 
400  | 
self._real_repository.lock_read()  | 
|
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
401  | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
402  | 
def _unlock(self, token):  | 
403  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
|
404  | 
response = self._client.call('Repository.unlock', path, token)  | 
|
405  | 
if response == ('ok',):  | 
|
406  | 
            return
 | 
|
407  | 
elif response[0] == 'TokenMismatch':  | 
|
408  | 
raise errors.TokenMismatch(token, '(remote token)')  | 
|
409  | 
else:  | 
|
410  | 
assert False, 'unexpected response code %s' % (response,)  | 
|
411  | 
||
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
412  | 
def unlock(self):  | 
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
413  | 
self._lock_count -= 1  | 
414  | 
if not self._lock_count:  | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
415  | 
mode = self._lock_mode  | 
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
416  | 
self._lock_mode = None  | 
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
417  | 
if self._real_repository is not None:  | 
418  | 
self._real_repository.unlock()  | 
|
419  | 
if mode != 'w':  | 
|
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
420  | 
                # Only write-locked repositories need to make a remote method
 | 
421  | 
                # call to perfom the unlock.
 | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
422  | 
                return
 | 
423  | 
assert self._lock_token, 'Locked, but no token!'  | 
|
424  | 
token = self._lock_token  | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
425  | 
self._lock_token = None  | 
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
426  | 
if not self._leave_lock:  | 
427  | 
self._unlock(token)  | 
|
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
428  | 
|
429  | 
def break_lock(self):  | 
|
| 
2018.5.78
by Andrew Bennetts
 Implement RemoteRepository.lock_write/unlock to expect and send tokens over the  | 
430  | 
        # should hand off to the network
 | 
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
431  | 
self._ensure_real()  | 
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
432  | 
return self._real_repository.break_lock()  | 
433  | 
||
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
434  | 
    ### These methods are just thin shims to the VFS object for now.
 | 
435  | 
||
436  | 
def revision_tree(self, revision_id):  | 
|
437  | 
self._ensure_real()  | 
|
438  | 
return self._real_repository.revision_tree(revision_id)  | 
|
439  | 
||
440  | 
def get_commit_builder(self, branch, parents, config, timestamp=None,  | 
|
441  | 
timezone=None, committer=None, revprops=None,  | 
|
442  | 
revision_id=None):  | 
|
443  | 
        # FIXME: It ought to be possible to call this without immediately
 | 
|
444  | 
        # triggering _ensure_real.  For now it's the easiest thing to do.
 | 
|
445  | 
self._ensure_real()  | 
|
446  | 
builder = self._real_repository.get_commit_builder(branch, parents,  | 
|
447  | 
config, timestamp=timestamp, timezone=timezone,  | 
|
448  | 
committer=committer, revprops=revprops, revision_id=revision_id)  | 
|
449  | 
        # Make the builder use this RemoteRepository rather than the real one.
 | 
|
450  | 
builder.repository = self  | 
|
451  | 
return builder  | 
|
452  | 
||
453  | 
    @needs_write_lock
 | 
|
454  | 
def add_inventory(self, revid, inv, parents):  | 
|
455  | 
self._ensure_real()  | 
|
456  | 
return self._real_repository.add_inventory(revid, inv, parents)  | 
|
457  | 
||
458  | 
    @needs_write_lock
 | 
|
459  | 
def add_revision(self, rev_id, rev, inv=None, config=None):  | 
|
460  | 
self._ensure_real()  | 
|
461  | 
return self._real_repository.add_revision(  | 
|
462  | 
rev_id, rev, inv=inv, config=config)  | 
|
463  | 
||
464  | 
    @needs_read_lock
 | 
|
465  | 
def get_inventory(self, revision_id):  | 
|
466  | 
self._ensure_real()  | 
|
467  | 
return self._real_repository.get_inventory(revision_id)  | 
|
468  | 
||
469  | 
    @needs_read_lock
 | 
|
470  | 
def get_revision(self, revision_id):  | 
|
471  | 
self._ensure_real()  | 
|
472  | 
return self._real_repository.get_revision(revision_id)  | 
|
473  | 
||
474  | 
    @property
 | 
|
475  | 
def weave_store(self):  | 
|
476  | 
self._ensure_real()  | 
|
477  | 
return self._real_repository.weave_store  | 
|
478  | 
||
479  | 
def get_transaction(self):  | 
|
480  | 
self._ensure_real()  | 
|
481  | 
return self._real_repository.get_transaction()  | 
|
482  | 
||
483  | 
    @needs_read_lock
 | 
|
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
484  | 
def clone(self, a_bzrdir, revision_id=None):  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
485  | 
self._ensure_real()  | 
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
486  | 
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.  | 
487  | 
|
488  | 
def make_working_trees(self):  | 
|
| 
2018.5.120
by Robert Collins
 The Repository API ``make_working_trees`` is now permitted to return  | 
489  | 
"""RemoteRepositories never create working trees by default."""  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
490  | 
return False  | 
491  | 
||
492  | 
def fetch(self, source, revision_id=None, pb=None):  | 
|
493  | 
self._ensure_real()  | 
|
494  | 
return self._real_repository.fetch(  | 
|
495  | 
source, revision_id=revision_id, pb=pb)  | 
|
496  | 
||
497  | 
    @property
 | 
|
498  | 
def control_weaves(self):  | 
|
499  | 
self._ensure_real()  | 
|
500  | 
return self._real_repository.control_weaves  | 
|
501  | 
||
502  | 
    @needs_read_lock
 | 
|
503  | 
def get_ancestry(self, revision_id):  | 
|
504  | 
self._ensure_real()  | 
|
505  | 
return self._real_repository.get_ancestry(revision_id)  | 
|
506  | 
||
507  | 
    @needs_read_lock
 | 
|
508  | 
def get_inventory_weave(self):  | 
|
509  | 
self._ensure_real()  | 
|
510  | 
return self._real_repository.get_inventory_weave()  | 
|
511  | 
||
512  | 
def fileids_altered_by_revision_ids(self, revision_ids):  | 
|
513  | 
self._ensure_real()  | 
|
514  | 
return self._real_repository.fileids_altered_by_revision_ids(revision_ids)  | 
|
515  | 
||
516  | 
    @needs_read_lock
 | 
|
517  | 
def get_signature_text(self, revision_id):  | 
|
518  | 
self._ensure_real()  | 
|
519  | 
return self._real_repository.get_signature_text(revision_id)  | 
|
520  | 
||
521  | 
    @needs_read_lock
 | 
|
522  | 
def get_revision_graph_with_ghosts(self, revision_ids=None):  | 
|
523  | 
self._ensure_real()  | 
|
524  | 
return self._real_repository.get_revision_graph_with_ghosts(  | 
|
525  | 
revision_ids=revision_ids)  | 
|
526  | 
||
527  | 
    @needs_read_lock
 | 
|
528  | 
def get_inventory_xml(self, revision_id):  | 
|
529  | 
self._ensure_real()  | 
|
530  | 
return self._real_repository.get_inventory_xml(revision_id)  | 
|
531  | 
||
532  | 
def deserialise_inventory(self, revision_id, xml):  | 
|
533  | 
self._ensure_real()  | 
|
534  | 
return self._real_repository.deserialise_inventory(revision_id, xml)  | 
|
535  | 
||
536  | 
def reconcile(self, other=None, thorough=False):  | 
|
537  | 
self._ensure_real()  | 
|
538  | 
return self._real_repository.reconcile(other=other, thorough=thorough)  | 
|
539  | 
||
540  | 
def all_revision_ids(self):  | 
|
541  | 
self._ensure_real()  | 
|
542  | 
return self._real_repository.all_revision_ids()  | 
|
543  | 
||
544  | 
    @needs_read_lock
 | 
|
545  | 
def get_deltas_for_revisions(self, revisions):  | 
|
546  | 
self._ensure_real()  | 
|
547  | 
return self._real_repository.get_deltas_for_revisions(revisions)  | 
|
548  | 
||
549  | 
    @needs_read_lock
 | 
|
550  | 
def get_revision_delta(self, revision_id):  | 
|
551  | 
self._ensure_real()  | 
|
552  | 
return self._real_repository.get_revision_delta(revision_id)  | 
|
553  | 
||
554  | 
    @needs_read_lock
 | 
|
555  | 
def revision_trees(self, revision_ids):  | 
|
556  | 
self._ensure_real()  | 
|
557  | 
return self._real_repository.revision_trees(revision_ids)  | 
|
558  | 
||
559  | 
    @needs_read_lock
 | 
|
560  | 
def get_revision_reconcile(self, revision_id):  | 
|
561  | 
self._ensure_real()  | 
|
562  | 
return self._real_repository.get_revision_reconcile(revision_id)  | 
|
563  | 
||
564  | 
    @needs_read_lock
 | 
|
565  | 
def check(self, revision_ids):  | 
|
566  | 
self._ensure_real()  | 
|
567  | 
return self._real_repository.check(revision_ids)  | 
|
568  | 
||
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
569  | 
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.  | 
570  | 
self._ensure_real()  | 
571  | 
return self._real_repository.copy_content_into(  | 
|
| 
2018.5.138
by Robert Collins
 Merge bzr.dev.  | 
572  | 
destination, revision_id=revision_id)  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
573  | 
|
574  | 
def set_make_working_trees(self, new_value):  | 
|
575  | 
raise NotImplementedError(self.set_make_working_trees)  | 
|
576  | 
||
577  | 
    @needs_write_lock
 | 
|
578  | 
def sign_revision(self, revision_id, gpg_strategy):  | 
|
579  | 
self._ensure_real()  | 
|
580  | 
return self._real_repository.sign_revision(revision_id, gpg_strategy)  | 
|
581  | 
||
582  | 
    @needs_read_lock
 | 
|
583  | 
def get_revisions(self, revision_ids):  | 
|
584  | 
self._ensure_real()  | 
|
585  | 
return self._real_repository.get_revisions(revision_ids)  | 
|
586  | 
||
587  | 
def supports_rich_root(self):  | 
|
| 
2018.5.84
by Andrew Bennetts
 Merge in supports-rich-root, another test passing.  | 
588  | 
self._ensure_real()  | 
589  | 
return self._real_repository.supports_rich_root()  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
590  | 
|
| 
2018.5.83
by Andrew Bennetts
 Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.  | 
591  | 
def iter_reverse_revision_history(self, revision_id):  | 
592  | 
self._ensure_real()  | 
|
593  | 
return self._real_repository.iter_reverse_revision_history(revision_id)  | 
|
594  | 
||
| 
2018.5.96
by Andrew Bennetts
 Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's  | 
595  | 
    @property
 | 
596  | 
def _serializer(self):  | 
|
597  | 
self._ensure_real()  | 
|
598  | 
return self._real_repository._serializer  | 
|
599  | 
||
| 
2018.5.97
by Andrew Bennetts
 Fix more tests.  | 
600  | 
def store_revision_signature(self, gpg_strategy, plaintext, revision_id):  | 
601  | 
self._ensure_real()  | 
|
602  | 
return self._real_repository.store_revision_signature(  | 
|
603  | 
gpg_strategy, plaintext, revision_id)  | 
|
604  | 
||
605  | 
def has_signature_for_revision_id(self, revision_id):  | 
|
606  | 
self._ensure_real()  | 
|
607  | 
return self._real_repository.has_signature_for_revision_id(revision_id)  | 
|
608  | 
||
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
609  | 
|
| 
2018.5.127
by Andrew Bennetts
 Fix most of the lockable_files tests for RemoteBranchLockableFiles.  | 
610  | 
class RemoteBranchLockableFiles(LockableFiles):  | 
| 
2018.5.59
by Robert Collins
 Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).  | 
611  | 
"""A 'LockableFiles' implementation that talks to a smart server.  | 
612  | 
    
 | 
|
613  | 
    This is not a public interface class.
 | 
|
614  | 
    """
 | 
|
615  | 
||
616  | 
def __init__(self, bzrdir, _client):  | 
|
617  | 
self.bzrdir = bzrdir  | 
|
618  | 
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.  | 
619  | 
self._need_find_modes = True  | 
| 
2018.5.133
by Andrew Bennetts
 All TestLockableFiles_RemoteLockDir tests passing.  | 
620  | 
LockableFiles.__init__(  | 
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
621  | 
self, bzrdir.get_branch_transport(None),  | 
| 
2018.5.133
by Andrew Bennetts
 All TestLockableFiles_RemoteLockDir tests passing.  | 
622  | 
'lock', lockdir.LockDir)  | 
| 
2018.5.59
by Robert Collins
 Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).  | 
623  | 
|
| 
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.  | 
624  | 
def _find_modes(self):  | 
625  | 
        # RemoteBranches don't let the client set the mode of control files.
 | 
|
626  | 
self._dir_mode = None  | 
|
627  | 
self._file_mode = None  | 
|
628  | 
||
| 
2018.5.59
by Robert Collins
 Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).  | 
629  | 
def get(self, path):  | 
630  | 
"""'get' a remote path as per the LockableFiles interface.  | 
|
631  | 
||
632  | 
        :param path: the file to 'get'. If this is 'branch.conf', we do not
 | 
|
633  | 
             just retrieve a file, instead we ask the smart server to generate
 | 
|
634  | 
             a configuration for us - which is retrieved as an INI file.
 | 
|
635  | 
        """
 | 
|
| 
2018.5.133
by Andrew Bennetts
 All TestLockableFiles_RemoteLockDir tests passing.  | 
636  | 
if path == 'branch.conf':  | 
637  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
|
| 
2018.5.153
by Andrew Bennetts
 Rename call2 to call_expecting_body, and other small changes prompted by review.  | 
638  | 
response = self._client.call_expecting_body(  | 
639  | 
'Branch.get_config_file', path)  | 
|
| 
2018.5.133
by Andrew Bennetts
 All TestLockableFiles_RemoteLockDir tests passing.  | 
640  | 
assert response[0][0] == 'ok', \  | 
641  | 
'unexpected response code %s' % (response[0],)  | 
|
642  | 
return StringIO(response[1].read_body_bytes())  | 
|
643  | 
else:  | 
|
644  | 
            # VFS fallback.
 | 
|
645  | 
return LockableFiles.get(self, path)  | 
|
| 
2018.5.59
by Robert Collins
 Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).  | 
646  | 
|
647  | 
||
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
648  | 
class RemoteBranchFormat(branch.BranchFormat):  | 
649  | 
||
| 
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.  | 
650  | 
def __eq__(self, other):  | 
651  | 
return (isinstance(other, RemoteBranchFormat) and  | 
|
652  | 
self.__dict__ == other.__dict__)  | 
|
653  | 
||
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
654  | 
def get_format_description(self):  | 
655  | 
return 'Remote BZR Branch'  | 
|
656  | 
||
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
657  | 
def get_format_string(self):  | 
658  | 
return 'Remote BZR Branch'  | 
|
659  | 
||
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
660  | 
def open(self, a_bzrdir):  | 
| 
1752.2.72
by Andrew Bennetts
 Make Remote* classes in remote.py more consistent and remove some dead code.  | 
661  | 
assert isinstance(a_bzrdir, RemoteBzrDir)  | 
662  | 
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.  | 
663  | 
|
664  | 
def initialize(self, a_bzrdir):  | 
|
665  | 
assert isinstance(a_bzrdir, RemoteBzrDir)  | 
|
666  | 
return a_bzrdir.create_branch()  | 
|
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
667  | 
|
668  | 
||
669  | 
class RemoteBranch(branch.Branch):  | 
|
670  | 
"""Branch stored on a server accessed by HPSS RPC.  | 
|
671  | 
||
672  | 
    At the moment most operations are mapped down to simple file operations.
 | 
|
673  | 
    """
 | 
|
| 
1752.2.30
by Martin Pool
 Start adding a RemoteBzrDir, etc  | 
674  | 
|
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
675  | 
def __init__(self, remote_bzrdir, remote_repository, real_branch=None,  | 
676  | 
_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.  | 
677  | 
"""Create a RemoteBranch instance.  | 
678  | 
||
679  | 
        :param real_branch: An optional local implementation of the branch
 | 
|
680  | 
            format, usually accessing the data via the VFS.
 | 
|
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
681  | 
        :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.  | 
682  | 
        """
 | 
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
683  | 
        # We intentionally don't call the parent class's __init__, because it
 | 
684  | 
        # will try to assign to self.tags, which is a property in this subclass.
 | 
|
685  | 
        # And the parent's __init__ doesn't do much anyway.
 | 
|
| 
2018.5.105
by Andrew Bennetts
 Implement revision_history caching for RemoteBranch.  | 
686  | 
self._revision_history_cache = None  | 
| 
1752.2.64
by Andrew Bennetts
 Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.  | 
687  | 
self.bzrdir = remote_bzrdir  | 
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
688  | 
if _client is not None:  | 
689  | 
self._client = _client  | 
|
690  | 
else:  | 
|
| 
2018.5.159
by Andrew Bennetts
 Rename SmartClient to _SmartClient.  | 
691  | 
self._client = client._SmartClient(self.bzrdir._medium)  | 
| 
1752.2.64
by Andrew Bennetts
 Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.  | 
692  | 
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.  | 
693  | 
if real_branch is not None:  | 
694  | 
self._real_branch = real_branch  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
695  | 
            # Give the remote repository the matching real repo.
 | 
| 
2018.5.97
by Andrew Bennetts
 Fix more tests.  | 
696  | 
real_repo = self._real_branch.repository  | 
697  | 
if isinstance(real_repo, RemoteRepository):  | 
|
698  | 
real_repo._ensure_real()  | 
|
699  | 
real_repo = real_repo._real_repository  | 
|
700  | 
self.repository._set_real_repository(real_repo)  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
701  | 
            # Give the branch the remote repository to let fast-pathing happen.
 | 
702  | 
self._real_branch.repository = self.repository  | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
703  | 
else:  | 
704  | 
self._real_branch = None  | 
|
| 
2018.5.59
by Robert Collins
 Get BranchConfig working somewhat on RemoteBranches (Robert Collins, Vincent Ladeuil).  | 
705  | 
        # 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.  | 
706  | 
self._format = RemoteBranchFormat()  | 
| 
2018.5.55
by Robert Collins
 Give RemoteBranch a base url in line with the Branch protocol.  | 
707  | 
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.  | 
708  | 
self._control_files = None  | 
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
709  | 
self._lock_mode = None  | 
710  | 
self._lock_token = None  | 
|
711  | 
self._lock_count = 0  | 
|
712  | 
self._leave_lock = False  | 
|
| 
1752.2.64
by Andrew Bennetts
 Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.  | 
713  | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
714  | 
def _ensure_real(self):  | 
715  | 
"""Ensure that there is a _real_branch set.  | 
|
716  | 
||
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
717  | 
        Used before calls to self._real_branch.
 | 
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
718  | 
        """
 | 
719  | 
if not self._real_branch:  | 
|
720  | 
assert vfs.vfs_enabled()  | 
|
721  | 
self.bzrdir._ensure_real()  | 
|
722  | 
self._real_branch = self.bzrdir._real_bzrdir.open_branch()  | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
723  | 
            # Give the remote repository the matching real repo.
 | 
| 
2018.5.97
by Andrew Bennetts
 Fix more tests.  | 
724  | 
real_repo = self._real_branch.repository  | 
725  | 
if isinstance(real_repo, RemoteRepository):  | 
|
726  | 
real_repo._ensure_real()  | 
|
727  | 
real_repo = real_repo._real_repository  | 
|
728  | 
self.repository._set_real_repository(real_repo)  | 
|
| 
2018.5.75
by Andrew Bennetts
 Add Repository.{dont_,}leave_lock_in_place.  | 
729  | 
            # Give the branch the remote repository to let fast-pathing happen.
 | 
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
730  | 
self._real_branch.repository = self.repository  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
731  | 
            # XXX: deal with _lock_mode == 'w'
 | 
732  | 
if self._lock_mode == 'r':  | 
|
733  | 
self._real_branch.lock_read()  | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
734  | 
|
| 
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.  | 
735  | 
    @property
 | 
736  | 
def control_files(self):  | 
|
737  | 
        # Defer actually creating RemoteBranchLockableFiles until its needed,
 | 
|
738  | 
        # because it triggers an _ensure_real that we otherwise might not need.
 | 
|
739  | 
if self._control_files is None:  | 
|
740  | 
self._control_files = RemoteBranchLockableFiles(  | 
|
741  | 
self.bzrdir, self._client)  | 
|
742  | 
return self._control_files  | 
|
743  | 
||
| 
2018.5.166
by Andrew Bennetts
 Small changes in response to Aaron's review.  | 
744  | 
def _get_checkout_format(self):  | 
745  | 
self._ensure_real()  | 
|
746  | 
return self._real_branch._get_checkout_format()  | 
|
747  | 
||
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
748  | 
def get_physical_lock_status(self):  | 
749  | 
"""See Branch.get_physical_lock_status()."""  | 
|
750  | 
        # 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.  | 
751  | 
self._ensure_real()  | 
| 
2018.5.60
by Robert Collins
 More missing methods from RemoteBranch and RemoteRepository to let 'info' get further.  | 
752  | 
return self._real_branch.get_physical_lock_status()  | 
753  | 
||
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
754  | 
def lock_read(self):  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
755  | 
if not self._lock_mode:  | 
756  | 
self._lock_mode = 'r'  | 
|
757  | 
self._lock_count = 1  | 
|
758  | 
if self._real_branch is not None:  | 
|
759  | 
self._real_branch.lock_read()  | 
|
760  | 
else:  | 
|
761  | 
self._lock_count += 1  | 
|
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
762  | 
|
| 
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).  | 
763  | 
def _remote_lock_write(self, token):  | 
764  | 
if token is None:  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
765  | 
branch_token = repo_token = ''  | 
766  | 
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).  | 
767  | 
branch_token = token  | 
768  | 
repo_token = self.repository.lock_write()  | 
|
769  | 
self.repository.unlock()  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
770  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
771  | 
response = self._client.call('Branch.lock_write', path, branch_token,  | 
|
772  | 
repo_token)  | 
|
773  | 
if response[0] == 'ok':  | 
|
774  | 
ok, branch_token, repo_token = response  | 
|
775  | 
return branch_token, repo_token  | 
|
776  | 
elif response[0] == 'LockContention':  | 
|
777  | 
raise errors.LockContention('(remote lock)')  | 
|
778  | 
elif response[0] == 'TokenMismatch':  | 
|
| 
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).  | 
779  | 
raise errors.TokenMismatch(token, '(remote token)')  | 
| 
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.  | 
780  | 
elif response[0] == 'UnlockableTransport':  | 
781  | 
raise errors.UnlockableTransport(self.bzrdir.root_transport)  | 
|
| 
2018.5.123
by Robert Collins
 Translate ReadOnlyError in RemoteBranch._remote_lock_write.  | 
782  | 
elif response[0] == 'ReadOnlyError':  | 
783  | 
raise errors.ReadOnlyError(self)  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
784  | 
else:  | 
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
785  | 
assert False, 'unexpected response code %r' % (response,)  | 
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
786  | 
|
| 
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).  | 
787  | 
def lock_write(self, token=None):  | 
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
788  | 
if not self._lock_mode:  | 
| 
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).  | 
789  | 
remote_tokens = self._remote_lock_write(token)  | 
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
790  | 
self._lock_token, self._repo_lock_token = remote_tokens  | 
791  | 
assert self._lock_token, 'Remote server did not return a token!'  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
792  | 
            # TODO: We really, really, really don't want to call _ensure_real
 | 
793  | 
            # here, but it's the easiest way to ensure coherency between the
 | 
|
794  | 
            # state of the RemoteBranch and RemoteRepository objects and the
 | 
|
795  | 
            # physical locks.  If we don't materialise the real objects here,
 | 
|
796  | 
            # then getting everything in the right state later is complex, so
 | 
|
797  | 
            # for now we just do it the lazy way.
 | 
|
798  | 
            #   -- Andrew Bennetts, 2007-02-22.
 | 
|
799  | 
self._ensure_real()  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
800  | 
if self._real_branch is not None:  | 
| 
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).  | 
801  | 
self._real_branch.repository.lock_write(  | 
802  | 
token=self._repo_lock_token)  | 
|
803  | 
try:  | 
|
804  | 
self._real_branch.lock_write(token=self._lock_token)  | 
|
805  | 
finally:  | 
|
806  | 
self._real_branch.repository.unlock()  | 
|
807  | 
if token is not None:  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
808  | 
self._leave_lock = True  | 
809  | 
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).  | 
810  | 
                # XXX: this case seems to be unreachable; token cannot be None.
 | 
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
811  | 
self._leave_lock = False  | 
812  | 
self._lock_mode = 'w'  | 
|
813  | 
self._lock_count = 1  | 
|
814  | 
elif self._lock_mode == 'r':  | 
|
815  | 
raise errors.ReadOnlyTransaction  | 
|
816  | 
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).  | 
817  | 
if token is not None:  | 
818  | 
                # A token was given to lock_write, and we're relocking, so check
 | 
|
819  | 
                # that the given token actually matches the one we already have.
 | 
|
820  | 
if token != self._lock_token:  | 
|
821  | 
raise errors.TokenMismatch(token, self._lock_token)  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
822  | 
self._lock_count += 1  | 
| 
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).  | 
823  | 
return self._lock_token  | 
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
824  | 
|
825  | 
def _unlock(self, branch_token, repo_token):  | 
|
826  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
|
827  | 
response = self._client.call('Branch.unlock', path, branch_token,  | 
|
828  | 
repo_token)  | 
|
829  | 
if response == ('ok',):  | 
|
830  | 
            return
 | 
|
831  | 
elif response[0] == 'TokenMismatch':  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
832  | 
raise errors.TokenMismatch(  | 
833  | 
str((branch_token, repo_token)), '(remote tokens)')  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
834  | 
else:  | 
835  | 
assert False, 'unexpected response code %s' % (response,)  | 
|
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
836  | 
|
837  | 
def unlock(self):  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
838  | 
self._lock_count -= 1  | 
839  | 
if not self._lock_count:  | 
|
| 
2018.5.105
by Andrew Bennetts
 Implement revision_history caching for RemoteBranch.  | 
840  | 
self._clear_cached_state()  | 
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
841  | 
mode = self._lock_mode  | 
842  | 
self._lock_mode = None  | 
|
843  | 
if self._real_branch is not None:  | 
|
| 
2018.15.1
by Andrew Bennetts
 All branch_implementations/test_locking tests passing.  | 
844  | 
if not self._leave_lock:  | 
845  | 
                    # If this RemoteBranch will remove the physical lock for the
 | 
|
846  | 
                    # repository, make sure the _real_branch doesn't do it
 | 
|
847  | 
                    # first.  (Because the _real_branch's repository is set to
 | 
|
848  | 
                    # be the RemoteRepository.)
 | 
|
849  | 
self._real_branch.repository.leave_lock_in_place()  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
850  | 
self._real_branch.unlock()  | 
851  | 
if mode != 'w':  | 
|
| 
2018.5.163
by Andrew Bennetts
 Deal with various review comments from Robert.  | 
852  | 
                # Only write-locked branched need to make a remote method call
 | 
853  | 
                # to perfom the unlock.
 | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
854  | 
                return
 | 
855  | 
assert self._lock_token, 'Locked, but no token!'  | 
|
856  | 
branch_token = self._lock_token  | 
|
857  | 
repo_token = self._repo_lock_token  | 
|
858  | 
self._lock_token = None  | 
|
859  | 
self._repo_lock_token = None  | 
|
860  | 
if not self._leave_lock:  | 
|
861  | 
self._unlock(branch_token, repo_token)  | 
|
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
862  | 
|
863  | 
def break_lock(self):  | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
864  | 
self._ensure_real()  | 
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
865  | 
return self._real_branch.break_lock()  | 
| 
1752.2.31
by Martin Pool
 [broken] some support for write operations over hpss  | 
866  | 
|
| 
2018.5.79
by Andrew Bennetts
 Implement RemoteBranch.lock_write/unlock as smart operations.  | 
867  | 
def leave_lock_in_place(self):  | 
868  | 
self._leave_lock = True  | 
|
869  | 
||
870  | 
def dont_leave_lock_in_place(self):  | 
|
871  | 
self._leave_lock = False  | 
|
872  | 
||
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
873  | 
def last_revision_info(self):  | 
874  | 
"""See Branch.last_revision_info()."""  | 
|
875  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
|
876  | 
response = self._client.call('Branch.last_revision_info', path)  | 
|
| 
2018.5.52
by Wouter van Heyst
 Provide more information when encountering unexpected responses from a smart  | 
877  | 
assert response[0] == 'ok', 'unexpected response code %s' % (response,)  | 
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
878  | 
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.  | 
879  | 
last_revision = response[2]  | 
| 
2018.5.51
by Wouter van Heyst
 Test and implement RemoteBranch.last_revision_info()  | 
880  | 
return (revno, last_revision)  | 
881  | 
||
| 
2018.5.105
by Andrew Bennetts
 Implement revision_history caching for RemoteBranch.  | 
882  | 
def _gen_revision_history(self):  | 
883  | 
"""See Branch._gen_revision_history()."""  | 
|
| 
2018.5.42
by Robert Collins
 Various hopefully improvements, but wsgi is broken, handing over to spiv :).  | 
884  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
| 
2018.5.153
by Andrew Bennetts
 Rename call2 to call_expecting_body, and other small changes prompted by review.  | 
885  | 
response = self._client.call_expecting_body(  | 
886  | 
'Branch.revision_history', path)  | 
|
887  | 
assert response[0][0] == 'ok', ('unexpected response code %s'  | 
|
888  | 
% (response[0],))  | 
|
| 
2018.5.83
by Andrew Bennetts
 Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.  | 
889  | 
result = response[1].read_body_bytes().split('\x00')  | 
| 
2018.5.38
by Robert Collins
 Implement RemoteBranch.revision_history().  | 
890  | 
if result == ['']:  | 
891  | 
return []  | 
|
892  | 
return result  | 
|
| 
1752.2.30
by Martin Pool
 Start adding a RemoteBzrDir, etc  | 
893  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
894  | 
    @needs_write_lock
 | 
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
895  | 
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.  | 
896  | 
        # Send just the tip revision of the history; the server will generate
 | 
897  | 
        # the full history from that.  If the revision doesn't exist in this
 | 
|
898  | 
        # branch, NoSuchRevision will be raised.
 | 
|
899  | 
path = self.bzrdir._path_for_remote_call(self._client)  | 
|
900  | 
if rev_history == []:  | 
|
| 
2018.5.170
by Andrew Bennetts
 Use 'null:' instead of '' to mean NULL_REVISION on the wire.  | 
901  | 
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.  | 
902  | 
else:  | 
903  | 
rev_id = rev_history[-1]  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
904  | 
response = self._client.call('Branch.set_last_revision',  | 
905  | 
path, self._lock_token, self._repo_lock_token, rev_id)  | 
|
| 
2018.12.3
by Andrew Bennetts
 Add a Branch.set_last_revision smart method, and make RemoteBranch.set_revision_history use it.  | 
906  | 
if response[0] == 'NoSuchRevision':  | 
907  | 
raise NoSuchRevision(self, rev_id)  | 
|
908  | 
else:  | 
|
909  | 
assert response == ('ok',), (  | 
|
910  | 
'unexpected response code %r' % (response,))  | 
|
| 
2018.5.105
by Andrew Bennetts
 Implement revision_history caching for RemoteBranch.  | 
911  | 
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.  | 
912  | 
|
913  | 
def get_parent(self):  | 
|
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
914  | 
self._ensure_real()  | 
| 
1752.2.52
by Andrew Bennetts
 Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.  | 
915  | 
return self._real_branch.get_parent()  | 
916  | 
||
| 
1752.2.63
by Andrew Bennetts
 Delegate set_parent.  | 
917  | 
def set_parent(self, url):  | 
| 
2018.5.70
by Robert Collins
 Only try to get real repositories when an operation requires them.  | 
918  | 
self._ensure_real()  | 
| 
1752.2.63
by Andrew Bennetts
 Delegate set_parent.  | 
919  | 
return self._real_branch.set_parent(url)  | 
920  | 
||
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
921  | 
def get_config(self):  | 
922  | 
return RemoteBranchConfig(self)  | 
|
923  | 
||
| 
2018.5.94
by Andrew Bennetts
 Various small changes in aid of making tests pass (including deleting one invalid test).  | 
924  | 
def sprout(self, to_bzrdir, revision_id=None):  | 
925  | 
        # Like Branch.sprout, except that it sprouts a branch in the default
 | 
|
926  | 
        # format, because RemoteBranches can't be created at arbitrary URLs.
 | 
|
927  | 
        # XXX: if to_bzrdir is a RemoteBranch, this should perhaps do
 | 
|
928  | 
        # to_bzrdir.create_branch...
 | 
|
929  | 
self._ensure_real()  | 
|
930  | 
result = branch.BranchFormat.get_default_format().initialize(to_bzrdir)  | 
|
931  | 
self._real_branch.copy_content_into(result, revision_id=revision_id)  | 
|
932  | 
result.set_parent(self.bzrdir.root_transport.base)  | 
|
933  | 
return result  | 
|
934  | 
||
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
935  | 
    @needs_write_lock
 | 
936  | 
def append_revision(self, *revision_ids):  | 
|
937  | 
self._ensure_real()  | 
|
938  | 
return self._real_branch.append_revision(*revision_ids)  | 
|
939  | 
||
940  | 
    @needs_write_lock
 | 
|
941  | 
def pull(self, source, overwrite=False, stop_revision=None):  | 
|
942  | 
self._ensure_real()  | 
|
943  | 
self._real_branch.pull(  | 
|
944  | 
source, overwrite=overwrite, stop_revision=stop_revision)  | 
|
945  | 
||
| 
2018.14.3
by Andrew Bennetts
 Make a couple more branch_implementations tests pass.  | 
946  | 
    @needs_read_lock
 | 
947  | 
def push(self, target, overwrite=False, stop_revision=None):  | 
|
948  | 
self._ensure_real()  | 
|
| 
2018.5.97
by Andrew Bennetts
 Fix more tests.  | 
949  | 
return self._real_branch.push(  | 
| 
2018.14.3
by Andrew Bennetts
 Make a couple more branch_implementations tests pass.  | 
950  | 
target, overwrite=overwrite, stop_revision=stop_revision)  | 
951  | 
||
952  | 
def is_locked(self):  | 
|
953  | 
return self._lock_count >= 1  | 
|
954  | 
||
| 
2018.5.83
by Andrew Bennetts
 Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.  | 
955  | 
def set_last_revision_info(self, revno, revision_id):  | 
956  | 
self._ensure_real()  | 
|
| 
2018.5.105
by Andrew Bennetts
 Implement revision_history caching for RemoteBranch.  | 
957  | 
self._clear_cached_state()  | 
| 
2018.5.83
by Andrew Bennetts
 Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.  | 
958  | 
return self._real_branch.set_last_revision_info(revno, revision_id)  | 
959  | 
||
| 
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.  | 
960  | 
def generate_revision_history(self, revision_id, last_rev=None,  | 
961  | 
other_branch=None):  | 
|
962  | 
self._ensure_real()  | 
|
963  | 
return self._real_branch.generate_revision_history(  | 
|
964  | 
revision_id, last_rev=last_rev, other_branch=other_branch)  | 
|
965  | 
||
| 
2018.5.96
by Andrew Bennetts
 Merge from bzr.dev, resolving the worst of the semantic conflicts, but there's  | 
966  | 
    @property
 | 
967  | 
def tags(self):  | 
|
968  | 
self._ensure_real()  | 
|
969  | 
return self._real_branch.tags  | 
|
970  | 
||
| 
2018.5.97
by Andrew Bennetts
 Fix more tests.  | 
971  | 
def set_push_location(self, location):  | 
972  | 
self._ensure_real()  | 
|
973  | 
return self._real_branch.set_push_location(location)  | 
|
974  | 
||
975  | 
def update_revisions(self, other, stop_revision=None):  | 
|
976  | 
self._ensure_real()  | 
|
977  | 
return self._real_branch.update_revisions(  | 
|
978  | 
other, stop_revision=stop_revision)  | 
|
979  | 
||
| 
1752.2.30
by Martin Pool
 Start adding a RemoteBzrDir, etc  | 
980  | 
|
| 
2018.14.1
by Andrew Bennetts
 Update to current hpss branch? Fix lots of test failures.  | 
981  | 
class RemoteBranchConfig(BranchConfig):  | 
982  | 
||
983  | 
def username(self):  | 
|
984  | 
self.branch._ensure_real()  | 
|
985  | 
return self.branch._real_branch.get_config().username()  | 
|
986  | 
||
| 
2018.14.2
by Andrew Bennetts
 All but one repository_implementation tests for RemoteRepository passing.  | 
987  | 
def _get_branch_data_config(self):  | 
988  | 
self.branch._ensure_real()  | 
|
989  | 
if self._branch_data_config is None:  | 
|
990  | 
self._branch_data_config = TreeConfig(self.branch._real_branch)  | 
|
991  | 
return self._branch_data_config  | 
|
992  |