/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
1
# Copyright (C) 2006 Canonical Ltd
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
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
20
1752.2.33 by Martin Pool
[broken] more hpss methods and adapt to bzrdir tests
21
from bzrlib import bzrdir, branch, errors, repository
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
22
from bzrlib.bzrdir import BzrDir, BzrDirFormat
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
23
from bzrlib.branch import Branch, BranchFormat
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
24
from bzrlib.trace import mutter
25
from bzrlib.transport.smart import SmartTransport
26
27
1752.2.33 by Martin Pool
[broken] more hpss methods and adapt to bzrdir tests
28
class RemoteBzrDirFormat(bzrdir.BzrDirMetaFormat1):
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
29
    """Format representing bzrdirs accessed via a smart server"""
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
30
31
    def get_format_description(self):
32
        return 'bzr remote bzrdir'
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
33
    
34
    def probe_transport(self, transport):
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
35
        ## mutter("%r probe for bzrdir in %r" % (self, transport))
36
        try:
37
            transport.get_smart_client()
38
        except (NotImplementedError, AttributeError,
39
                errors.TransportNotPossible):
40
            raise errors.NoSmartServer(transport.base)
41
        else:
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
42
            return self
43
44
    def _open(self, transport):
45
        return RemoteBzrDir(transport)
46
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
47
    def __eq__(self, other):
1752.2.69 by Andrew Bennetts
Guard RemoteBzrDirFormat.__eq__ with an isinstance check.
48
        if not isinstance(other, RemoteBzrDirFormat):
49
            return False
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
50
        return self.get_format_description() == other.get_format_description()
51
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
52
53
class RemoteBzrDir(BzrDir):
54
    """Control directory on a remote server, accessed by HPSS."""
55
56
    def __init__(self, transport):
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
57
        BzrDir.__init__(self, transport, RemoteBzrDirFormat())
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
58
        self.client = transport.get_smart_client()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
59
        # this object holds a delegated bzrdir that uses file-level operations
60
        # to talk to the other side
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
61
        # XXX: We should go into find_format, but not allow it to find
62
        # RemoteBzrDirFormat and make sure it finds the real underlying format.
63
        
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
64
        default_format = BzrDirFormat.get_default_format()
65
        self._real_bzrdir = default_format.open(transport, _found=True)
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
66
        self._real_bzrdir._format.probe_transport(transport)
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
67
        self._branch = None
68
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
69
    def create_repository(self, shared=False):
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
70
        return RemoteRepository(
71
            self, self._real_bzrdir.create_repository(shared=shared))
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
72
73
    def create_branch(self):
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
74
        real_branch = self._real_bzrdir.create_branch()
75
        real_repository = real_branch.repository
76
        remote_repository = RemoteRepository(self, real_repository)
77
        return RemoteBranch(self, remote_repository, real_branch)
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
78
79
    def create_workingtree(self, revision_id=None):
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
80
        real_workingtree = self._real_bzrdir.create_workingtree(revision_id=revision_id)
81
        return RemoteWorkingTree(self, real_workingtree)
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
82
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
83
    def open_repository(self):
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
84
        return RemoteRepository(self, self._real_bzrdir.open_repository())
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
85
1752.2.87 by Andrew Bennetts
Make tests pass.
86
    def open_branch(self, _unsupported=False):
87
        real_branch = self._real_bzrdir.open_branch(unsupported=_unsupported)
1752.2.64 by Andrew Bennetts
Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.
88
        if real_branch.bzrdir is self._real_bzrdir:
89
            # This branch accessed through the smart server, so wrap the
90
            # file-level objects.
91
            real_repository = real_branch.repository
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
92
            remote_repository = RemoteRepository(self, real_repository)
1752.2.64 by Andrew Bennetts
Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.
93
            return RemoteBranch(self, remote_repository, real_branch)
94
        else:
95
            # We were redirected to somewhere else, so don't wrap.
96
            return real_branch
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
97
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
98
    def open_workingtree(self):
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
99
        return RemoteWorkingTree(self, self._real_bzrdir.open_workingtree())
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
100
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
101
    def get_branch_transport(self, branch_format):
102
        return self._real_bzrdir.get_branch_transport(branch_format)
103
1752.2.43 by Andrew Bennetts
Fix get_{branch,repository,workingtree}_transport.
104
    def get_repository_transport(self, repository_format):
105
        return self._real_bzrdir.get_repository_transport(repository_format)
106
107
    def get_workingtree_transport(self, workingtree_format):
108
        return self._real_bzrdir.get_workingtree_transport(workingtree_format)
109
1752.2.39 by Martin Pool
[broken] implement upgrade apis on remote bzrdirs
110
    def can_convert_format(self):
111
        """Upgrading of remote bzrdirs is not supported yet."""
