annotate mercurial/pycompat.py @ 49902:c5a06cc37401

typing: add type hints to most mercurial/pycompat.py functions The `rapply` methods are left out because it's not `rapply(f, xs: _T0) -> _T0` as I first thought- it's used somewhere to walk a collection and convert between bytes and str. Also, the `open()` call is partially untyped because I'm not sure what its purpose is at this point- both the name and mode can be either bytes or str as it is currently constituted. It might make sense to assert that the file is being opened in binary mode (like `namedtempfile()`) and cast the result to `BinaryIO`, but that shouldn't be smuggled in with these other changes. The return is currently typed as `Any` because something suddenly got smarter and a few uses in util.py (like readfile()) suddenly think it returns `IO[str]` instead of `IO[bytes]` (BinaryIO), and it flags the type mismatch there.
author Matt Harbison <matt_harbison@yahoo.com>
date Thu, 15 Dec 2022 01:05:27 -0500
parents 55d45d0de4e7
children b900f40c343e
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
48960
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
12 import builtins
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
13 import codecs
48960
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
14 import concurrent.futures as futures
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
15 import functools
30583
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
16 import getopt
48960
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
17 import http.client as httplib
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
18 import http.cookiejar as cookielib
36216
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 36083
diff changeset
19 import inspect
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
20 import io
43380
579672b347d2 py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43117
diff changeset
21 import json
30315
3874ddba1ab4 py3: add a bytes version of os.name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30313
diff changeset
22 import os
48960
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
23 import queue
30681
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
24 import shlex
48960
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
25 import socketserver
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
26 import struct
29584
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
27 import sys
38197
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 37890
diff changeset
28 import tempfile
48960
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
29 import xmlrpc.client as xmlrpclib
29584
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
30
49896
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
31 from typing import (
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
32 Any,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
33 AnyStr,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
34 BinaryIO,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
35 Dict,
49898
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
36 Iterable,
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
37 Iterator,
49896
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
38 List,
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
39 Mapping,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
40 NoReturn,
49896
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
41 Optional,
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
42 Sequence,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
43 Tuple,
49898
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
44 Type,
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
45 TypeVar,
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
46 cast,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
47 overload,
49896
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
48 )
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
49
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
50 ispy3 = sys.version_info[0] >= 3
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
51 ispypy = '__pypy__' in sys.builtin_module_names
43793
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43788
diff changeset
52 TYPE_CHECKING = False
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43788
diff changeset
53
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43788
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: 43788
diff changeset
55 import typing
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43788
diff changeset
56
7b14d649af1b typing: consolidate "if not globals():" trick
Yuya Nishihara <yuya@tcha.org>
parents: 43788
diff changeset
57 TYPE_CHECKING = typing.TYPE_CHECKING
30031
0f6d6fdd3c2a pycompat: provide 'ispy3' constant
Yuya Nishihara <yuya@tcha.org>
parents: 29812
diff changeset
58
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
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: 49898
diff changeset
60 _T0 = TypeVar('_T0')
49898
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
61 _Tbytestr = TypeVar('_Tbytestr', bound='bytestr')
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
62
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
63
48960
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
64 def future_set_exception_info(f, exc_info):
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
65 f.set_exception(exc_info[0])
29431
80880ad3fccd py3: conditionalize the urlparse import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29414
diff changeset
66
37669
1cb54e6193a6 py3: paper over differences in future exception handling
Augie Fackler <augie@google.com>
parents: 37628
diff changeset
67
48960
57b58413dad1 pycompat: remove first not ispy3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48926
diff changeset
68 FileNotFoundError = builtins.FileNotFoundError
47852
2b76255a4f74 template: FileNotFoundError is actually a built in exception
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46380
diff changeset
69
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
70
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
71 def identity(a: _T0) -> _T0:
31777
7d2cbe11ae48 pycompat: introduce identity function as a compat stub
Yuya Nishihara <yuya@tcha.org>
parents: 31579
diff changeset
72 return a
7d2cbe11ae48 pycompat: introduce identity function as a compat stub
Yuya Nishihara <yuya@tcha.org>
parents: 31579
diff changeset
73
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
74
38576
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
75 def _rapply(f, xs):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
76 if xs is None:
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
77 # assume None means non-value of optional data
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
78 return xs
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
79 if isinstance(xs, (list, set, tuple)):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
80 return type(xs)(_rapply(f, x) for x in xs)
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
81 if isinstance(xs, dict):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
82 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: 38341
diff changeset
83 return f(xs)
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
84
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
85
38576
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
86 def rapply(f, xs):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
87 """Apply function recursively to every item preserving the data structure
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
88
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
89 >>> def f(x):
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
90 ... return 'f(%s)' % x
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
91 >>> rapply(f, None) is None
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
92 True
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
93 >>> rapply(f, 'a')
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
94 'f(a)'
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
95 >>> rapply(f, {'a'}) == {'f(a)'}
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
96 True
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
97 >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []])
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
98 ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []]
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
99
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
100 >>> xs = [object()]
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
101 >>> rapply(identity, xs) is xs
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
102 True
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
103 """
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
104 if f is identity:
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
105 # fast path mainly for py2
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
106 return xs
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
107 return _rapply(f, xs)
152f4822d210 pycompat: move rapply() from util
Yuya Nishihara <yuya@tcha.org>
parents: 38341
diff changeset
108
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
109
49050
9ac1a4507bb3 pycompat: remove check for Python >= 3.6
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49037
diff changeset
110 if os.name == r'nt':
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
111 # MBCS (or ANSI) filesystem encoding must be used as before.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
112 # Otherwise non-ASCII filenames in existing repositories would be
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
113 # corrupted.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
114 # 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: 48960
diff changeset
115 sys._enablelegacywindowsfsencoding() # pytype: disable=module-attr
43484
8d5489b048b7 py3: enable legacy fs encoding to fix filename compatibility on Windows
Yuya Nishihara <yuya@tcha.org>
parents: 43117
diff changeset
116
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
117 fsencode = os.fsencode
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
118 fsdecode = os.fsdecode
49896
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
119 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: 49069
diff changeset
120 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: 49069
diff changeset
121 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: 49069
diff changeset
122 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: 49069
diff changeset
123 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: 49069
diff changeset
124 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: 49069
diff changeset
125 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: 49069
diff changeset
126 osdevnull: bytes = os.devnull.encode('ascii')
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39658
diff changeset
127
49896
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
128 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: 49069
diff changeset
129 sysexecutable: bytes = os.fsencode(sys.executable) if sys.executable else b''
36940
dbae581010ea pycompat: name maplist() and ziplist() for better traceback message
Yuya Nishihara <yuya@tcha.org>
parents: 36677
diff changeset
130
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
131
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
132 def maplist(*args):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
133 return list(map(*args))
36940
dbae581010ea pycompat: name maplist() and ziplist() for better traceback message
Yuya Nishihara <yuya@tcha.org>
parents: 36677
diff changeset
134
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
135
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
136 def rangelist(*args):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
137 return list(range(*args))
37067
434e520adb8c annotate: do not construct attr.s object per line while computing history
Yuya Nishihara <yuya@tcha.org>
parents: 36964
diff changeset
138
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
139
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
140 def ziplist(*args):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
141 return list(zip(*args))
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
142
36940
dbae581010ea pycompat: name maplist() and ziplist() for better traceback message
Yuya Nishihara <yuya@tcha.org>
parents: 36677
diff changeset
143
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
144 rawinput = input
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
145 getargspec = inspect.getfullargspec
30344
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30340
diff changeset
146
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
147 long = int
39473
8d858fbf2759 cbor: teach the encoder to handle python `long` type for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39329
diff changeset
148
49897
f3f33980f19b pycompat: explicitly prefix builtin attr usage with `builtins.`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49896
diff changeset
149 if builtins.getattr(sys, 'argv', None) is not None:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
150 # 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: 48960
diff changeset
151 # Py_DecodeLocale(). The inverse of this is Py_EncodeLocale(), which
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
152 # 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: 48960
diff changeset
153 # 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: 48960
diff changeset
154 # for sys.argv).
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
155 #
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
156 # 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: 48960
diff changeset
157 # 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: 48960
diff changeset
158 # 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: 48960
diff changeset
159 # ANSI codepage representation of the arguments, as this is what
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
160 # `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: 48960
diff changeset
161 # (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: 48960
diff changeset
162 # 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: 48960
diff changeset
163 # produce bytes.
49896
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
164 sysargv: List[bytes] = []
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
165 if os.name == r'nt':
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
166 sysargv = [a.encode("mbcs", "ignore") for a in sys.argv]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
167 else:
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
168 sysargv = [fsencode(a) for a in sys.argv]
29808
965c91bad9e3 py3: move xrange alias next to import lines
Yuya Nishihara <yuya@tcha.org>
parents: 29790
diff changeset
169
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
170 bytechr = struct.Struct('>B').pack
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
171 byterepr = b'%r'.__mod__
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
172
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
173
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
174 class bytestr(bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
175 """A bytes which mostly acts as a Python 2 str
32488
548478efc46c pycompat: try __bytes__() to convert object to bytestr
Yuya Nishihara <yuya@tcha.org>
parents: 32232
diff changeset
176
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
177 >>> bytestr(), bytestr(bytearray(b'foo')), bytestr(u'ascii'), bytestr(1)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
178 ('', 'foo', 'ascii', '1')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
179 >>> s = bytestr(b'foo')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
180 >>> assert s is bytestr(s)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
181
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
182 __bytes__() should be called if provided:
32488
548478efc46c pycompat: try __bytes__() to convert object to bytestr
Yuya Nishihara <yuya@tcha.org>
parents: 32232
diff changeset
183
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
184 >>> class bytesable:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
185 ... def __bytes__(self):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
186 ... return b'bytes'
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
187 >>> bytestr(bytesable())
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
188 'bytes'
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
189
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
190 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: 48960
diff changeset
191 unknown:
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
192
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
193 >>> bytestr(chr(0x80)) # doctest: +ELLIPSIS
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
194 Traceback (most recent call last):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
195 ...
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
196 UnicodeEncodeError: ...
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
197
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
198 Comparison between bytestr and bytes should work:
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
199
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
200 >>> assert bytestr(b'foo') == b'foo'
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
201 >>> assert b'foo' == bytestr(b'foo')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
202 >>> assert b'f' in bytestr(b'foo')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
203 >>> assert bytestr(b'f') in b'foo'
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
204
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
205 Sliced elements should be bytes, not integer:
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
206
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
207 >>> s[1], s[:2]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
208 (b'o', b'fo')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
209 >>> list(s), list(reversed(s))
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
210 ([b'f', b'o', b'o'], [b'o', b'o', b'f'])
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
211
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
212 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: 48960
diff changeset
213 bytes to bytestr explicitly:
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
214
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
215 >>> s = bytestr(b'foo').upper()
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
216 >>> t = bytestr(s)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
217 >>> s[0], t[0]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
218 (70, b'F')
48029
1fda8c9358ce typing: add a fake `__init__()` to bytestr to distract pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 47852
diff changeset
219
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
220 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: 48960
diff changeset
221 bytearray-like behavior.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
222
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
223 >>> t = bytes(t) # cast to bytes
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
224 >>> assert type(t) is bytes
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
225 """
48029
1fda8c9358ce typing: add a fake `__init__()` to bytestr to distract pytype
Matt Harbison <matt_harbison@yahoo.com>
parents: 47852
diff changeset
226
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
227 # 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: 48960
diff changeset
228 # since the appropriate bytes format is done internally.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
229 #
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
230 # https://github.com/google/pytype/issues/500
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
231 if TYPE_CHECKING:
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
232
49898
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
233 def __init__(self, s: object = b'') -> None:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
234 pass
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
235
49898
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
236 def __new__(cls: Type[_Tbytestr], s: object = b'') -> _Tbytestr:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
237 if isinstance(s, bytestr):
31448
b70407bd84d5 pycompat: add bytestr wrapper which mostly acts as a Python 2 str
Yuya Nishihara <yuya@tcha.org>
parents: 31434
diff changeset
238 return s
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
239 if not isinstance(
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
240 s, (bytes, bytearray)
49897
f3f33980f19b pycompat: explicitly prefix builtin attr usage with `builtins.`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49896
diff changeset
241 ) and not builtins.hasattr( # hasattr-py3-only
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
242 s, u'__bytes__'
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
243 ):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
244 s = str(s).encode('ascii')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
245 return bytes.__new__(cls, s)
35943
1a31111e6239 py3: always drop b'' prefix from repr() of bytestr
Yuya Nishihara <yuya@tcha.org>
parents: 35412
diff changeset
246
49898
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
247 def __getitem__(self, key) -> bytes:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
248 s = bytes.__getitem__(self, key)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
249 if not isinstance(s, bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
250 s = bytechr(s)
35944
fc44c2657dc5 py3: drop b'' from repr() of smartset
Yuya Nishihara <yuya@tcha.org>
parents: 35943
diff changeset
251 return s
fc44c2657dc5 py3: drop b'' from repr() of smartset
Yuya Nishihara <yuya@tcha.org>
parents: 35943
diff changeset
252
49898
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
253 def __iter__(self) -> Iterator[bytes]:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
254 return iterbytestr(bytes.__iter__(self))
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
255
49898
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
256 def __repr__(self) -> str:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
257 return bytes.__repr__(self)[1:] # drop b''
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
258
31820
45761ef1bc93 py3: have registrar process docstrings in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31778
diff changeset
259
49898
55d45d0de4e7 typing: add type hints to pycompat.bytestr
Matt Harbison <matt_harbison@yahoo.com>
parents: 49897
diff changeset
260 def iterbytestr(s: Iterable[int]) -> Iterator[bytes]:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
261 """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: 48960
diff changeset
262 return map(bytechr, s)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
263
31820
45761ef1bc93 py3: have registrar process docstrings in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31778
diff changeset
264
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
265 if TYPE_CHECKING:
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
266
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
267 @overload
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
268 def maybebytestr(s: bytes) -> bytestr:
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
269 ...
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
270
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
271 @overload
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
272 def maybebytestr(s: _T0) -> _T0:
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
273 ...
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
274
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
275
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
276 def maybebytestr(s):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
277 """Promote bytes to bytestr"""
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
278 if isinstance(s, bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
279 return bytestr(s)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
280 return s
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
281
30032
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
282
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
283 def sysbytes(s: AnyStr) -> bytes:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
284 """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: 48960
diff changeset
285
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
286 This never raises UnicodeEncodeError, but only ASCII characters
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
287 can be round-trip by sysstr(sysbytes(s)).
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
288 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
289 if isinstance(s, bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
290 return s
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
291 return s.encode('utf-8')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
292
30032
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
293
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
294 def sysstr(s: AnyStr) -> str:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
295 """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: 48960
diff changeset
296 getattr() and str.encode()
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
297
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
298 This never raises UnicodeDecodeError. Non-ascii characters are
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
299 considered invalid and mapped to arbitrary but unique code points
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
300 such that 'sysstr(a) != sysstr(b)' for all 'a != b'.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
301 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
302 if isinstance(s, builtins.str):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
303 return s
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
304 return s.decode('latin-1')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
305
32877
a05f3675c46a py3: add a new strurl() which will convert a bytes url to str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32638
diff changeset
306
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
307 def strurl(url: AnyStr) -> str:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
308 """Converts a bytes url back to str"""
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
309 if isinstance(url, bytes):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
310 return url.decode('ascii')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
311 return url
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
312
32878
f22f39d56bb5 py3: add a new bytesurl() to convert a str url into bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32877
diff changeset
313
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
314 def bytesurl(url: AnyStr) -> bytes:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
315 """Converts a str url to bytes by encoding in ascii"""
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
316 if isinstance(url, str):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
317 return url.encode('ascii')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
318 return url
32232
76f9a0009b4b pycompat: extract helper to raise exception with traceback
Yuya Nishihara <yuya@tcha.org>
parents: 31942
diff changeset
319
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
320
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
321 def raisewithtb(exc: BaseException, tb) -> NoReturn:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
322 """Raise exception with the given traceback"""
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
323 raise exc.with_traceback(tb)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
324
32638
c9318beb7c1a py3: convert __doc__ back to bytes in help.py
Yuya Nishihara <yuya@tcha.org>
parents: 32488
diff changeset
325
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
326 def getdoc(obj: object) -> Optional[bytes]:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
327 """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: 48960
diff changeset
328 with _('')"""
49897
f3f33980f19b pycompat: explicitly prefix builtin attr usage with `builtins.`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49896
diff changeset
329 doc = builtins.getattr(obj, '__doc__', None)
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
330 if doc is None:
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
331 return doc
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
332 return sysbytes(doc)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
333
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
334
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
335 def _wrapattrfunc(f):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
336 @functools.wraps(f)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
337 def w(object, name, *args):
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
338 return f(object, sysstr(name), *args)
29810
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
339
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
340 return w
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
341
29810
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
342
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
343 # these wrappers are automagically imported by hgloader
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
344 delattr = _wrapattrfunc(builtins.delattr)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
345 getattr = _wrapattrfunc(builtins.getattr)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
346 hasattr = _wrapattrfunc(builtins.hasattr)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
347 setattr = _wrapattrfunc(builtins.setattr)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
348 xrange = builtins.range
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
349 unicode = str
31159
76a64c1e5439 py3: add pycompat.open and replace open() calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30820
diff changeset
350
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
351
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
352 def open(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
353 name,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
354 mode: AnyStr = b'r',
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
355 buffering: int = -1,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
356 encoding: Optional[str] = None,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
357 ) -> Any:
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
358 # TODO: assert binary mode, and cast result to BinaryIO?
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
359 return builtins.open(name, sysstr(mode), buffering, encoding)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
360
37102
6ca5f825a0ca util: make safehasattr() a pycompat function
Yuya Nishihara <yuya@tcha.org>
parents: 37067
diff changeset
361
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
362 safehasattr = _wrapattrfunc(builtins.hasattr)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
363
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
364
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
365 def _getoptbwrapper(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
366 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: 49898
diff changeset
367 ) -> _GetOptResult:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
368 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
369 Takes bytes arguments, converts them to unicode, pass them to
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
370 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: 48960
diff changeset
371 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: 48960
diff changeset
372 bytes on Python 3.
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
373 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
374 args = [a.decode('latin-1') for a in args]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
375 shortlist = shortlist.decode('latin-1')
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
376 namelist = [a.decode('latin-1') for a in namelist]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
377 opts, args = orig(args, shortlist, namelist)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
378 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: 48960
diff changeset
379 args = [a.encode('latin-1') for a in args]
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
380 return opts, args
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
381
30583
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
382
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
383 def strkwargs(dic: Mapping[bytes, _T0]) -> Dict[str, _T0]:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
384 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
385 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: 48960
diff changeset
386 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: 48960
diff changeset
387 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: 48960
diff changeset
388 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
389 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: 48960
diff changeset
390 return dic
30584
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
391
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
392
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
393 def byteskwargs(dic: Mapping[str, _T0]) -> Dict[bytes, _T0]:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
394 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
395 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: 48960
diff changeset
396 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: 48960
diff changeset
397 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
398 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: 48960
diff changeset
399 return dic
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
400
30681
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
401
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
402 # TODO: handle shlex.shlex().
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
403 def shlexsplit(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
404 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: 49898
diff changeset
405 ) -> List[bytes]:
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
406 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
407 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: 48960
diff changeset
408 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: 48960
diff changeset
409 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: 48960
diff changeset
410 """
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
411 ret = shlex.split(s.decode('latin-1'), comments, posix)
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
412 return [a.encode('latin-1') for a in ret]
43021
2cc453284d5c patchbomb: protect email addresses from shell
Floris Bruynooghe <flub@google.com>
parents: 40577
diff changeset
413
43380
579672b347d2 py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43117
diff changeset
414
48962
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
415 iteritems = lambda x: x.items()
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
416 itervalues = lambda x: x.values()
79009cca491e pycompat: remove large Python 2 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48960
diff changeset
417
49051
c3a48dd506da pycompat: remove json.loads polyfill for Python 3.5
Gregory Szorc <gregory.szorc@gmail.com>
parents: 49050
diff changeset
418 json_loads = json.loads
34639
a568a46751b6 selectors2: do not use platform.system()
Jun Wu <quark@fb.com>
parents: 34468
diff changeset
419
49896
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
420 isjython: bool = sysplatform.startswith(b'java')
34644
c0a6c19690ff pycompat: define operating system constants
Jun Wu <quark@fb.com>
parents: 34639
diff changeset
421
49896
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
422 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: 49069
diff changeset
423 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: 49069
diff changeset
424 isposix: bool = osname == b'posix'
9cd327509cd4 typing: add type hints to global variables in mercurial/pycompat.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 49069
diff changeset
425 iswindows: bool = osname == b'nt'
35235
5b569d512fbd fancyopts: use getopt.gnu_getopt()
Yuya Nishihara <yuya@tcha.org>
parents: 34644
diff changeset
426
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
427
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
428 def getoptb(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
429 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: 49898
diff changeset
430 ) -> _GetOptResult:
35235
5b569d512fbd fancyopts: use getopt.gnu_getopt()
Yuya Nishihara <yuya@tcha.org>
parents: 34644
diff changeset
431 return _getoptbwrapper(getopt.getopt, args, shortlist, namelist)
5b569d512fbd fancyopts: use getopt.gnu_getopt()
Yuya Nishihara <yuya@tcha.org>
parents: 34644
diff changeset
432
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
433
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
434 def gnugetoptb(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
435 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: 49898
diff changeset
436 ) -> _GetOptResult:
35235
5b569d512fbd fancyopts: use getopt.gnu_getopt()
Yuya Nishihara <yuya@tcha.org>
parents: 34644
diff changeset
437 return _getoptbwrapper(getopt.gnu_getopt, args, shortlist, namelist)
38197
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 37890
diff changeset
438
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
439
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
440 def mkdtemp(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
441 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: 49898
diff changeset
442 ) -> bytes:
38198
2ce60954b1b7 py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 38197
diff changeset
443 return tempfile.mkdtemp(suffix, prefix, dir)
2ce60954b1b7 py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 38197
diff changeset
444
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
445
38197
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 37890
diff changeset
446 # text=True is not supported; use util.from/tonativeeol() instead
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
447 def mkstemp(
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
448 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: 49898
diff changeset
449 ) -> Tuple[int, bytes]:
38197
aac4be30e250 py3: wrap tempfile.mkstemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 37890
diff changeset
450 return tempfile.mkstemp(suffix, prefix, dir)
38199
cc9aa88792fe py3: wrap tempfile.NamedTemporaryFile() to return bytes fp.name
Yuya Nishihara <yuya@tcha.org>
parents: 38198
diff changeset
451
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
452
45727
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
453 # 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
454 # This wrapper file are always open in byte mode.
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
455 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
456 if mode is None:
46380
7a29d9002250 pycompat: fix a bytes vs str issue in `unnamedtempfile()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 46178
diff changeset
457 mode = 'w+b'
45727
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
458 else:
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
459 mode = sysstr(mode)
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
460 assert 'b' in mode
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
461 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
462
d4c4391aa7f2 pycompat: add an entry for unnamedtmpfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45726
diff changeset
463
45726
d1072cba8aff pycompat: update comment about unnamedtempfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45057
diff changeset
464 # NamedTemporaryFile does not support an "encoding=" argument on python2.
d1072cba8aff pycompat: update comment about unnamedtempfile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45057
diff changeset
465 # This wrapper file are always open in byte mode.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
466 def namedtempfile(
49902
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
467 mode: bytes = b'w+b',
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
468 bufsize: int = -1,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
469 suffix: bytes = b'',
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
470 prefix: bytes = b'tmp',
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
471 dir: Optional[bytes] = None,
c5a06cc37401 typing: add type hints to most mercurial/pycompat.py functions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49898
diff changeset
472 delete: bool = True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
473 ):
38199
cc9aa88792fe py3: wrap tempfile.NamedTemporaryFile() to return bytes fp.name
Yuya Nishihara <yuya@tcha.org>
parents: 38198
diff changeset
474 mode = sysstr(mode)
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
475 assert 'b' in mode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
476 return tempfile.NamedTemporaryFile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
477 mode, bufsize, suffix=suffix, prefix=prefix, dir=dir, delete=delete
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43021
diff changeset
478 )