1
# Copyright (C) 2005-2011 Canonical Ltd
1
# Copyright (C) 2005, 2006 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
23
from stat import ST_MODE, S_ISDIR, S_IMODE
23
from stat import ST_MODE, S_ISDIR, ST_SIZE, S_IMODE
26
26
from bzrlib.lazy_import import lazy_import
38
from bzrlib.trace import mutter
37
39
from bzrlib.transport import LateReadError
40
42
from bzrlib import transport
43
_append_flags = os.O_CREAT | os.O_APPEND | os.O_WRONLY | osutils.O_BINARY | osutils.O_NOINHERIT
44
_put_non_atomic_flags = os.O_CREAT | os.O_TRUNC | os.O_WRONLY | osutils.O_BINARY | osutils.O_NOINHERIT
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
47
49
class LocalTransport(transport.Transport):
97
99
- relative_reference is url escaped.
99
101
if relative_reference in ('.', ''):
100
# _local_base normally has a trailing slash; strip it so that stat
101
# on a transport pointing to a symlink reads the link not the
102
# referent but be careful of / and c:\
103
return osutils.split(self._local_base)[0]
102
return self._local_base
104
103
return self._local_base + urlutils.unescape(relative_reference)
106
105
def abspath(self, relpath):
161
160
transport._file_streams[canonical_url].flush()
163
162
path = self._abspath(relpath)
164
return osutils.open_file(path, 'rb')
163
return open(path, 'rb')
165
164
except (IOError, OSError),e:
166
165
if e.errno == errno.EISDIR:
167
166
return LateReadError(relpath)
330
329
# initialise the file
331
330
self.put_bytes_non_atomic(relpath, "", mode=mode)
332
331
abspath = self._abspath(relpath)
333
handle = osutils.open_file(abspath, 'wb')
332
handle = open(abspath, 'wb')
334
333
if mode is not None:
335
334
self._check_mode_and_size(abspath, handle.fileno(), mode)
336
335
transport._file_streams[self.abspath(relpath)] = handle
401
400
def rename(self, rel_from, rel_to):
402
401
path_from = self._abspath(rel_from)
403
path_to = self._abspath(rel_to)
405
403
# *don't* call bzrlib.osutils.rename, because we want to
406
# detect conflicting names on rename, and osutils.rename tries to
407
# mask cross-platform differences there
408
os.rename(path_from, path_to)
404
# detect errors on rename
405
os.rename(path_from, self._abspath(rel_to))
409
406
except (IOError, OSError),e:
410
407
# TODO: What about path_to?
411
408
self._translate_error(e, path_from)
518
515
except (IOError, OSError),e:
519
516
self._translate_error(e, path)
521
if osutils.host_os_dereferences_symlinks():
522
def readlink(self, relpath):
523
"""See Transport.readlink."""
524
return osutils.readlink(self._abspath(relpath))
526
if osutils.hardlinks_good():
527
def hardlink(self, source, link_name):
528
"""See Transport.link."""
530
os.link(self._abspath(source), self._abspath(link_name))
531
except (IOError, OSError), e:
532
self._translate_error(e, source)
534
if osutils.has_symlinks():
535
def symlink(self, source, link_name):
536
"""See Transport.symlink."""
537
abs_link_dirpath = urlutils.dirname(self.abspath(link_name))
538
source_rel = urlutils.file_relpath(
539
urlutils.strip_trailing_slash(abs_link_dirpath),
540
urlutils.strip_trailing_slash(self.abspath(source))
544
os.symlink(source_rel, self._abspath(link_name))
545
except (IOError, OSError), e:
546
self._translate_error(e, source_rel)
548
518
def _can_roundtrip_unix_modebits(self):
549
519
if sys.platform == 'win32':