Repository navigation
Expand file tree
/
Copy pathcompat.py
More file actions
95 lines (68 loc) · 2.46 KB
/
Copy pathcompat.py
File metadata and controls
95 lines (68 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# Copyright (C) 2008, 2009 Michael Trier ([email protected]) and contributors
#
# This module is part of GitPython and is released under the
# 3-Clause BSD License: https://opensource.org/license/bsd-3-clause/
"""Utilities to help provide compatibility with Python 3.
This module exists for historical reasons. Code outside GitPython may make use of public
members of this module, but is unlikely to benefit from doing so. GitPython continues to
use some of these utilities, in some cases for compatibility across different platforms.
"""
import locale
import sys
from gitdb.utils.encoding import force_bytes, force_text # noqa: F401
# typing --------------------------------------------------------------------
from typing import (
Any, # noqa: F401
AnyStr,
Dict, # noqa: F401
IO, # noqa: F401
Optional,
Tuple, # noqa: F401
Type, # noqa: F401
Union,
overload,
)
# ---------------------------------------------------------------------------
defenc = sys.getfilesystemencoding()
"""The encoding used to convert between Unicode and bytes filenames."""
@overload
def safe_decode(s: None) -> None: ...
@overload
def safe_decode(s: AnyStr) -> str: ...
def safe_decode(s: Union[AnyStr, None]) -> Optional[str]:
"""Safely decode a binary string to Unicode."""
if isinstance(s, str):
return s
elif isinstance(s, bytes):
return s.decode(defenc, "surrogateescape")
elif s is None:
return None
else:
raise TypeError("Expected bytes or text, but got %r" % (s,))
@overload
def safe_encode(s: None) -> None: ...
@overload
def safe_encode(s: AnyStr) -> bytes: ...
def safe_encode(s: Optional[AnyStr]) -> Optional[bytes]:
"""Encode text to bytes, preserving bytes recovered by :func:`safe_decode`."""
if isinstance(s, str):
return s.encode(defenc, "surrogateescape")
elif isinstance(s, bytes):
return s
elif s is None:
return None
else:
raise TypeError("Expected bytes or text, but got %r" % (s,))
@overload
def win_encode(s: None) -> None: ...
@overload
def win_encode(s: AnyStr) -> bytes: ...
def win_encode(s: Optional[AnyStr]) -> Optional[bytes]:
"""Encode Unicode strings for process arguments on Windows."""
if isinstance(s, str):
return s.encode(locale.getpreferredencoding(False))
elif isinstance(s, bytes):
return s
elif s is not None:
raise TypeError("Expected bytes or text, but got %r" % (s,))
return None