annotate mercurial/pycompat.py @ 51719:7558cee89655

dirstate: stringify a few exception messages Built in exceptions want str, and ProgrammingError converts bytes to str internally (because it subclasses RuntimeError).
author Matt Harbison <matt_harbison@yahoo.com>
date Thu, 18 Jul 2024 22:46:36 -0400
parents 7e6aae033d8d
children f4733654f144 51057ab0dffa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28818
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
1 # pycompat.py - portability shim for python 3
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
2 #
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
3 # This software may be used and distributed according to the terms of the
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
4 # GNU General Public License version 2 or any later version.
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
5
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
6 """Mercurial portability shim for python 3.
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
7
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
8 This contains aliases to hide python version-specific details from the core.
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
9 """
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
10
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
11
48869
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
12 import builtins
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
13 import codecs
48869
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
14 import concurrent.futures as futures
30578
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30500
diff changeset
15 import getopt
48869
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
16 import http.client as httplib
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
17 import http.cookiejar as cookielib
36178
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 36045
diff changeset
18 import inspect
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
19 import io
43380
579672b347d2 py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43117
diff changeset
20 import json
30302
3874ddba1ab4 py3: add a bytes version of os.name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30300
diff changeset
21 import os
48869
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
22 import queue
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30668
diff changeset
23 import shlex
48869
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
24 import socketserver
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
25 import struct
29584
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
26 import sys
38164
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 37844
diff changeset
27 import tempfile
48869
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
28 import xmlrpc.client as xmlrpclib
29584
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
29
49801
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
30 from typing import (
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
31 Any,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
32 AnyStr,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
33 BinaryIO,
50175
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
34 Callable,
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
35 Dict,
49803
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
36 Iterable,
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
37 Iterator,
49801
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
38 List,
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
39 Mapping,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
40 NoReturn,
49801
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
41 Optional,
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
42 Sequence,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
43 Tuple,
49803
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
44 Type,
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
45 TypeVar,
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
46 cast,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
47 overload,
49801
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
48 )
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
49
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
50 ispy3 = sys.version_info[0] >= 3
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
51 ispypy = '__pypy__' in sys.builtin_module_names
43773
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43768
diff changeset
52 TYPE_CHECKING = False
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43768
diff changeset
53
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43768
diff changeset
54 if not globals(): # hide this from non-pytype users
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43768
diff changeset
55 import typing
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43768
diff changeset
56
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43768
diff changeset
57 TYPE_CHECKING = typing.TYPE_CHECKING
30030
0f6d6fdd3c2a pycompat: provide 'ispy3' constant
Yuya Nishihara <yuya@tcha.org>
parents: 29801
diff changeset
58
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
59 _GetOptResult = Tuple[List[Tuple[bytes, bytes]], List[bytes]]
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
60 _T0 = TypeVar('_T0')
50175
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
61 _T1 = TypeVar('_T1')
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
62 _S = TypeVar('_S')
49803
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
63 _Tbytestr = TypeVar('_Tbytestr', bound='bytestr')
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
64
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
65
48869
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
66 def future_set_exception_info(f, exc_info):
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
67 f.set_exception(exc_info[0])
29431
80880ad3fccd py3: conditionalize the urlparse import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29414
diff changeset
68
37669
1cb54e6193a6 py3: paper over differences in future exception handling
Augie Fackler <augie@google.com>
parents: 37628
diff changeset
69
48869
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48835
diff changeset
70 FileNotFoundError = builtins.FileNotFoundError
47857
2b76255a4f74 template: FileNotFoundError is actually a built in exception
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46570
diff changeset
71
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
72
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
73 def identity(a: _T0) -> _T0:
31774
7d2cbe11ae48 pycompat: introduce identity function as a compat stub
Yuya Nishihara <yuya@tcha.org>
parents: 31573
diff changeset
74 return a
7d2cbe11ae48 pycompat: introduce identity function as a compat stub
Yuya Nishihara <yuya@tcha.org>
parents: 31573
diff changeset
75
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
76
38575
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
77 def _rapply(f, xs):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
78 if xs is None:
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
79 # assume None means non-value of optional data
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
80 return xs
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
81 if isinstance(xs, (list, set, tuple)):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
82 return type(xs)(_rapply(f, x) for x in xs)
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
83 if isinstance(xs, dict):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
84 return type(xs)((_rapply(f, k), _rapply(f, v)) for k, v in xs.items())
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
85 return f(xs)
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
86
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
87
38575
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
88 def rapply(f, xs):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
89 """Apply function recursively to every item preserving the data structure
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
90
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
91 >>> def f(x):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
92 ... return 'f(%s)' % x
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
93 >>> rapply(f, None) is None
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
94 True
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
95 >>> rapply(f, 'a')
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
96 'f(a)'
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
97 >>> rapply(f, {'a'}) == {'f(a)'}
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
98 True
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
99 >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []])
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
100 ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []]
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
101
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
102 >>> xs = [object()]
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
103 >>> rapply(identity, xs) is xs
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
104 True
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
105 """
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
106 if f is identity:
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
107 # fast path mainly for py2
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
108 return xs
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
109 return _rapply(f, xs)
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38332
diff changeset
110
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
111
48959
9ac1a4507bb3 pycompat: remove check for Python >= 3.6
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48946
diff changeset
112 if os.name == r'nt':
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
113 # MBCS (or ANSI) filesystem encoding must be used as before.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
114 # Otherwise non-ASCII filenames in existing repositories would be
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
115 # corrupted.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
116 # This must be set once prior to any fsencode/fsdecode calls.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
117 sys._enablelegacywindowsfsencoding() # pytype: disable=module-attr
43432
8d5489b048b7 py3: enable legacy fs encoding to fix filename compatibility on Windows
Yuya Nishihara <yuya@tcha.org>
parents: 43117
diff changeset
118
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
119 fsencode = os.fsencode
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
120 fsdecode = os.fsdecode
49801
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
121 oscurdir: bytes = os.curdir.encode('ascii')
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
122 oslinesep: bytes = os.linesep.encode('ascii')
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
123 osname: bytes = os.name.encode('ascii')
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
124 ospathsep: bytes = os.pathsep.encode('ascii')
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
125 ospardir: bytes = os.pardir.encode('ascii')
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
126 ossep: bytes = os.sep.encode('ascii')
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
127 osaltsep: Optional[bytes] = os.altsep.encode('ascii') if os.altsep else None
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
128 osdevnull: bytes = os.devnull.encode('ascii')
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39642
diff changeset
129
49801
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
130 sysplatform: bytes = sys.platform.encode('ascii')
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
131 sysexecutable: bytes = os.fsencode(sys.executable) if sys.executable else b''
36934
dbae581010ea pycompat: name maplist() and ziplist() for better traceback message
Yuya Nishihara <yuya@tcha.org>
parents: 36648
diff changeset
132
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
133
50175
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
134 if TYPE_CHECKING:
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
135
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
136 @overload
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
137 def maplist(f: Callable[[_T0], _S], arg: Iterable[_T0]) -> List[_S]:
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
138 ...
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
139
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
140 @overload
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
141 def maplist(
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
142 f: Callable[[_T0, _T1], _S], arg1: Iterable[_T0], arg2: Iterable[_T1]
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
143 ) -> List[_S]:
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
144 ...
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
145
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
146
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
147 def maplist(f, *args):
0ab92dabea6e typing: add type hints to pycompat.maplist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50101
diff changeset
148 return list(map(f, *args))
36934
dbae581010ea pycompat: name maplist() and ziplist() for better traceback message
Yuya Nishihara <yuya@tcha.org>
parents: 36648
diff changeset
149
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
150
50176
829aa604d71a typing: add the return type hint to pycompat.rangelist()
Matt Harbison <matt_harbison@yahoo.com>
parents: 50175
diff changeset
151 def rangelist(*args) -> List[int]:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
152 return list(range(*args))
37064
434e520adb8c annotate: do not construct attr.s object per line while computing history
Yuya Nishihara <yuya@tcha.org>
parents: 36958
diff changeset
153
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
154
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
155 def ziplist(*args):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
156 return list(zip(*args))
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
157
36934
dbae581010ea pycompat: name maplist() and ziplist() for better traceback message
Yuya Nishihara <yuya@tcha.org>
parents: 36648
diff changeset
158
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
159 rawinput = input
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
160 getargspec = inspect.getfullargspec
30334
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30330
diff changeset
161
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
162 long = int
39456
8d858fbf2759 cbor: teach the encoder to handle python `long` type for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39302
diff changeset
163
49802
f3f33980f19b pycompat: explicitly prefix builtin attr usage with `builtins.`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49801
diff changeset
164 if builtins.getattr(sys, 'argv', None) is not None:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
165 # On POSIX, the char** argv array is converted to Python str using
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
166 # Py_DecodeLocale(). The inverse of this is Py_EncodeLocale(), which
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
167 # isn't directly callable from Python code. In practice, os.fsencode()
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
168 # can be used instead (this is recommended by Python's documentation
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
169 # for sys.argv).
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
170 #
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
171 # On Windows, the wchar_t **argv is passed into the interpreter as-is.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
172 # Like POSIX, we need to emulate what Py_EncodeLocale() would do. But
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
173 # there's an additional wrinkle. What we really want to access is the
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
174 # ANSI codepage representation of the arguments, as this is what
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
175 # `int main()` would receive if Python 3 didn't define `int wmain()`
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
176 # (this is how Python 2 worked). To get that, we encode with the mbcs
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
177 # encoding, which will pass CP_ACP to the underlying Windows API to
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
178 # produce bytes.
49801
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
179 sysargv: List[bytes] = []
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
180 if os.name == r'nt':
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
181 sysargv = [a.encode("mbcs", "ignore") for a in sys.argv]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
182 else:
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
183 sysargv = [fsencode(a) for a in sys.argv]
29797
965c91bad9e3 py3: move xrange alias next to import lines
Yuya Nishihara <yuya@tcha.org>
parents: 29779
diff changeset
184
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
185 bytechr = struct.Struct('>B').pack
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
186 byterepr = b'%r'.__mod__
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
187
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
188
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
189 class bytestr(bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
190 """A bytes which mostly acts as a Python 2 str
32450
548478efc46c pycompat: try __bytes__() to convert object to bytestr
Yuya Nishihara <yuya@tcha.org>
parents: 32186
diff changeset
191
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
192 >>> bytestr(), bytestr(bytearray(b'foo')), bytestr(u'ascii'), bytestr(1)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
193 ('', 'foo', 'ascii', '1')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
194 >>> s = bytestr(b'foo')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
195 >>> assert s is bytestr(s)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
196
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
197 __bytes__() should be called if provided:
32450
548478efc46c pycompat: try __bytes__() to convert object to bytestr
Yuya Nishihara <yuya@tcha.org>
parents: 32186
diff changeset
198
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
199 >>> class bytesable:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
200 ... def __bytes__(self):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
201 ... return b'bytes'
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
202 >>> bytestr(bytesable())
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
203 'bytes'
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
204
51310
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
205 ...unless the argument is the bytes *type* itself: it gets a
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
206 __bytes__() method in Python 3.11, which cannot be used as in an instance
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
207 of bytes:
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
208
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
209 >>> bytestr(bytes)
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
210 "<class 'bytes'>"
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
211
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
212 There's no implicit conversion from non-ascii str as its encoding is
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
213 unknown:
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
214
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
215 >>> bytestr(chr(0x80)) # doctest: +ELLIPSIS
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
216 Traceback (most recent call last):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
217 ...
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
218 UnicodeEncodeError: ...
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
219
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
220 Comparison between bytestr and bytes should work:
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
221
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
222 >>> assert bytestr(b'foo') == b'foo'
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
223 >>> assert b'foo' == bytestr(b'foo')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
224 >>> assert b'f' in bytestr(b'foo')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
225 >>> assert bytestr(b'f') in b'foo'
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
226
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
227 Sliced elements should be bytes, not integer:
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
228
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
229 >>> s[1], s[:2]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
230 (b'o', b'fo')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
231 >>> list(s), list(reversed(s))
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
232 ([b'f', b'o', b'o'], [b'o', b'o', b'f'])
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
233
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
234 As bytestr type isn't propagated across operations, you need to cast
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
235 bytes to bytestr explicitly:
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
236
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
237 >>> s = bytestr(b'foo').upper()
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
238 >>> t = bytestr(s)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
239 >>> s[0], t[0]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
240 (70, b'F')
48006
1fda8c9358ce typing: add a fake `__init__()` to bytestr to distract pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 47857
diff changeset
241
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
242 Be careful to not pass a bytestr object to a function which expects
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
243 bytearray-like behavior.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
244
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
245 >>> t = bytes(t) # cast to bytes
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
246 >>> assert type(t) is bytes
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
247 """
48006
1fda8c9358ce typing: add a fake `__init__()` to bytestr to distract pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 47857
diff changeset
248
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
249 # Trick pytype into not demanding Iterable[int] be passed to __new__(),
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
250 # since the appropriate bytes format is done internally.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
251 #
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
252 # https://github.com/google/pytype/issues/500
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
253 if TYPE_CHECKING:
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
254
49803
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
255 def __init__(self, s: object = b'') -> None:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
256 pass
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
257
49803
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
258 def __new__(cls: Type[_Tbytestr], s: object = b'') -> _Tbytestr:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
259 if isinstance(s, bytestr):
31439
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31425
diff changeset
260 return s
51310
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
261 if not isinstance(s, (bytes, bytearray)) and (
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
262 isinstance(s, type)
f0e7d51bb454 pycompat: fix bytestr(bytes) in Python 3.11
Georges Racinet <georges.racinet@octobus.net>
parents: 50924
diff changeset
263 or not builtins.hasattr(s, u'__bytes__') # hasattr-py3-only
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
264 ):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
265 s = str(s).encode('ascii')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
266 return bytes.__new__(cls, s)
35903
1a31111e6239 py3: always drop b'' prefix from repr() of bytestr
Yuya Nishihara <yuya@tcha.org>
parents: 35405
diff changeset
267
50101
b900f40c343e typing: disable `signature-mismatch` warnings on a few bytestr functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49807
diff changeset
268 # The base class uses `int` return in py3, but the point of this class is to
b900f40c343e typing: disable `signature-mismatch` warnings on a few bytestr functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49807
diff changeset
269 # behave like py2.
b900f40c343e typing: disable `signature-mismatch` warnings on a few bytestr functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49807
diff changeset
270 def __getitem__(self, key) -> bytes: # pytype: disable=signature-mismatch
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
271 s = bytes.__getitem__(self, key)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
272 if not isinstance(s, bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
273 s = bytechr(s)
35904
fc44c2657dc5 py3: drop b'' from repr() of smartset
Yuya Nishihara <yuya@tcha.org>
parents: 35903
diff changeset
274 return s
fc44c2657dc5 py3: drop b'' from repr() of smartset
Yuya Nishihara <yuya@tcha.org>
parents: 35903
diff changeset
275
50101
b900f40c343e typing: disable `signature-mismatch` warnings on a few bytestr functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49807
diff changeset
276 # The base class expects `Iterator[int]` return in py3, but the point of
b900f40c343e typing: disable `signature-mismatch` warnings on a few bytestr functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49807
diff changeset
277 # this class is to behave like py2.
b900f40c343e typing: disable `signature-mismatch` warnings on a few bytestr functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49807
diff changeset
278 def __iter__(self) -> Iterator[bytes]: # pytype: disable=signature-mismatch
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
279 return iterbytestr(bytes.__iter__(self))
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
280
49803
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
281 def __repr__(self) -> str:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
282 return bytes.__repr__(self)[1:] # drop b''
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
283
31820
45761ef1bc93 py3: have registrar process docstrings in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31775
diff changeset
284
49803
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49802
diff changeset
285 def iterbytestr(s: Iterable[int]) -> Iterator[bytes]:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
286 """Iterate bytes as if it were a str object of Python 2"""
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
287 return map(bytechr, s)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
288
31820
45761ef1bc93 py3: have registrar process docstrings in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31775
diff changeset
289
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
290 if TYPE_CHECKING:
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
291
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
292 @overload
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
293 def maybebytestr(s: bytes) -> bytestr:
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
294 ...
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
295
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
296 @overload
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
297 def maybebytestr(s: _T0) -> _T0:
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
298 ...
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
299
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
300
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
301 def maybebytestr(s):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
302 """Promote bytes to bytestr"""
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
303 if isinstance(s, bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
304 return bytestr(s)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
305 return s
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
306
30032
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30030
diff changeset
307
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
308 def sysbytes(s: AnyStr) -> bytes:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
309 """Convert an internal str (e.g. keyword, __doc__) back to bytes
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
310
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
311 This never raises UnicodeEncodeError, but only ASCII characters
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
312 can be round-trip by sysstr(sysbytes(s)).
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
313 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
314 if isinstance(s, bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
315 return s
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
316 return s.encode('utf-8')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
317
30032
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30030
diff changeset
318
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
319 def sysstr(s: AnyStr) -> str:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
320 """Return a keyword str to be passed to Python functions such as
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
321 getattr() and str.encode()
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
322
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
323 This never raises UnicodeDecodeError. Non-ascii characters are
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
324 considered invalid and mapped to arbitrary but unique code points
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
325 such that 'sysstr(a) != sysstr(b)' for all 'a != b'.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
326 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
327 if isinstance(s, builtins.str):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
328 return s
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
329 return s.decode('latin-1')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
330
32859
a05f3675c46a py3: add a new strurl() which will convert a bytes url to str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32615
diff changeset
331
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
332 def strurl(url: AnyStr) -> str:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
333 """Converts a bytes url back to str"""
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
334 if isinstance(url, bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
335 return url.decode('ascii')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
336 return url
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
337
32860
f22f39d56bb5 py3: add a new bytesurl() to convert a str url into bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32859
diff changeset
338
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
339 def bytesurl(url: AnyStr) -> bytes:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
340 """Converts a str url to bytes by encoding in ascii"""
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
341 if isinstance(url, str):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
342 return url.encode('ascii')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
343 return url
32186
76f9a0009b4b pycompat: extract helper to raise exception with traceback
Yuya Nishihara <yuya@tcha.org>
parents: 31942
diff changeset
344
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
345
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
346 def raisewithtb(exc: BaseException, tb) -> NoReturn:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
347 """Raise exception with the given traceback"""
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
348 raise exc.with_traceback(tb)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
349
32615
c9318beb7c1a py3: convert __doc__ back to bytes in help.py
Yuya Nishihara <yuya@tcha.org>
parents: 32450
diff changeset
350
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
351 def getdoc(obj: object) -> Optional[bytes]:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
352 """Get docstring as bytes; may be None so gettext() won't confuse it
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
353 with _('')"""
49802
f3f33980f19b pycompat: explicitly prefix builtin attr usage with `builtins.`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49801
diff changeset
354 doc = builtins.getattr(obj, '__doc__', None)
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
355 if doc is None:
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
356 return doc
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
357 return sysbytes(doc)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
358
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
359
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
360 # these wrappers are automagically imported by hgloader
51141
c845479fc64d cleanup: drop the `bytes` compatibility for attribute related function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50924
diff changeset
361 delattr = builtins.delattr
c845479fc64d cleanup: drop the `bytes` compatibility for attribute related function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50924
diff changeset
362 getattr = builtins.getattr
c845479fc64d cleanup: drop the `bytes` compatibility for attribute related function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50924
diff changeset
363 hasattr = builtins.hasattr
c845479fc64d cleanup: drop the `bytes` compatibility for attribute related function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50924
diff changeset
364 setattr = builtins.setattr
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
365 xrange = builtins.range
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
366 unicode = str
31149
76a64c1e5439 py3: add pycompat.open and replace open() calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30820
diff changeset
367
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
368
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
369 def open(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
370 name,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
371 mode: AnyStr = b'r',
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
372 buffering: int = -1,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
373 encoding: Optional[str] = None,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
374 ) -> Any:
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
375 # TODO: assert binary mode, and cast result to BinaryIO?
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
376 return builtins.open(name, sysstr(mode), buffering, encoding)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
377
37099
6ca5f825a0ca util: make safehasattr() a pycompat function
Yuya Nishihara <yuya@tcha.org>
parents: 37064
diff changeset
378
51141
c845479fc64d cleanup: drop the `bytes` compatibility for attribute related function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50924
diff changeset
379 safehasattr = builtins.hasattr
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
380
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
381
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
382 def _getoptbwrapper(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
383 orig, args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
384 ) -> _GetOptResult:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
385 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
386 Takes bytes arguments, converts them to unicode, pass them to
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
387 getopt.getopt(), convert the returned values back to bytes and then
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
388 return them for Python 3 compatibility as getopt.getopt() don't accepts
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
389 bytes on Python 3.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
390 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
391 args = [a.decode('latin-1') for a in args]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
392 shortlist = shortlist.decode('latin-1')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
393 namelist = [a.decode('latin-1') for a in namelist]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
394 opts, args = orig(args, shortlist, namelist)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
395 opts = [(a[0].encode('latin-1'), a[1].encode('latin-1')) for a in opts]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
396 args = [a.encode('latin-1') for a in args]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
397 return opts, args
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
398
30578
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30500
diff changeset
399
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
400 def strkwargs(dic: Mapping[bytes, _T0]) -> Dict[str, _T0]:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
401 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
402 Converts the keys of a python dictonary to str i.e. unicodes so that
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
403 they can be passed as keyword arguments as dictionaries with bytes keys
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
404 can't be passed as keyword arguments to functions on Python 3.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
405 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
406 dic = {k.decode('latin-1'): v for k, v in dic.items()}
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
407 return dic
30579
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30578
diff changeset
408
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30578
diff changeset
409
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
410 def byteskwargs(dic: Mapping[str, _T0]) -> Dict[bytes, _T0]:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
411 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
412 Converts keys of python dictionaries to bytes as they were converted to
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
413 str to pass that dictonary as a keyword argument on Python 3.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
414 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
415 dic = {k.encode('latin-1'): v for k, v in dic.items()}
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
416 return dic
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
417
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30668
diff changeset
418
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
419 # TODO: handle shlex.shlex().
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
420 def shlexsplit(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
421 s: bytes, comments: bool = False, posix: bool = True
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
422 ) -> List[bytes]:
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
423 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
424 Takes bytes argument, convert it to str i.e. unicodes, pass that into
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
425 shlex.split(), convert the returned value to bytes and return that for
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
426 Python 3 compatibility as shelx.split() don't accept bytes on Python 3.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
427 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
428 ret = shlex.split(s.decode('latin-1'), comments, posix)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
429 return [a.encode('latin-1') for a in ret]
43019
2cc453284d5c patchbomb: protect email addresses from shell
Floris Bruynooghe <flub@google.com>
parents: 40527
diff changeset
430
43380
579672b347d2 py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43117
diff changeset
431
48871
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
432 iteritems = lambda x: x.items()
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
433 itervalues = lambda x: x.values()
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48869
diff changeset
434
48960
c3a48dd506da pycompat: remove json.loads polyfill for Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48959
diff changeset
435 json_loads = json.loads
34639
a568a46751b6 selectors2: do not use platform.system()
Jun Wu <quark@fb.com>
parents: 34467
diff changeset
436
49801
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
437 isjython: bool = sysplatform.startswith(b'java')
34644
c0a6c19690ff pycompat: define operating system constants
Jun Wu <quark@fb.com>
parents: 34639
diff changeset
438
49801
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
439 isdarwin: bool = sysplatform.startswith(b'darwin')
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
440 islinux: bool = sysplatform.startswith(b'linux')
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
441 isposix: bool = osname == b'posix'
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48994
diff changeset
442 iswindows: bool = osname == b'nt'
35226
5b569d512fbd fancyopts: use getopt.gnu_getopt()
Yuya Nishihara <yuya@tcha.org>
parents: 34644
diff changeset
443
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
444
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
445 def getoptb(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
446 args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
447 ) -> _GetOptResult:
35226
5b569d512fbd fancyopts: use getopt.gnu_getopt()
Yuya Nishihara <yuya@tcha.org>
parents: 34644
diff changeset
448 return _getoptbwrapper(getopt.getopt, args, shortlist, namelist)
5b569d512fbd fancyopts: use getopt.gnu_getopt()
Yuya Nishihara <yuya@tcha.org>
parents: 34644
diff changeset
449
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
450
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
451 def gnugetoptb(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
452 args: Sequence[bytes], shortlist: bytes, namelist: Sequence[bytes]
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
453 ) -> _GetOptResult:
35226
5b569d512fbd fancyopts: use getopt.gnu_getopt()
Yuya Nishihara <yuya@tcha.org>
parents: 34644
diff changeset
454 return _getoptbwrapper(getopt.gnu_getopt, args, shortlist, namelist)
38164
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 37844
diff changeset
455
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
456
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
457 def mkdtemp(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
458 suffix: bytes = b'', prefix: bytes = b'tmp', dir: Optional[bytes] = None
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
459 ) -> bytes:
38165
2ce60954b1b7 py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 38164
diff changeset
460 return tempfile.mkdtemp(suffix, prefix, dir)
2ce60954b1b7 py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 38164
diff changeset
461
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
462
38164
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 37844
diff changeset
463 # text=True is not supported; use util.from/tonativeeol() instead
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
464 def mkstemp(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
465 suffix: bytes = b'', prefix: bytes = b'tmp', dir: Optional[bytes] = None
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
466 ) -> Tuple[int, bytes]:
38164
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 37844
diff changeset
467 return tempfile.mkstemp(suffix, prefix, dir)
38166
cc9aa88792fe py3: wrap tempfile.NamedTemporaryFile() to return bytes fp.name
Yuya Nishihara <yuya@tcha.org>
parents: 38165
diff changeset
468
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
469
45727
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
470 # TemporaryFile does not support an "encoding=" argument on python2.
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
471 # This wrapper file are always open in byte mode.
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
472 def unnamedtempfile(mode: Optional[bytes] = None, *args, **kwargs) -> BinaryIO:
45727
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
473 if mode is None:
46570
7a29d9002250 pycompat: fix a bytes vs str issue in `unnamedtempfile()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 46178
diff changeset
474 mode = 'w+b'
45727
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
475 else:
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
476 mode = sysstr(mode)
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
477 assert 'b' in mode
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
478 return cast(BinaryIO, tempfile.TemporaryFile(mode, *args, **kwargs))
45727
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
479
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
480
45726
d1072cba8aff pycompat: update comment about unnamedtempfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45056
diff changeset
481 # NamedTemporaryFile does not support an "encoding=" argument on python2.
d1072cba8aff pycompat: update comment about unnamedtempfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45056
diff changeset
482 # This wrapper file are always open in byte mode.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
483 def namedtempfile(
49807
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
484 mode: bytes = b'w+b',
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
485 bufsize: int = -1,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
486 suffix: bytes = b'',
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
487 prefix: bytes = b'tmp',
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
488 dir: Optional[bytes] = None,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49803
diff changeset
489 delete: bool = True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
490 ):
38166
cc9aa88792fe py3: wrap tempfile.NamedTemporaryFile() to return bytes fp.name
Yuya Nishihara <yuya@tcha.org>
parents: 38165
diff changeset
491 mode = sysstr(mode)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
492 assert 'b' in mode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
493 return tempfile.NamedTemporaryFile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
494 mode, bufsize, suffix=suffix, prefix=prefix, dir=dir, delete=delete
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43019
diff changeset
495 )