~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/local.py

Basic implementation for local transport

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
 
38
38
 
39
39
_append_flags = os.O_CREAT | os.O_APPEND | os.O_WRONLY | osutils.O_BINARY
 
40
_non_atomic_put_flags = os.O_CREAT | os.O_TRUNC | os.O_WRONLY | osutils.O_BINARY
40
41
 
41
42
 
42
43
class LocalTransport(Transport):
131
132
            self._translate_error(e, path)
132
133
 
133
134
    def put(self, relpath, f, mode=None):
134
 
        """Copy the file-like or string object into the location.
 
135
        """Copy the file-like object into the location.
135
136
 
136
137
        :param relpath: Location to put the contents, relative to base.
137
 
        :param f:       File-like or string object.
 
138
        :param f:       File-like object.
 
139
        :param mode: The mode for the newly created file, 
 
140
                     None means just use the default
138
141
        """
139
142
        from bzrlib.atomicfile import AtomicFile
140
143
 
151
154
        finally:
152
155
            fp.close()
153
156
 
 
157
    def non_atomic_put(self, relpath, f, mode=None):
 
158
        """Copy the file-like object into the target location.
 
159
 
 
160
        This function is not strictly safe to use. It is only meant to
 
161
        be used when you already know that the target does not exist.
 
162
        It is not safe, because it will open and truncate the remote
 
163
        file. So there may be a time when the file has invalid contents.
 
164
 
 
165
        :param relpath: The remote location to put the contents.
 
166
        :param f:       File-like object.
 
167
        :param mode:    Possible access permissions for new file.
 
168
                        None means do not set remote permissions.
 
169
        """
 
170
        abspath = self._abspath(relpath)
 
171
        if mode is None:
 
172
            # os.open() will automatically use the umask
 
173
            local_mode = 0666
 
174
        else:
 
175
            local_mode = mode
 
176
        try:
 
177
            fd = os.open(abspath, _non_atomic_put_flags, local_mode)
 
178
        except (IOError, OSError),e:
 
179
            self._translate_error(e, relpath)
 
180
        try:
 
181
            st = os.fstat(fd)
 
182
            if mode is not None and mode != S_IMODE(st.st_mode):
 
183
                # Because of umask, we may still need to chmod the file.
 
184
                # But in the general case, we won't have to
 
185
                os.chmod(abspath, mode)
 
186
            self._pump_to_fd(f, fd)
 
187
        finally:
 
188
            os.close(fd)
 
189
 
154
190
    def iter_files_recursive(self):
155
191
        """Iter the relative paths of files in the transports sub-tree."""
156
192
        queue = list(self.list_dir(u'.'))