~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/local_transport.py

  • Committer: John Arbash Meinel
  • Date: 2005-07-19 22:13:01 UTC
  • mto: (1185.11.1)
  • mto: This revision was merged to the branch mainline in revision 1396.
  • Revision ID: john@arbash-meinel.com-20050719221300-9a7b9bc9d866a9b9
Removed encode/decode from Transport.put/get, added more exceptions that can be thrown.
Added readonly tests for Transports.
Added test for HttpTransport.

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
filesystem access.
5
5
"""
6
6
 
7
 
from bzrlib.transport import Transport, register_transport, TransportError
8
 
import os
 
7
from bzrlib.transport import Transport, register_transport, \
 
8
    TransportError, NoSuchFile, FileExists
 
9
import os, errno
9
10
 
10
11
class LocalTransportError(TransportError):
11
12
    pass
48
49
    def has(self, relpath):
49
50
        return os.access(self.abspath(relpath), os.F_OK)
50
51
 
51
 
    def get(self, relpath, decode=False):
 
52
    def get(self, relpath):
52
53
        """Get the file at the given relative path.
53
54
 
54
55
        :param relpath: The relative path to the file
55
 
        :param decode:  If True, assume the file is utf-8 encoded and
56
 
                        decode it into Unicode
57
56
        """
58
57
        try:
59
 
            if decode:
60
 
                import codecs
61
 
                return codecs.open(self.abspath(relpath), 'rb',
62
 
                        encoding='utf-8', buffering=60000)
63
 
            else:
64
 
                return open(self.abspath(relpath), 'rb')
 
58
            path = self.abspath(relpath)
 
59
            return open(path, 'rb')
65
60
        except IOError,e:
66
 
            raise LocalTransportError(e)
 
61
            if e.errno == errno.ENOENT:
 
62
                raise NoSuchFile('File %r does not exist' % path, orig_error=e)
 
63
            raise LocalTransportError(orig_error=e)
67
64
 
68
 
    def put(self, relpath, f, encode=False):
 
65
    def put(self, relpath, f):
69
66
        """Copy the file-like or string object into the location.
70
67
 
71
68
        :param relpath: Location to put the contents, relative to base.
72
69
        :param f:       File-like or string object.
73
 
        :param encode:  If True, translate the contents into utf-8 encoded text.
74
70
        """
75
71
        from bzrlib.atomicfile import AtomicFile
76
72
 
77
73
        try:
78
 
            if encode:
79
 
                fp = AtomicFile(self.abspath(relpath), 'wb', encoding='utf-8')
80
 
            else:
81
 
                fp = AtomicFile(self.abspath(relpath), 'wb')
 
74
            path = self.abspath(relpath)
 
75
            fp = AtomicFile(path, 'wb')
82
76
        except IOError, e:
83
 
            raise LocalTransportError(e)
 
77
            if e.errno == errno.ENOENT:
 
78
                raise NoSuchFile('File %r does not exist' % path, orig_error=e)
 
79
            raise LocalTransportError(orig_error=e)
84
80
        try:
85
81
            self._pump(f, fp)
86
82
            fp.commit()
92
88
        try:
93
89
            os.mkdir(self.abspath(relpath))
94
90
        except OSError,e:
95
 
            raise LocalTransportError(e)
 
91
            if e.errno == errno.EEXIST:
 
92
                raise FileExists(orig_error=e)
 
93
            elif e.errno == errno.ENOENT:
 
94
                raise NoSuchFile(orig_error=e)
 
95
            raise LocalTransportError(orig_error=e)
96
96
 
97
 
    def append(self, relpath, f, encode=False):
 
97
    def append(self, relpath, f):
98
98
        """Append the text in the file-like object into the final
99
99
        location.
100
100
        """
101
 
        if encode:
102
 
            fp = codecs.open(self.abspath(relpath), 'ab',
103
 
                    encoding='utf-8', buffering=60000)
104
 
        else:
105
 
            fp = open(self.abspath(relpath), 'ab')
 
101
        fp = open(self.abspath(relpath), 'ab')
106
102
        self._pump(f, fp)
107
103
 
108
104
    def copy(self, rel_from, rel_to):
113
109
        try:
114
110
            shutil.copy(path_from, path_to)
115
111
        except OSError,e:
116
 
            raise LocalTransportError(e)
 
112
            raise LocalTransportError(orig_error=e)
117
113
 
118
114
    def move(self, rel_from, rel_to):
119
115
        """Move the item at rel_from to the location at rel_to"""
123
119
        try:
124
120
            os.rename(path_from, path_to)
125
121
        except OSError,e:
126
 
            raise LocalTransportError(e)
 
122
            raise LocalTransportError(orig_error=e)
127
123
 
128
124
    def delete(self, relpath):
129
125
        """Delete the item at relpath"""
130
126
        try:
131
127
            os.remove(self.abspath(relpath))
132
128
        except OSError,e:
133
 
            raise LocalTransportError(e)
 
129
            raise LocalTransportError(orig_error=e)
134
130
 
135
131
    def copy_to(self, relpaths, other, pb=None):
136
132
        """Copy a set of entries from self into another Transport.
170
166
        try:
171
167
            return os.listdir(self.abspath(relpath))
172
168
        except OSError,e:
173
 
            raise LocalTransportError(e)
 
169
            raise LocalTransportError(orig_error=e)
174
170
 
175
171
    def stat(self, relpath):
176
172
        """Return the stat information for a file.
178
174
        try:
179
175
            return os.stat(self.abspath(relpath))
180
176
        except OSError,e:
181
 
            raise LocalTransportError(e)
 
177
            raise LocalTransportError(orig_error=e)
182
178
 
183
179
    def lock_read(self, relpath):
184
180
        """Lock the given file for shared (read) access.