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