~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/local.py

  • Committer: Andrew Bennetts
  • Date: 2010-03-11 04:33:41 UTC
  • mfrom: (4797.33.4 2.1)
  • mto: This revision was merged to the branch mainline in revision 5082.
  • Revision ID: andrew.bennetts@canonical.com-20100311043341-rzdik83fnactjsxs
Merge lp:bzr/2.1, including fixes for #496813, #526211, #526353.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#
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
20
20
"""
21
21
 
22
22
import os
23
 
from stat import ST_MODE, S_ISDIR, S_IMODE
 
23
from stat import ST_MODE, S_ISDIR, ST_SIZE, S_IMODE
24
24
import sys
25
25
 
26
26
from bzrlib.lazy_import import lazy_import
33
33
    osutils,
34
34
    urlutils,
35
35
    symbol_versioning,
 
36
    transport,
36
37
    )
 
38
from bzrlib.trace import mutter
37
39
from bzrlib.transport import LateReadError
38
40
""")
39
41
 
97
99
         - relative_reference is url escaped.
98
100
        """
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)
105
104
 
106
105
    def abspath(self, relpath):
400
399
 
401
400
    def rename(self, rel_from, rel_to):
402
401
        path_from = self._abspath(rel_from)
403
 
        path_to = self._abspath(rel_to)
404
402
        try:
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)
484
481
        path = relpath
485
482
        try:
486
483
            path = self._abspath(relpath)
487
 
            return os.lstat(path)
 
484
            return os.stat(path)
488
485
        except (IOError, OSError),e:
489
486
            self._translate_error(e, path)
490
487
 
518
515
        except (IOError, OSError),e:
519
516
            self._translate_error(e, path)
520
517
 
521
 
    if osutils.host_os_dereferences_symlinks():
522
 
        def readlink(self, relpath):
523
 
            """See Transport.readlink."""
524
 
            return osutils.readlink(self._abspath(relpath))
525
 
 
526
 
    if osutils.hardlinks_good():
527
 
        def hardlink(self, source, link_name):
528
 
            """See Transport.link."""
529
 
            try:
530
 
                os.link(self._abspath(source), self._abspath(link_name))
531
 
            except (IOError, OSError), e:
532
 
                self._translate_error(e, source)
533
 
 
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))
541
 
            )
542
 
 
543
 
            try:
544
 
                os.symlink(source_rel, self._abspath(link_name))
545
 
            except (IOError, OSError), e:
546
 
                self._translate_error(e, source_rel)
547
 
 
548
518
    def _can_roundtrip_unix_modebits(self):
549
519
        if sys.platform == 'win32':
550
520
            # anyone else?