mirror of
https://github.com/facebook/sapling.git
synced 2024-10-08 15:57:43 +03:00
pycompat: extract function that converts attribute or encoding name to str
This will be used to convert encoding.encoding to a str acceptable by Python 3 functions. The source encoding is changed to "latin-1" because encoding.encoding can have arbitrary bytes. Since valid names should consist of ASCII characters, we don't care about the mapping of non-ASCII characters so long as invalid names are distinct from valid names.
This commit is contained in:
parent
7c03e0d6ba
commit
fd6ad62876
@ -35,12 +35,22 @@ if ispy3:
|
||||
import builtins
|
||||
import functools
|
||||
|
||||
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
|
||||
return s.decode(u'latin-1')
|
||||
|
||||
def _wrapattrfunc(f):
|
||||
@functools.wraps(f)
|
||||
def w(object, name, *args):
|
||||
if isinstance(name, bytes):
|
||||
name = name.decode(u'utf-8')
|
||||
return f(object, name, *args)
|
||||
return f(object, sysstr(name), *args)
|
||||
return w
|
||||
|
||||
# these wrappers are automagically imported by hgloader
|
||||
@ -50,6 +60,10 @@ if ispy3:
|
||||
setattr = _wrapattrfunc(builtins.setattr)
|
||||
xrange = builtins.range
|
||||
|
||||
else:
|
||||
def sysstr(s):
|
||||
return s
|
||||
|
||||
stringio = io.StringIO
|
||||
empty = _queue.Empty
|
||||
queue = _queue.Queue
|
||||
|
Loading…
Reference in New Issue
Block a user