##// END OF EJS Templates
rust-cpython: do not convert warning pattern to utf-8 bytes...
rust-cpython: do not convert warning pattern to utf-8 bytes On Unix, both Rust Path and Mercurial expect a locale-dependent bytes, and we don't support Windows yet.

File last commit:

r44156:c6060b24 default
r44161:3078f9a4 default
Show More
pycompat.py
506 lines | 14.9 KiB | text/x-python | PythonLexer
timeless
pycompat: add empty and queue to handle py3 divergence...
r28818 # pycompat.py - portability shim for python 3
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
"""Mercurial portability shim for python 3.
This contains aliases to hide python version-specific details from the core.
"""
from __future__ import absolute_import
Pulkit Goyal
py3: make a bytes version of getopt.getopt()...
r30578 import getopt
Augie Fackler
py3: introduce and use pycompat.getargspec...
r36196 import inspect
Gregory Szorc
py3: define and use json.loads polyfill...
r43697 import json
Pulkit Goyal
py3: add a bytes version of os.name...
r30302 import os
Pulkit Goyal
py3: have a bytes version of shlex.split()...
r30678 import shlex
Pulkit Goyal
pycompat: make pycompat demandimport friendly...
r29584 import sys
Yuya Nishihara
py3: wrap tempfile.mkstemp() to use bytes path...
r38182 import tempfile
Pulkit Goyal
pycompat: make pycompat demandimport friendly...
r29584
Augie Fackler
formatting: blacken the codebase...
r43346 ispy3 = sys.version_info[0] >= 3
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 ispypy = '__pypy__' in sys.builtin_module_names
Yuya Nishihara
pycompat: provide 'ispy3' constant...
r30030
if not ispy3:
Gregory Szorc
util: make cookielib module available...
r31934 import cookielib
Pulkit Goyal
py3: conditionalize cPickle import by adding in util...
r29324 import cPickle as pickle
Pulkit Goyal
py3: conditionalize httplib import...
r29455 import httplib
Gregory Szorc
pycompat: export queue module instead of symbols in module (API)...
r37863 import Queue as queue
Pulkit Goyal
py3: conditionalize SocketServer import...
r29433 import SocketServer as socketserver
Pulkit Goyal
py3: conditionalize xmlrpclib import...
r29432 import xmlrpclib
Gregory Szorc
pycompat: export a handle on concurrent.futures...
r37646
from .thirdparty.concurrent import futures
Augie Fackler
py3: paper over differences in future exception handling...
r37687
def future_set_exception_info(f, exc_info):
f.set_exception_info(*exc_info)
Augie Fackler
formatting: blacken the codebase...
r43346
Pulkit Goyal
pycompat: make pycompat demandimport friendly...
r29584 else:
Gregory Szorc
pycompat: export a handle on concurrent.futures...
r37646 import concurrent.futures as futures
Gregory Szorc
pycompat: import correct cookie module on Python 3...
r31942 import http.cookiejar as cookielib
Pulkit Goyal
pycompat: make pycompat demandimport friendly...
r29584 import http.client as httplib
import pickle
Gregory Szorc
pycompat: export queue module instead of symbols in module (API)...
r37863 import queue as queue
Pulkit Goyal
pycompat: make pycompat demandimport friendly...
r29584 import socketserver
Pulkit Goyal
py3: conditionalize xmlrpclib import...
r29432 import xmlrpc.client as xmlrpclib
Pulkit Goyal
py3: conditionalize the urlparse import...
r29431
Augie Fackler
py3: paper over differences in future exception handling...
r37687 def future_set_exception_info(f, exc_info):
f.set_exception(exc_info[0])
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
pycompat: introduce identity function as a compat stub...
r31774 def identity(a):
return a
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
pycompat: move rapply() from util...
r38594 def _rapply(f, xs):
if xs is None:
# assume None means non-value of optional data
return xs
if isinstance(xs, (list, set, tuple)):
return type(xs)(_rapply(f, x) for x in xs)
if isinstance(xs, dict):
return type(xs)((_rapply(f, k), _rapply(f, v)) for k, v in xs.items())
return f(xs)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
pycompat: move rapply() from util...
r38594 def rapply(f, xs):
"""Apply function recursively to every item preserving the data structure
>>> def f(x):
... return 'f(%s)' % x
>>> rapply(f, None) is None
True
>>> rapply(f, 'a')
'f(a)'
>>> rapply(f, {'a'}) == {'f(a)'}
True
>>> rapply(f, ['a', 'b', None, {'c': 'd'}, []])
['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []]
>>> xs = [object()]
>>> rapply(identity, xs) is xs
True
"""
if f is identity:
# fast path mainly for py2
return xs
return _rapply(f, xs)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
pycompat: provide 'ispy3' constant...
r30030 if ispy3:
Yuya Nishihara
py3: move xrange alias next to import lines...
r29797 import builtins
Gregory Szorc
py3: define and use json.loads polyfill...
r43697 import codecs
Yuya Nishihara
py3: provide (del|get|has|set)attr wrappers that accepts bytes...
r29799 import functools
Yuya Nishihara
pycompat: move imports of cStringIO/io to where they are used...
r31372 import io
Martin von Zweigbergk
py3: optimize py3 compat.bytechr using Struct.pack...
r31424 import struct
Yuya Nishihara
pycompat: move imports of cStringIO/io to where they are used...
r31372
Yuya Nishihara
py3: enable legacy fs encoding to fix filename compatibility on Windows...
r43613 if os.name == r'nt' and sys.version_info >= (3, 6):
# MBCS (or ANSI) filesystem encoding must be used as before.
# Otherwise non-ASCII filenames in existing repositories would be
# corrupted.
# This must be set once prior to any fsencode/fsdecode calls.
Matt Harbison
windows: suppress pytype warnings for Windows imports and functions...
r44156 sys._enablelegacywindowsfsencoding() # pytype: disable=module-attr
Yuya Nishihara
py3: enable legacy fs encoding to fix filename compatibility on Windows...
r43613
Martijn Pieters
py3: add an os.fsencode backport to ease path handling
r30119 fsencode = os.fsencode
Pulkit Goyal
py3: add os.fsdecode() as pycompat.fsdecode()...
r30300 fsdecode = os.fsdecode
Yuya Nishihara
py3: make os.curdir a bytes
r36666 oscurdir = os.curdir.encode('ascii')
Yuya Nishihara
pycompat: provide bytes os.linesep
r31775 oslinesep = os.linesep.encode('ascii')
Pulkit Goyal
py3: add a bytes version of os.name...
r30302 osname = os.name.encode('ascii')
Pulkit Goyal
py3: have pycompat.ospathsep and pycompat.ossep...
r30303 ospathsep = os.pathsep.encode('ascii')
Yuya Nishihara
py3: make os.pardir a bytes
r36665 ospardir = os.pardir.encode('ascii')
Pulkit Goyal
py3: have pycompat.ospathsep and pycompat.ossep...
r30303 ossep = os.sep.encode('ascii')
Pulkit Goyal
py3: have a bytes version of os.altsep...
r30623 osaltsep = os.altsep
if osaltsep:
osaltsep = osaltsep.encode('ascii')
Matt Harbison
py3: rename pycompat.getcwd() to encoding.getcwd() (API)...
r39843
Pulkit Goyal
py3: have a bytes version of sys.platform...
r30624 sysplatform = sys.platform.encode('ascii')
Pulkit Goyal
py3: have bytes version of sys.executable...
r30668 sysexecutable = sys.executable
if sysexecutable:
sysexecutable = os.fsencode(sysexecutable)
Gregory Szorc
util: prefer "bytesio" to "stringio"...
r36976 bytesio = io.BytesIO
# TODO deprecate stringio name, as it is a lie on Python 3.
stringio = bytesio
Yuya Nishihara
pycompat: name maplist() and ziplist() for better traceback message
r36952
def maplist(*args):
return list(map(*args))
Yuya Nishihara
annotate: do not construct attr.s object per line while computing history...
r37082 def rangelist(*args):
return list(range(*args))
Yuya Nishihara
pycompat: name maplist() and ziplist() for better traceback message
r36952 def ziplist(*args):
return list(zip(*args))
Yuya Nishihara
py3: select input or raw_input by pycompat...
r33853 rawinput = input
Augie Fackler
py3: introduce and use pycompat.getargspec...
r36196 getargspec = inspect.getfullargspec
Yuya Nishihara
py3: document why os.fsencode() can be used to get back bytes argv...
r30334
Matt Harbison
cbor: teach the encoder to handle python `long` type for Windows...
r39490 long = int
Yuya Nishihara
py3: provide bytes stdin/out/err through util module...
r30472 # TODO: .buffer might not exist if std streams were replaced; we'll need
# a silly wrapper to make a bytes stream backed by a unicode one.
stdin = sys.stdin.buffer
stdout = sys.stdout.buffer
stderr = sys.stderr.buffer
Yuya Nishihara
py3: document why os.fsencode() can be used to get back bytes argv...
r30334 # Since Python 3 converts argv to wchar_t type by Py_DecodeLocale() on Unix,
# we can use os.fsencode() to get back bytes argv.
#
# https://hg.python.org/cpython/file/v3.5.1/Programs/python.c#l55
#
Yuya Nishihara
py3: enable legacy fs encoding to fix filename compatibility on Windows...
r43613 # On Windows, the native argv is unicode and is converted to MBCS bytes
# since we do enable the legacy filesystem encoding.
Augie Fackler
pycompat: verify sys.argv exists before forwarding it (issue5493)...
r31277 if getattr(sys, 'argv', None) is not None:
sysargv = list(map(os.fsencode, sys.argv))
Yuya Nishihara
py3: move xrange alias next to import lines...
r29797
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 bytechr = struct.Struct('>B').pack
Yuya Nishihara
py3: factor out byterepr() which returns an asciified value on py3
r36279 byterepr = b'%r'.__mod__
Yuya Nishihara
py3: factor out bytechr() function...
r31253
Yuya Nishihara
pycompat: add bytestr wrapper which mostly acts as a Python 2 str...
r31439 class bytestr(bytes):
"""A bytes which mostly acts as a Python 2 str
>>> bytestr(), bytestr(bytearray(b'foo')), bytestr(u'ascii'), bytestr(1)
Yuya Nishihara
py3: always drop b'' prefix from repr() of bytestr...
r35921 ('', 'foo', 'ascii', '1')
Yuya Nishihara
pycompat: add bytestr wrapper which mostly acts as a Python 2 str...
r31439 >>> s = bytestr(b'foo')
>>> assert s is bytestr(s)
Yuya Nishihara
pycompat: try __bytes__() to convert object to bytestr...
r32450 __bytes__() should be called if provided:
>>> class bytesable(object):
... def __bytes__(self):
... return b'bytes'
>>> bytestr(bytesable())
Yuya Nishihara
py3: always drop b'' prefix from repr() of bytestr...
r35921 'bytes'
Yuya Nishihara
pycompat: try __bytes__() to convert object to bytestr...
r32450
Yuya Nishihara
pycompat: add bytestr wrapper which mostly acts as a Python 2 str...
r31439 There's no implicit conversion from non-ascii str as its encoding is
unknown:
>>> bytestr(chr(0x80)) # doctest: +ELLIPSIS
Traceback (most recent call last):
...
UnicodeEncodeError: ...
Comparison between bytestr and bytes should work:
>>> assert bytestr(b'foo') == b'foo'
>>> assert b'foo' == bytestr(b'foo')
>>> assert b'f' in bytestr(b'foo')
>>> assert bytestr(b'f') in b'foo'
Sliced elements should be bytes, not integer:
>>> s[1], s[:2]
(b'o', b'fo')
>>> list(s), list(reversed(s))
([b'f', b'o', b'o'], [b'o', b'o', b'f'])
As bytestr type isn't propagated across operations, you need to cast
bytes to bytestr explicitly:
>>> s = bytestr(b'foo').upper()
>>> t = bytestr(s)
>>> s[0], t[0]
(70, b'F')
Be careful to not pass a bytestr object to a function which expects
bytearray-like behavior.
>>> t = bytes(t) # cast to bytes
>>> assert type(t) is bytes
"""
def __new__(cls, s=b''):
if isinstance(s, bytestr):
return s
Augie Fackler
formatting: blacken the codebase...
r43346 if not isinstance(
s, (bytes, bytearray)
) and not hasattr( # hasattr-py3-only
s, u'__bytes__'
):
Gregory Szorc
py3: stop normalizing .encode()/.decode() arguments to unicode...
r43361 s = str(s).encode('ascii')
Yuya Nishihara
pycompat: add bytestr wrapper which mostly acts as a Python 2 str...
r31439 return bytes.__new__(cls, s)
def __getitem__(self, key):
s = bytes.__getitem__(self, key)
if not isinstance(s, bytes):
s = bytechr(s)
return s
def __iter__(self):
return iterbytestr(bytes.__iter__(self))
Yuya Nishihara
py3: always drop b'' prefix from repr() of bytestr...
r35921 def __repr__(self):
return bytes.__repr__(self)[1:] # drop b''
Yuya Nishihara
pycompat: add helper to iterate each char in bytes
r31382 def iterbytestr(s):
"""Iterate bytes as if it were a str object of Python 2"""
Martin von Zweigbergk
py3: make py3 compat.iterbytestr simpler and faster...
r31425 return map(bytechr, s)
Yuya Nishihara
pycompat: add helper to iterate each char in bytes
r31382
Yuya Nishihara
py3: drop b'' from repr() of smartset...
r35922 def maybebytestr(s):
"""Promote bytes to bytestr"""
if isinstance(s, bytes):
return bytestr(s)
return s
Yuya Nishihara
py3: have registrar process docstrings in bytes...
r31820 def sysbytes(s):
"""Convert an internal str (e.g. keyword, __doc__) back to bytes
This never raises UnicodeEncodeError, but only ASCII characters
can be round-trip by sysstr(sysbytes(s)).
"""
Gregory Szorc
py3: stop normalizing .encode()/.decode() arguments to unicode...
r43361 return s.encode('utf-8')
Yuya Nishihara
py3: have registrar process docstrings in bytes...
r31820
Yuya Nishihara
pycompat: extract function that converts attribute or encoding name to str...
r30032 def sysstr(s):
"""Return a keyword str to be passed to Python functions such as
getattr() and str.encode()
This never raises UnicodeDecodeError. Non-ascii characters are
considered invalid and mapped to arbitrary but unique code points
such that 'sysstr(a) != sysstr(b)' for all 'a != b'.
"""
if isinstance(s, builtins.str):
return s
Gregory Szorc
py3: stop normalizing .encode()/.decode() arguments to unicode...
r43361 return s.decode('latin-1')
Yuya Nishihara
pycompat: extract function that converts attribute or encoding name to str...
r30032
Pulkit Goyal
py3: add a new strurl() which will convert a bytes url to str
r32859 def strurl(url):
"""Converts a bytes url back to str"""
Pulkit Goyal
pycompat: prevent encoding or decoding values if not required...
r36662 if isinstance(url, bytes):
Gregory Szorc
py3: stop normalizing .encode()/.decode() arguments to unicode...
r43361 return url.decode('ascii')
Pulkit Goyal
pycompat: prevent encoding or decoding values if not required...
r36662 return url
Pulkit Goyal
py3: add a new strurl() which will convert a bytes url to str
r32859
Pulkit Goyal
py3: add a new bytesurl() to convert a str url into bytes
r32860 def bytesurl(url):
"""Converts a str url to bytes by encoding in ascii"""
Pulkit Goyal
pycompat: prevent encoding or decoding values if not required...
r36662 if isinstance(url, str):
Gregory Szorc
py3: stop normalizing .encode()/.decode() arguments to unicode...
r43361 return url.encode('ascii')
Pulkit Goyal
pycompat: prevent encoding or decoding values if not required...
r36662 return url
Pulkit Goyal
py3: add a new bytesurl() to convert a str url into bytes
r32860
Yuya Nishihara
pycompat: extract helper to raise exception with traceback...
r32186 def raisewithtb(exc, tb):
"""Raise exception with the given traceback"""
raise exc.with_traceback(tb)
Yuya Nishihara
py3: convert __doc__ back to bytes in help.py...
r32615 def getdoc(obj):
"""Get docstring as bytes; may be None so gettext() won't confuse it
with _('')"""
Gregory Szorc
py3: stop normalizing 2nd argument of *attr() to unicode...
r43373 doc = getattr(obj, '__doc__', None)
Yuya Nishihara
py3: convert __doc__ back to bytes in help.py...
r32615 if doc is None:
return doc
return sysbytes(doc)
Yuya Nishihara
py3: provide (del|get|has|set)attr wrappers that accepts bytes...
r29799 def _wrapattrfunc(f):
@functools.wraps(f)
def w(object, name, *args):
Yuya Nishihara
pycompat: extract function that converts attribute or encoding name to str...
r30032 return f(object, sysstr(name), *args)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
py3: provide (del|get|has|set)attr wrappers that accepts bytes...
r29799 return w
Yuya Nishihara
py3: import builtin wrappers automagically by code transformer...
r29800 # these wrappers are automagically imported by hgloader
Yuya Nishihara
py3: provide (del|get|has|set)attr wrappers that accepts bytes...
r29799 delattr = _wrapattrfunc(builtins.delattr)
getattr = _wrapattrfunc(builtins.getattr)
hasattr = _wrapattrfunc(builtins.hasattr)
setattr = _wrapattrfunc(builtins.setattr)
Yuya Nishihara
py3: import builtin wrappers automagically by code transformer...
r29800 xrange = builtins.range
Pulkit Goyal
py3: add pycompat.unicode and add it to importer...
r31843 unicode = str
Yuya Nishihara
py3: provide (del|get|has|set)attr wrappers that accepts bytes...
r29799
Matt Harbison
py3: byteify strings in pycompat...
r39678 def open(name, mode=b'r', buffering=-1, encoding=None):
Augie Fackler
pycompat: add support for encoding argument to our wrapper...
r36574 return builtins.open(name, sysstr(mode), buffering, encoding)
Pulkit Goyal
py3: add pycompat.open and replace open() calls...
r31149
Yuya Nishihara
util: make safehasattr() a pycompat function...
r37117 safehasattr = _wrapattrfunc(builtins.hasattr)
Yuya Nishihara
fancyopts: use getopt.gnu_getopt()...
r35226 def _getoptbwrapper(orig, args, shortlist, namelist):
Pulkit Goyal
pycompat: move multiline comments above a function to function doc...
r32864 """
Takes bytes arguments, converts them to unicode, pass them to
getopt.getopt(), convert the returned values back to bytes and then
return them for Python 3 compatibility as getopt.getopt() don't accepts
bytes on Python 3.
"""
Pulkit Goyal
py3: make a bytes version of getopt.getopt()...
r30578 args = [a.decode('latin-1') for a in args]
shortlist = shortlist.decode('latin-1')
namelist = [a.decode('latin-1') for a in namelist]
Yuya Nishihara
fancyopts: use getopt.gnu_getopt()...
r35226 opts, args = orig(args, shortlist, namelist)
Augie Fackler
formatting: blacken the codebase...
r43346 opts = [(a[0].encode('latin-1'), a[1].encode('latin-1')) for a in opts]
Pulkit Goyal
py3: make a bytes version of getopt.getopt()...
r30578 args = [a.encode('latin-1') for a in args]
return opts, args
Pulkit Goyal
py3: utility functions to convert keys of kwargs to bytes/unicodes...
r30579 def strkwargs(dic):
Pulkit Goyal
pycompat: move multiline comments above a function to function doc...
r32864 """
Converts the keys of a python dictonary to str i.e. unicodes so that
they can be passed as keyword arguments as dictonaries with bytes keys
can't be passed as keyword arguments to functions on Python 3.
"""
Gregory Szorc
py3: finish porting iteritems() to pycompat and remove source transformer...
r43376 dic = dict((k.decode('latin-1'), v) for k, v in dic.items())
Pulkit Goyal
py3: utility functions to convert keys of kwargs to bytes/unicodes...
r30579 return dic
def byteskwargs(dic):
Pulkit Goyal
pycompat: move multiline comments above a function to function doc...
r32864 """
Converts keys of python dictonaries to bytes as they were converted to
str to pass that dictonary as a keyword argument on Python 3.
"""
Gregory Szorc
py3: finish porting iteritems() to pycompat and remove source transformer...
r43376 dic = dict((k.encode('latin-1'), v) for k, v in dic.items())
Pulkit Goyal
py3: utility functions to convert keys of kwargs to bytes/unicodes...
r30579 return dic
Pulkit Goyal
py3: have a bytes version of shlex.split()...
r30678 # TODO: handle shlex.shlex().
Matt Harbison
pycompat: correct the shlex.split() proxy method signature in py3
r36352 def shlexsplit(s, comments=False, posix=True):
Pulkit Goyal
pycompat: move multiline comments above a function to function doc...
r32864 """
Takes bytes argument, convert it to str i.e. unicodes, pass that into
shlex.split(), convert the returned value to bytes and return that for
Python 3 compatibility as shelx.split() don't accept bytes on Python 3.
"""
Matt Harbison
pycompat: correct the shlex.split() proxy method signature in py3
r36352 ret = shlex.split(s.decode('latin-1'), comments, posix)
Pulkit Goyal
py3: have a bytes version of shlex.split()...
r30678 return [a.encode('latin-1') for a in ret]
Gregory Szorc
py3: define and use pycompat.iteritems() for hgext/...
r43375 iteritems = lambda x: x.items()
Gregory Szorc
py3: define and use pycompat.itervalues()...
r43374 itervalues = lambda x: x.values()
Floris Bruynooghe
patchbomb: protect email addresses from shell...
r43289
Gregory Szorc
py3: define and use json.loads polyfill...
r43697 # Python 3.5's json.load and json.loads require str. We polyfill its
# code for detecting encoding from bytes.
if sys.version_info[0:2] < (3, 6):
def _detect_encoding(b):
bstartswith = b.startswith
if bstartswith((codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE)):
return 'utf-32'
if bstartswith((codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE)):
return 'utf-16'
if bstartswith(codecs.BOM_UTF8):
return 'utf-8-sig'
if len(b) >= 4:
if not b[0]:
# 00 00 -- -- - utf-32-be
# 00 XX -- -- - utf-16-be
return 'utf-16-be' if b[1] else 'utf-32-be'
if not b[1]:
# XX 00 00 00 - utf-32-le
# XX 00 00 XX - utf-16-le
# XX 00 XX -- - utf-16-le
return 'utf-16-le' if b[2] or b[3] else 'utf-32-le'
elif len(b) == 2:
if not b[0]:
# 00 XX - utf-16-be
return 'utf-16-be'
if not b[1]:
# XX 00 - utf-16-le
return 'utf-16-le'
# default
return 'utf-8'
def json_loads(s, *args, **kwargs):
if isinstance(s, (bytes, bytearray)):
s = s.decode(_detect_encoding(s), 'surrogatepass')
return json.loads(s, *args, **kwargs)
else:
json_loads = json.loads
Yuya Nishihara
pycompat: extract function that converts attribute or encoding name to str...
r30032 else:
Yuya Nishihara
pycompat: move imports of cStringIO/io to where they are used...
r31372 import cStringIO
Gregory Szorc
pycompat: add xrange alias for Python 2...
r38805 xrange = xrange
Pulkit Goyal
py3: replace `unicode` with pycompat.unicode...
r38332 unicode = unicode
Yuya Nishihara
py3: factor out bytechr() function...
r31253 bytechr = chr
Yuya Nishihara
py3: factor out byterepr() which returns an asciified value on py3
r36279 byterepr = repr
Yuya Nishihara
pycompat: add bytestr wrapper which mostly acts as a Python 2 str...
r31439 bytestr = str
Yuya Nishihara
pycompat: add helper to iterate each char in bytes
r31382 iterbytestr = iter
Yuya Nishihara
py3: drop b'' from repr() of smartset...
r35922 maybebytestr = identity
Yuya Nishihara
py3: have registrar process docstrings in bytes...
r31820 sysbytes = identity
Yuya Nishihara
pycompat: introduce identity function as a compat stub...
r31774 sysstr = identity
Pulkit Goyal
py3: add a new strurl() which will convert a bytes url to str
r32859 strurl = identity
Pulkit Goyal
py3: add a new bytesurl() to convert a str url into bytes
r32860 bytesurl = identity
Gregory Szorc
py3: manually import pycompat.open into files that need it...
r43355 open = open
Gregory Szorc
py3: manually import pycompat.delattr where it is needed...
r43360 delattr = delattr
Gregory Szorc
py3: manually import getattr where it is needed...
r43359 getattr = getattr
Gregory Szorc
py3: stop injecting pycompat.hasattr into modules...
r43358 hasattr = hasattr
Gregory Szorc
py3: manually import pycompat.setattr where it is needed...
r43357 setattr = setattr
Yuya Nishihara
pycompat: extract function that converts attribute or encoding name to str...
r30032
Yuya Nishihara
pycompat: extract helper to raise exception with traceback...
r32186 # this can't be parsed on Python 3
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 exec(b'def raisewithtb(exc, tb):\n raise exc, None, tb\n')
Yuya Nishihara
pycompat: extract helper to raise exception with traceback...
r32186
Martijn Pieters
pycompat: only accept a bytestring filepath in Python 2
r30133 def fsencode(filename):
Pulkit Goyal
pycompat: move multiline comments above a function to function doc...
r32864 """
Partial backport from os.py in Python 3, which only accepts bytes.
In Python 2, our paths should only ever be bytes, a unicode path
indicates a bug.
"""
Martijn Pieters
pycompat: only accept a bytestring filepath in Python 2
r30133 if isinstance(filename, str):
return filename
Martijn Pieters
py3: add an os.fsencode backport to ease path handling
r30119 else:
Augie Fackler
cleanup: remove pointless r-prefixes on double-quoted strings...
r43809 raise TypeError("expect str, not %s" % type(filename).__name__)
Martijn Pieters
py3: add an os.fsencode backport to ease path handling
r30119
Pulkit Goyal
py3: add os.fsdecode() as pycompat.fsdecode()...
r30300 # In Python 2, fsdecode() has a very chance to receive bytes. So it's
# better not to touch Python 2 part as it's already working fine.
Yuya Nishihara
pycompat: introduce identity function as a compat stub...
r31774 fsdecode = identity
Pulkit Goyal
py3: add os.fsdecode() as pycompat.fsdecode()...
r30300
Yuya Nishihara
py3: convert __doc__ back to bytes in help.py...
r32615 def getdoc(obj):
return getattr(obj, '__doc__', None)
Yuya Nishihara
util: make safehasattr() a pycompat function...
r37117 _notset = object()
def safehasattr(thing, attr):
return getattr(thing, attr, _notset) is not _notset
Yuya Nishihara
fancyopts: use getopt.gnu_getopt()...
r35226 def _getoptbwrapper(orig, args, shortlist, namelist):
return orig(args, shortlist, namelist)
Pulkit Goyal
py3: make a bytes version of getopt.getopt()...
r30578
Yuya Nishihara
pycompat: introduce identity function as a compat stub...
r31774 strkwargs = identity
byteskwargs = identity
Pulkit Goyal
py3: utility functions to convert keys of kwargs to bytes/unicodes...
r30579
Yuya Nishihara
py3: make os.curdir a bytes
r36666 oscurdir = os.curdir
Yuya Nishihara
pycompat: provide bytes os.linesep
r31775 oslinesep = os.linesep
Pulkit Goyal
py3: add a bytes version of os.name...
r30302 osname = os.name
Pulkit Goyal
py3: have pycompat.ospathsep and pycompat.ossep...
r30303 ospathsep = os.pathsep
Yuya Nishihara
py3: make os.pardir a bytes
r36665 ospardir = os.pardir
Pulkit Goyal
py3: have pycompat.ospathsep and pycompat.ossep...
r30303 ossep = os.sep
Pulkit Goyal
py3: have a bytes version of os.altsep...
r30623 osaltsep = os.altsep
Matt Harbison
cbor: teach the encoder to handle python `long` type for Windows...
r39490 long = long
Yuya Nishihara
py3: provide bytes stdin/out/err through util module...
r30472 stdin = sys.stdin
stdout = sys.stdout
stderr = sys.stderr
Augie Fackler
pycompat: verify sys.argv exists before forwarding it (issue5493)...
r31277 if getattr(sys, 'argv', None) is not None:
sysargv = sys.argv
Pulkit Goyal
py3: have a bytes version of sys.platform...
r30624 sysplatform = sys.platform
Pulkit Goyal
py3: have bytes version of sys.executable...
r30668 sysexecutable = sys.executable
Pulkit Goyal
py3: have a bytes version of shlex.split()...
r30678 shlexsplit = shlex.split
Gregory Szorc
util: prefer "bytesio" to "stringio"...
r36976 bytesio = cStringIO.StringIO
stringio = bytesio
Augie Fackler
pycompat: add maplist alias for old map behavior
r31501 maplist = map
Yuya Nishihara
annotate: do not construct attr.s object per line while computing history...
r37082 rangelist = range
Pulkit Goyal
py3: introduce pycompat.ziplist as zip is a generator on Python 3...
r35406 ziplist = zip
Yuya Nishihara
py3: select input or raw_input by pycompat...
r33853 rawinput = raw_input
Augie Fackler
py3: introduce and use pycompat.getargspec...
r36196 getargspec = inspect.getargspec
Gregory Szorc
py3: define and use pycompat.iteritems() for hgext/...
r43375 iteritems = lambda x: x.iteritems()
Gregory Szorc
py3: define and use pycompat.itervalues()...
r43374 itervalues = lambda x: x.itervalues()
Gregory Szorc
py3: define and use json.loads polyfill...
r43697 json_loads = json.loads
Jun Wu
selectors2: do not use platform.system()...
r34640
Matt Harbison
py3: byteify strings in pycompat...
r39678 isjython = sysplatform.startswith(b'java')
Jun Wu
pycompat: define operating system constants...
r34645
rdamazio@google.com
pycompat: adding Linux detection and fixing Mac...
r40563 isdarwin = sysplatform.startswith(b'darwin')
islinux = sysplatform.startswith(b'linux')
Matt Harbison
py3: byteify strings in pycompat...
r39678 isposix = osname == b'posix'
iswindows = osname == b'nt'
Yuya Nishihara
fancyopts: use getopt.gnu_getopt()...
r35226
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fancyopts: use getopt.gnu_getopt()...
r35226 def getoptb(args, shortlist, namelist):
return _getoptbwrapper(getopt.getopt, args, shortlist, namelist)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
fancyopts: use getopt.gnu_getopt()...
r35226 def gnugetoptb(args, shortlist, namelist):
return _getoptbwrapper(getopt.gnu_getopt, args, shortlist, namelist)
Yuya Nishihara
py3: wrap tempfile.mkstemp() to use bytes path...
r38182
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
py3: wrap tempfile.mkdtemp() to use bytes path...
r38183 def mkdtemp(suffix=b'', prefix=b'tmp', dir=None):
return tempfile.mkdtemp(suffix, prefix, dir)
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
py3: wrap tempfile.mkstemp() to use bytes path...
r38182 # text=True is not supported; use util.from/tonativeeol() instead
def mkstemp(suffix=b'', prefix=b'tmp', dir=None):
return tempfile.mkstemp(suffix, prefix, dir)
Yuya Nishihara
py3: wrap tempfile.NamedTemporaryFile() to return bytes fp.name...
r38184
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
py3: wrap tempfile.NamedTemporaryFile() to return bytes fp.name...
r38184 # mode must include 'b'ytes as encoding= is not supported
Augie Fackler
formatting: blacken the codebase...
r43346 def namedtempfile(
mode=b'w+b', bufsize=-1, suffix=b'', prefix=b'tmp', dir=None, delete=True
):
Yuya Nishihara
py3: wrap tempfile.NamedTemporaryFile() to return bytes fp.name...
r38184 mode = sysstr(mode)
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 assert 'b' in mode
Augie Fackler
formatting: blacken the codebase...
r43346 return tempfile.NamedTemporaryFile(
mode, bufsize, suffix=suffix, prefix=prefix, dir=dir, delete=delete
)