~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/remote.py

Test and implement RemoteBranch.last_revision_info()
(Wouter van Heyst, Robert Collins, Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Canonical Ltd
 
1
# Copyright (C) 2006, 2007 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
20
20
from urlparse import urlparse
21
21
 
22
22
from bzrlib import branch, errors, repository
 
23
from bzrlib.branch import BranchReferenceFormat
23
24
from bzrlib.bzrdir import BzrDir, BzrDirFormat, RemoteBzrDirFormat
24
 
from bzrlib.branch import BranchReferenceFormat
 
25
from bzrlib.revision import NULL_REVISION
25
26
from bzrlib.smart import client, vfs
26
27
from bzrlib.urlutils import unescape
27
28
 
30
31
class RemoteBzrDir(BzrDir):
31
32
    """Control directory on a remote server, accessed by HPSS."""
32
33
 
33
 
    def __init__(self, transport):
 
34
    def __init__(self, transport, _client=None):
 
35
        """Construct a RemoteBzrDir.
 
36
 
 
37
        :param _client: Private parameter for testing. Disables probing and the
 
38
            use of a real bzrdir.
 
39
        """
34
40
        BzrDir.__init__(self, transport, RemoteBzrDirFormat())
 
41
        if _client is not None:
 
42
            self.client = _client
 
43
            return
 
44
 
35
45
        self.client = transport.get_smart_client()
36
46
        # this object holds a delegated bzrdir that uses file-level operations
37
47
        # to talk to the other side
49
59
        response = smartclient.call('probe_dont_use', path)
50
60
        if response == ('no',):
51
61
            raise errors.NotBranchError(path=transport.base)
52
 
        self._branch = None
53
62
 
54
63
    def create_repository(self, shared=False):
55
64
        return RemoteRepository(
205
214
    At the moment most operations are mapped down to simple file operations.
206
215
    """
207
216
 
208
 
    def __init__(self, remote_bzrdir, remote_repository, real_branch=None):
 
217
    def __init__(self, remote_bzrdir, remote_repository, real_branch=None,
 
218
        _client=None):
209
219
        """Create a RemoteBranch instance.
210
220
 
211
221
        :param real_branch: An optional local implementation of the branch
212
222
            format, usually accessing the data via the VFS.
 
223
        :param _client: Private parameter for testing.
213
224
        """
214
225
        self.bzrdir = remote_bzrdir
215
 
        self._client = client.SmartClient(self.bzrdir.client)
 
226
        if _client is not None:
 
227
            self._client = _client
 
228
        else:
 
229
            self._client = client.SmartClient(self.bzrdir.client)
216
230
        self.repository = remote_repository
217
231
        if real_branch is not None:
218
232
            self._real_branch = real_branch
230
244
    def break_lock(self):
231
245
        return self._real_branch.break_lock()
232
246
 
 
247
    def last_revision_info(self):
 
248
        """See Branch.last_revision_info()."""
 
249
        path = self.bzrdir._path_for_remote_call(self._client)
 
250
        response = self._client.call('Branch.last_revision_info', path)
 
251
        assert response[0] == 'ok', 'unexpected response code %s' % response
 
252
        revno = int(response[1])
 
253
        last_revision = response[2].decode('utf8')
 
254
        if last_revision == '':
 
255
            last_revision = NULL_REVISION
 
256
        return (revno, last_revision)
 
257
 
233
258
    def revision_history(self):
234
259
        """See Branch.revision_history()."""
235
260
        # XXX: TODO: this does not cache the revision history for the duration