~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: Wouter van Heyst
  • Date: 2006-07-13 18:18:00 UTC
  • mfrom: (1863 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1867.
  • Revision ID: larstiq@larstiq.dyndns.org-20060713181800-4e8c4f9326597d7f
[merge] bzr.dev 1863

Show diffs side-by-side

added added

removed removed

Lines of Context:
256
256
 
257
257
 
258
258
def _win32_rename(old, new):
259
 
    fancy_rename(old, new, rename_func=os.rename, unlink_func=os.unlink)
 
259
    """We expect to be able to atomically replace 'new' with old.
 
260
 
 
261
    On win32, if new exists, it must be moved out of the way first,
 
262
    and then deleted. 
 
263
    """
 
264
    try:
 
265
        fancy_rename(old, new, rename_func=os.rename, unlink_func=os.unlink)
 
266
    except OSError, e:
 
267
        if e.errno in (errno.EPERM, errno.EACCES, errno.EBUSY, errno.EINVAL):
 
268
            # If we try to rename a non-existant file onto cwd, we get 
 
269
            # EPERM or EACCES instead of ENOENT, this will raise ENOENT 
 
270
            # if the old path doesn't exist, sometimes we get EACCES
 
271
            # On Linux, we seem to get EBUSY, on Mac we get EINVAL
 
272
            os.lstat(old)
 
273
        raise
 
274
 
 
275
 
 
276
def _mac_getcwd():
 
277
    return unicodedata.normalize('NFKC', os.getcwdu())
260
278
 
261
279
 
262
280
# Default is to just use the python builtins, but these can be rebound on
302
320
    def rmtree(path, ignore_errors=False, onerror=_win32_delete_readonly):
303
321
        """Replacer for shutil.rmtree: could remove readonly dirs/files"""
304
322
        return shutil.rmtree(path, ignore_errors, onerror)
 
323
elif sys.platform == 'darwin':
 
324
    getcwd = _mac_getcwd
305
325
 
306
326
 
307
327
def get_terminal_encoding():
775
795
    return _platform_normalizes_filenames
776
796
 
777
797
 
 
798
def _accessible_normalized_filename(path):
 
799
    """Get the unicode normalized path, and if you can access the file.
 
800
 
 
801
    On platforms where the system normalizes filenames (Mac OSX),
 
802
    you can access a file by any path which will normalize correctly.
 
803
    On platforms where the system does not normalize filenames 
 
804
    (Windows, Linux), you have to access a file by its exact path.
 
805
 
 
806
    Internally, bzr only supports NFC/NFKC normalization, since that is 
 
807
    the standard for XML documents.
 
808
 
 
809
    So return the normalized path, and a flag indicating if the file
 
810
    can be accessed by that path.
 
811
    """
 
812
 
 
813
    return unicodedata.normalize('NFKC', unicode(path)), True
 
814
 
 
815
 
 
816
def _inaccessible_normalized_filename(path):
 
817
    __doc__ = _accessible_normalized_filename.__doc__
 
818
 
 
819
    normalized = unicodedata.normalize('NFKC', unicode(path))
 
820
    return normalized, normalized == path
 
821
 
 
822
 
778
823
if _platform_normalizes_filenames:
779
 
    def unicode_filename(path):
780
 
        """Make sure 'path' is a properly normalized filename.
781
 
 
782
 
        On platforms where the system normalizes filenames (Mac OSX),
783
 
        you can access a file by any path which will normalize
784
 
        correctly.
785
 
        Internally, bzr only supports NFC/NFKC normalization, since
786
 
        that is the standard for XML documents.
787
 
        So we return an normalized path, and indicate this has been
788
 
        properly normalized.
789
 
 
790
 
        :return: (path, is_normalized) Return a path which can
791
 
                access the file, and whether or not this path is
792
 
                normalized.
793
 
        """
794
 
        return unicodedata.normalize('NFKC', path), True
 
824
    normalized_filename = _accessible_normalized_filename
795
825
else:
796
 
    def unicode_filename(path):
797
 
        """Make sure 'path' is a properly normalized filename.
798
 
 
799
 
        On platforms where the system does not normalize filenames 
800
 
        (Windows, Linux), you have to access a file by its exact path.
801
 
        Internally, bzr only supports NFC/NFKC normalization, since
802
 
        that is the standard for XML documents.
803
 
        So we return the original path, and indicate if this is
804
 
        properly normalized.
805
 
 
806
 
        :return: (path, is_normalized) Return a path which can
807
 
                access the file, and whether or not this path is
808
 
                normalized.
809
 
        """
810
 
        return path, unicodedata.normalize('NFKC', path) == path
 
826
    normalized_filename = _inaccessible_normalized_filename
811
827
 
812
828
 
813
829
def terminal_width():