42
42
from bzrlib import transport
45
_append_flags = os.O_CREAT | os.O_APPEND | os.O_WRONLY | osutils.O_BINARY
46
_put_non_atomic_flags = os.O_CREAT | os.O_TRUNC | os.O_WRONLY | osutils.O_BINARY
45
_append_flags = os.O_CREAT | os.O_APPEND | os.O_WRONLY | osutils.O_BINARY | osutils.O_NOINHERIT
46
_put_non_atomic_flags = os.O_CREAT | os.O_TRUNC | os.O_WRONLY | osutils.O_BINARY | osutils.O_NOINHERIT
49
49
class LocalTransport(transport.Transport):
99
99
- relative_reference is url escaped.
101
101
if relative_reference in ('.', ''):
102
return self._local_base
102
# _local_base normally has a trailing slash; strip it so that stat
103
# on a transport pointing to a symlink reads the link not the
104
# referent but be careful of / and c:\
105
return osutils.split(self._local_base)[0]
103
106
return self._local_base + urlutils.unescape(relative_reference)
105
108
def abspath(self, relpath):
160
163
transport._file_streams[canonical_url].flush()
162
165
path = self._abspath(relpath)
163
return open(path, 'rb')
166
return osutils.open_file(path, 'rb')
164
167
except (IOError, OSError),e:
165
168
if e.errno == errno.EISDIR:
166
169
return LateReadError(relpath)
329
332
# initialise the file
330
333
self.put_bytes_non_atomic(relpath, "", mode=mode)
331
334
abspath = self._abspath(relpath)
332
handle = open(abspath, 'wb')
335
handle = osutils.open_file(abspath, 'wb')
333
336
if mode is not None:
334
337
self._check_mode_and_size(abspath, handle.fileno(), mode)
335
338
transport._file_streams[self.abspath(relpath)] = handle
400
403
def rename(self, rel_from, rel_to):
401
404
path_from = self._abspath(rel_from)
405
path_to = self._abspath(rel_to)
403
407
# *don't* call bzrlib.osutils.rename, because we want to
404
# detect errors on rename
405
os.rename(path_from, self._abspath(rel_to))
408
# detect conflicting names on rename, and osutils.rename tries to
409
# mask cross-platform differences there
410
os.rename(path_from, path_to)
406
411
except (IOError, OSError),e:
407
412
# TODO: What about path_to?
408
413
self._translate_error(e, path_from)
515
520
except (IOError, OSError),e:
516
521
self._translate_error(e, path)
523
if osutils.host_os_dereferences_symlinks():
524
def readlink(self, relpath):
525
"""See Transport.readlink."""
526
return osutils.readlink(self._abspath(relpath))
528
if osutils.hardlinks_good():
529
def hardlink(self, source, link_name):
530
"""See Transport.link."""
532
os.link(self._abspath(source), self._abspath(link_name))
533
except (IOError, OSError), e:
534
self._translate_error(e, source)
536
if osutils.has_symlinks():
537
def symlink(self, source, link_name):
538
"""See Transport.symlink."""
539
abs_link_dirpath = urlutils.dirname(self.abspath(link_name))
540
source_rel = urlutils.file_relpath(
541
urlutils.strip_trailing_slash(abs_link_dirpath),
542
urlutils.strip_trailing_slash(self.abspath(source))
546
os.symlink(source_rel, self._abspath(link_name))
547
except (IOError, OSError), e:
548
self._translate_error(e, source_rel)
518
550
def _can_roundtrip_unix_modebits(self):
519
551
if sys.platform == 'win32':