~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: John Arbash Meinel
  • Date: 2006-01-16 20:55:04 UTC
  • mto: (1685.1.1 bzr-encoding)
  • mto: This revision was merged to the branch mainline in revision 1752.
  • Revision ID: john@arbash-meinel.com-20060116205504-a50588b5612d2912
Adding bzrlib.osutils.unicode_filename to handle unicode normalization for file paths.

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
import time
30
30
import types
31
31
import tempfile
 
32
import unicodedata
32
33
 
33
34
import bzrlib
34
35
from bzrlib.errors import (BzrError,
598
599
        raise BzrBadParameter(unicode_or_utf8_string)
599
600
 
600
601
 
 
602
_platform_normalizes_filenames = False
 
603
if sys.platform == 'darwin':
 
604
    _platform_normalizes_filenames = True
 
605
 
 
606
 
 
607
def normalizes_filenames():
 
608
    """Return True if this platform normalizes unicode filenames.
 
609
 
 
610
    Mac OSX does, Windows/Linux do not.
 
611
    """
 
612
    return _platform_normalizes_filenames
 
613
 
 
614
 
 
615
if _platform_normalizes_filenames:
 
616
    def unicode_filename(path):
 
617
        """Make sure 'path' is a properly normalized filename.
 
618
 
 
619
        On platforms where the system normalizes filenames (Mac OSX),
 
620
        you can access a file by any path which will normalize
 
621
        correctly.
 
622
        Internally, bzr only supports NFC/NFKC normalization, since
 
623
        that is the standard for XML documents.
 
624
        So we return an normalized path, and indicate this has been
 
625
        properly normalized.
 
626
 
 
627
        :return: (path, is_normalized) Return a path which can
 
628
                access the file, and whether or not this path is
 
629
                normalized.
 
630
        """
 
631
        return unicodedata.normalize('NFKC', path), True
 
632
else:
 
633
    def unicode_filename(path):
 
634
        """Make sure 'path' is a properly normalized filename.
 
635
 
 
636
        On platforms where the system does not normalize filenames 
 
637
        (Windows, Linux), you have to access a file by its exact path.
 
638
        Internally, bzr only supports NFC/NFKC normalization, since
 
639
        that is the standard for XML documents.
 
640
        So we return the original path, and indicate if this is
 
641
        properly normalized.
 
642
 
 
643
        :return: (path, is_normalized) Return a path which can
 
644
                access the file, and whether or not this path is
 
645
                normalized.
 
646
        """
 
647
        return path, unicodedata.normalize('NFKC', path) == path
 
648
 
 
649
 
601
650
def terminal_width():
602
651
    """Return estimated terminal width."""
603
652