~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/local.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-09-29 22:03:03 UTC
  • mfrom: (5416.2.6 jam-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20100929220303-cr95h8iwtggco721
(mbp) Add 'break-lock --force'

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
from bzrlib import transport
43
43
 
44
44
 
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
47
47
 
48
48
 
49
49
class LocalTransport(transport.Transport):
99
99
         - relative_reference is url escaped.
100
100
        """
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)
104
107
 
105
108
    def abspath(self, relpath):
160
163
            transport._file_streams[canonical_url].flush()
161
164
        try:
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
399
402
 
400
403
    def rename(self, rel_from, rel_to):
401
404
        path_from = self._abspath(rel_from)
 
405
        path_to = self._abspath(rel_to)
402
406
        try:
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)
481
486
        path = relpath
482
487
        try:
483
488
            path = self._abspath(relpath)
484
 
            return os.stat(path)
 
489
            return os.lstat(path)
485
490
        except (IOError, OSError),e:
486
491
            self._translate_error(e, path)
487
492
 
515
520
        except (IOError, OSError),e:
516
521
            self._translate_error(e, path)
517
522
 
 
523
    if osutils.host_os_dereferences_symlinks():
 
524
        def readlink(self, relpath):
 
525
            """See Transport.readlink."""
 
526
            return osutils.readlink(self._abspath(relpath))
 
527
 
 
528
    if osutils.hardlinks_good():
 
529
        def hardlink(self, source, link_name):
 
530
            """See Transport.link."""
 
531
            try:
 
532
                os.link(self._abspath(source), self._abspath(link_name))
 
533
            except (IOError, OSError), e:
 
534
                self._translate_error(e, source)
 
535
 
 
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))
 
543
            )
 
544
 
 
545
            try:
 
546
                os.symlink(source_rel, self._abspath(link_name))
 
547
            except (IOError, OSError), e:
 
548
                self._translate_error(e, source_rel)
 
549
 
518
550
    def _can_roundtrip_unix_modebits(self):
519
551
        if sys.platform == 'win32':
520
552
            # anyone else?