hgext/fsmonitor/pywatchman/encoding.py
changeset 30656 16f4b341288d
child 43385 6469c23a40a2
equal deleted inserted replaced
30655:f35397fe0c04 30656:16f4b341288d
       
     1 # Copyright 2016-present Facebook, Inc.
       
     2 # All rights reserved.
       
     3 #
       
     4 # Redistribution and use in source and binary forms, with or without
       
     5 # modification, are permitted provided that the following conditions are met:
       
     6 #
       
     7 #  * Redistributions of source code must retain the above copyright notice,
       
     8 #    this list of conditions and the following disclaimer.
       
     9 #
       
    10 #  * Redistributions in binary form must reproduce the above copyright notice,
       
    11 #    this list of conditions and the following disclaimer in the documentation
       
    12 #    and/or other materials provided with the distribution.
       
    13 #
       
    14 #  * Neither the name Facebook nor the names of its contributors may be used to
       
    15 #    endorse or promote products derived from this software without specific
       
    16 #    prior written permission.
       
    17 #
       
    18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
       
    19 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    20 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
       
    21 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
       
    22 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       
    23 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
       
    24 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
       
    25 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
       
    26 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    28 
       
    29 from __future__ import absolute_import
       
    30 from __future__ import division
       
    31 from __future__ import print_function
       
    32 # no unicode literals
       
    33 
       
    34 '''Module to deal with filename encoding on the local system, as returned by
       
    35 Watchman.'''
       
    36 
       
    37 import sys
       
    38 
       
    39 from . import (
       
    40     compat,
       
    41 )
       
    42 
       
    43 if compat.PYTHON3:
       
    44     default_local_errors = 'surrogateescape'
       
    45 
       
    46     def get_local_encoding():
       
    47         if sys.platform == 'win32':
       
    48             # Watchman always returns UTF-8 encoded strings on Windows.
       
    49             return 'utf-8'
       
    50         # On the Python 3 versions we support, sys.getfilesystemencoding never
       
    51         # returns None.
       
    52         return sys.getfilesystemencoding()
       
    53 else:
       
    54     # Python 2 doesn't support surrogateescape, so use 'strict' by
       
    55     # default. Users can register a custom surrogateescape error handler and use
       
    56     # that if they so desire.
       
    57     default_local_errors = 'strict'
       
    58 
       
    59     def get_local_encoding():
       
    60         if sys.platform == 'win32':
       
    61             # Watchman always returns UTF-8 encoded strings on Windows.
       
    62             return 'utf-8'
       
    63         fsencoding = sys.getfilesystemencoding()
       
    64         if fsencoding is None:
       
    65             # This is very unlikely to happen, but if it does, just use UTF-8
       
    66             fsencoding = 'utf-8'
       
    67         return fsencoding
       
    68 
       
    69 def encode_local(s):
       
    70     return s.encode(get_local_encoding(), default_local_errors)
       
    71 
       
    72 def decode_local(bs):
       
    73     return bs.decode(get_local_encoding(), default_local_errors)