112
        return False
113
114
    def needs_format_conversion(self, format=None):
115
        """Upgrading of remote bzrdirs is not supported yet."""
116
        return False
117
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
118
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
119
class RemoteRepositoryFormat(repository.RepositoryFormat):
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
120
    """Format for repositories accessed over rpc.
121
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
122
    Instances of this repository are represented by RemoteRepository
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
123
    instances.
124
    """
125
126
    _matchingbzrdir = RemoteBzrDirFormat
127
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
128
    def initialize(self, a_bzrdir, shared=False):
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
129
        assert isinstance(a_bzrdir, RemoteBzrDir)
130
        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.
131
    
132
    def open(self, a_bzrdir):
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
133
        assert isinstance(a_bzrdir, RemoteBzrDir)
134
        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.
135
136
    def get_format_description(self):
137
        return 'bzr remote repository'
138
139
    def __eq__(self, other):
1752.2.87 by Andrew Bennetts
Make tests pass.
140
        return self.__class__ == other.__class__
141
142
    rich_root_data = False
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
143
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
144
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
145
class RemoteRepository(object):
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
146
    """Repository accessed over rpc.
147
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
148
    For the moment everything is delegated to IO-like operations over
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
149
    the transport.
150
    """
151
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
152
    def __init__(self, remote_bzrdir, real_repository):
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
153
        self.real_repository = real_repository
154
        self.bzrdir = remote_bzrdir
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
155
        self._format = RemoteRepositoryFormat()
156
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
157
    def __getattr__(self, name):
158
        # XXX: temporary way to lazily delegate everything to the real
159
        # repository
160
        return getattr(self.real_repository, name)
161
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
162
163
class RemoteBranchFormat(branch.BranchFormat):
164
165
    def open(self, a_bzrdir):
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
166
        assert isinstance(a_bzrdir, RemoteBzrDir)
167
        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.
168
169
    def initialize(self, a_bzrdir):
170
        assert isinstance(a_bzrdir, RemoteBzrDir)
171
        return a_bzrdir.create_branch()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
172
173
174
class RemoteBranch(branch.Branch):
175
    """Branch stored on a server accessed by HPSS RPC.
176
177
    At the moment most operations are mapped down to simple file operations.
178
    """
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
179
1752.2.64 by Andrew Bennetts
Improve how RemoteBzrDir.open_branch works to handle references and not double-open repositories.
180
    def __init__(self, remote_bzrdir, remote_repository, real_branch):
181
        self.bzrdir = remote_bzrdir
182
        self.transport = remote_bzrdir.transport
183
        self.repository = remote_repository
184
        self._real_branch = real_branch
185
        self._format = RemoteBranchFormat()
186
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
187
    def lock_read(self):
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
188
        return self._real_branch.lock_read()
189
190
    def lock_write(self):
191
        return self._real_branch.lock_write()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
192
193
    def unlock(self):
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
194
        return self._real_branch.unlock()
195
196
    def break_lock(self):
197
        return self._real_branch.break_lock()
1752.2.31 by Martin Pool
[broken] some support for write operations over hpss
198
199
    def revision_history(self):
200
        return self._real_branch.revision_history()
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
201
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
202
    def set_revision_history(self, rev_history):
203
        return self._real_branch.set_revision_history(rev_history)
204
205
    def get_parent(self):
206
        return self._real_branch.get_parent()
207
        
1752.2.63 by Andrew Bennetts
Delegate set_parent.
208
    def set_parent(self, url):
209
        return self._real_branch.set_parent(url)
210
        
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
211
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
212
class RemoteWorkingTree(object):
213
1752.2.72 by Andrew Bennetts
Make Remote* classes in remote.py more consistent and remove some dead code.
214
    def __init__(self, remote_bzrdir, real_workingtree):
1752.2.50 by Andrew Bennetts
Implement RemoteBzrDir.create_{branch,workingtree}
215
        self.real_workingtree = real_workingtree
216
        self.bzrdir = remote_bzrdir
217
218
    def __getattr__(self, name):
219
        # XXX: temporary way to lazily delegate everything to the real
220
        # workingtree
221
        return getattr(self.real_workingtree, name)
222
1752.2.52 by Andrew Bennetts
Flesh out more Remote* methods needed to open and initialise remote branches/trees/repositories.
223
1752.2.30 by Martin Pool
Start adding a RemoteBzrDir, etc
224
# when first loaded, register this format.
225
#
226
# TODO: Actually this needs to be done earlier; we can hold off on loading
227
# this code until it's needed though.
228
229
# We can't use register_control_format because it adds it at a lower priority
230
# than the existing branches, whereas this should take priority.
231
BzrDirFormat._control_formats.insert(0, RemoteBzrDirFormat())