~bzr-pqm/bzr/bzr.dev

1534.4.9 by Robert Collins
Add a readonly decorator for transports.
1
# Copyright (C) 2006 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
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
17
"""Implementation of Transport that adapts another transport to be readonly."""
18
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.
19
from bzrlib.errors import TransportNotPossible, NoSmartServer, NoSmartMedium
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
20
from bzrlib.transport.decorator import TransportDecorator, DecoratorServer
21
22
23
class ReadonlyTransportDecorator(TransportDecorator):
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
24
    """A decorator that can convert any transport to be readonly.
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
25
26
    This is requested via the 'readonly+' prefix to get_transport().
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
27
    """
28
1955.3.15 by John Arbash Meinel
Deprecate 'Transport.append' in favor of Transport.append_file or Transport.append_bytes
29
    def append_file(self, relpath, f, mode=None):
30
        """See Transport.append_file()."""
31
        raise TransportNotPossible('readonly transport')
32
    
33
    def append_bytes(self, relpath, bytes, mode=None):
34
        """See Transport.append_bytes()."""
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
35
        raise TransportNotPossible('readonly transport')
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
36
    
37
    @classmethod
38
    def _get_url_prefix(self):
39
        """Readonly transport decorators are invoked via 'readonly+'"""
40
        return 'readonly+'
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
41
42
    def delete(self, relpath):
43
        """See Transport.delete()."""
44
        raise TransportNotPossible('readonly transport')
45
1534.4.15 by Robert Collins
Remove shutil dependency in upgrade - create a delete_tree method for transports.
46
    def delete_tree(self, relpath):
47
        """See Transport.delete_tree()."""
48
        raise TransportNotPossible('readonly transport')
49
1955.3.6 by John Arbash Meinel
Lots of deprecation warnings, but no errors
50
    def put_file(self, relpath, f, mode=None):
51
        """See Transport.put_file()."""
52
        raise TransportNotPossible('readonly transport')
53
54
    def put_bytes(self, relpath, bytes, mode=None):
55
        """See Transport.put_bytes()."""
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
56
        raise TransportNotPossible('readonly transport')
57
58
    def mkdir(self, relpath, mode=None):
59
        """See Transport.mkdir()."""
60
        raise TransportNotPossible('readonly transport')
61
62
    def is_readonly(self):
63
        """See Transport.is_readonly."""
64
        return True
65
1534.4.15 by Robert Collins
Remove shutil dependency in upgrade - create a delete_tree method for transports.
66
    def rmdir(self, relpath):
67
        """See Transport.rmdir."""
68
        raise TransportNotPossible('readonly transport')
69
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
70
    def lock_write(self, relpath):
71
        """See Transport.lock_write."""
72
        raise TransportNotPossible('readonly transport')
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
73
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.
74
    def get_smart_client(self):
75
        raise NoSmartServer(self.base)
76
77
    def get_smart_medium(self):
78
        raise NoSmartMedium(self)
79
80
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
81
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
82
class ReadonlyServer(DecoratorServer):
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
83
    """Server for the ReadonlyTransportDecorator for testing with."""
84
1558.10.2 by Robert Collins
Refactor the FakeNFS support into a TransportDecorator.
85
    def get_decorator_class(self):
86
        return ReadonlyTransportDecorator
1534.4.9 by Robert Collins
Add a readonly decorator for transports.
87
88
89
def get_test_permutations():
90
    """Return the permutations to be used in testing."""
91
    return [(ReadonlyTransportDecorator, ReadonlyServer),
92
            ]