1# -*- coding: utf-8 -*- 2# config.py 3# Copyright (C) 2008, 2009 Michael Trier (mtrier@gmail.com) and contributors 4# 5# This module is part of GitPython and is released under 6# the BSD License: http://www.opensource.org/licenses/bsd-license.php 7"""utilities to help provide compatibility with python 3""" 8# flake8: noqa 9 10import locale 11import os 12import sys 13 14from gitdb.utils.encoding import ( 15 force_bytes, # @UnusedImport 16 force_text # @UnusedImport 17) 18 19# typing -------------------------------------------------------------------- 20 21from typing import ( 22 Any, 23 AnyStr, 24 Dict, 25 IO, 26 Optional, 27 Tuple, 28 Type, 29 Union, 30 overload, 31) 32# --------------------------------------------------------------------------- 33 34 35is_win: bool = (os.name == 'nt') 36is_posix = (os.name == 'posix') 37is_darwin = (os.name == 'darwin') 38defenc = sys.getfilesystemencoding() 39 40 41@overload 42def safe_decode(s: None) -> None: ... 43 44 45@overload 46def safe_decode(s: AnyStr) -> str: ... 47 48 49def safe_decode(s: Union[AnyStr, None]) -> Optional[str]: 50 """Safely decodes a binary string to unicode""" 51 if isinstance(s, str): 52 return s 53 elif isinstance(s, bytes): 54 return s.decode(defenc, 'surrogateescape') 55 elif s is None: 56 return None 57 else: 58 raise TypeError('Expected bytes or text, but got %r' % (s,)) 59 60 61@overload 62def safe_encode(s: None) -> None: ... 63 64 65@overload 66def safe_encode(s: AnyStr) -> bytes: ... 67 68 69def safe_encode(s: Optional[AnyStr]) -> Optional[bytes]: 70 """Safely encodes a binary string to unicode""" 71 if isinstance(s, str): 72 return s.encode(defenc) 73 elif isinstance(s, bytes): 74 return s 75 elif s is None: 76 return None 77 else: 78 raise TypeError('Expected bytes or text, but got %r' % (s,)) 79 80 81@overload 82def win_encode(s: None) -> None: ... 83 84 85@overload 86def win_encode(s: AnyStr) -> bytes: ... 87 88 89def win_encode(s: Optional[AnyStr]) -> Optional[bytes]: 90 """Encode unicodes for process arguments on Windows.""" 91 if isinstance(s, str): 92 return s.encode(locale.getpreferredencoding(False)) 93 elif isinstance(s, bytes): 94 return s 95 elif s is not None: 96 raise TypeError('Expected bytes or text, but got %r' % (s,)) 97 return None 98