[PATCH 2 of 3 RFC] global: u'' prefix some literals to appease module importing
Gregory Szorc
gregory.szorc at gmail.com
Mon May 16 11:47:23 EDT 2016
> On May 16, 2016, at 08:25, timeless <timeless at gmail.com> wrote:
>
> I think I sent an environment bytes class for run tests, if we like it, we could use it generally to address all environment hunks.
>
> That wouldn't handle calls to encode, which might be handled by saying we only use encoding.encode/decode
>
The u'' prefixing in os.environ in this patch is most certainly wrong. We very well might need your environment bytes class.
>> On May 16, 2016 12:03 AM, "Gregory Szorc" <gregory.szorc at gmail.com> wrote:
>> # HG changeset patch
>> # User Gregory Szorc <gregory.szorc at gmail.com>
>> # Date 1463371145 25200
>> # Sun May 15 20:59:05 2016 -0700
>> # Node ID effc44c0ec7440fabb134a076e974ca478d89e11
>> # Parent 7c5d1f8db9618f511f40bc4089145310671ca57b
>> global: u'' prefix some literals to appease module importing
>>
>> This demonstrates how global mass rewriting of string literals
>> to b'' in Python 3 can be too aggressive and result in Python 3
>> complaining. All these changes (and more) are needed to preserve
>> literals in Python 3 as the str (not bytes) type.
>>
>> With this change, running `hg` fails on Python due to encountering
>> an "iteritems," which of course does not exist.
>>
>> This change also breaks Python 2, so it isn't fit for checkin.
>>
>> diff --git a/mercurial/demandimport.py b/mercurial/demandimport.py
>> --- a/mercurial/demandimport.py
>> +++ b/mercurial/demandimport.py
>> @@ -262,17 +262,17 @@ ignore = [
>> 'distutils.msvc9compiler'
>> ]
>>
>> def isenabled():
>> return builtins.__import__ == _demandimport
>>
>> def enable():
>> "enable global demand-loading of modules"
>> - if os.environ.get('HGDEMANDIMPORT') != 'disable':
>> + if os.environ.get(u'HGDEMANDIMPORT') != u'disable':
>> builtins.__import__ = _demandimport
>>
>> def disable():
>> "disable global demand-loading of modules"
>> builtins.__import__ = _origimport
>>
>> @contextmanager
>> def deactivated():
>> diff --git a/mercurial/encoding.py b/mercurial/encoding.py
>> --- a/mercurial/encoding.py
>> +++ b/mercurial/encoding.py
>> @@ -18,17 +18,17 @@ from . import (
>> )
>>
>> if sys.version_info[0] >= 3:
>> unichr = chr
>>
>> # These unicode characters are ignored by HFS+ (Apple Technote 1150,
>> # "Unicode Subtleties"), so we need to ignore them in some places for
>> # sanity.
>> -_ignore = [unichr(int(x, 16)).encode("utf-8") for x in
>> +_ignore = [unichr(int(x, 16)).encode(u"utf-8") for x in
>> "200c 200d 200e 200f 202a 202b 202c 202d 202e "
>> "206a 206b 206c 206d 206e 206f feff".split()]
>> # verify the next function will work
>> if sys.version_info[0] >= 3:
>> assert set(i[0] for i in _ignore) == set([ord(b'\xe2'), ord(b'\xef')])
>> else:
>> assert set(i[0] for i in _ignore) == set(["\xe2", "\xef"])
>>
>> @@ -71,23 +71,23 @@ def _getpreferredencoding():
>>
>> _encodingfixers = {
>> '646': lambda: 'ascii',
>> 'ANSI_X3.4-1968': lambda: 'ascii',
>> 'mac-roman': _getpreferredencoding
>> }
>>
>> try:
>> - encoding = os.environ.get("HGENCODING")
>> + encoding = os.environ.get(u"HGENCODING")
>> if not encoding:
>> encoding = locale.getpreferredencoding() or 'ascii'
>> encoding = _encodingfixers.get(encoding, lambda: encoding)()
>> except locale.Error:
>> encoding = 'ascii'
>> -encodingmode = os.environ.get("HGENCODINGMODE", "strict")
>> +encodingmode = os.environ.get(u"HGENCODINGMODE", u"strict")
>> fallbackencoding = 'ISO-8859-1'
>>
>> class localstr(str):
>> '''This class allows strings that are unmodified to be
>> round-tripped to the local encoding and back'''
>> def __new__(cls, u, l):
>> s = str.__new__(cls, l)
>> s._utf8 = u
>> @@ -175,17 +175,17 @@ def fromlocal(s):
>> return s.decode(encoding, encodingmode).encode("utf-8")
>> except UnicodeDecodeError as inst:
>> sub = s[max(0, inst.start - 10):inst.start + 10]
>> raise error.Abort("decoding near '%s': %s!" % (sub, inst))
>> except LookupError as k:
>> raise error.Abort(k, hint="please check your locale settings")
>>
>> # How to treat ambiguous-width characters. Set to 'wide' to treat as wide.
>> -wide = (os.environ.get("HGENCODINGAMBIGUOUS", "narrow") == "wide"
>> +wide = (os.environ.get(u"HGENCODINGAMBIGUOUS", u"narrow") == u"wide"
>> and "WFA" or "WF")
>>
>> def colwidth(s):
>> "Find the column width of a string for display in the local encoding"
>> return ucolwidth(s.decode(encoding, 'replace'))
>>
>> def ucolwidth(d):
>> "Find the column width of a Unicode string for display"
>> diff --git a/mercurial/i18n.py b/mercurial/i18n.py
>> --- a/mercurial/i18n.py
>> +++ b/mercurial/i18n.py
>> @@ -10,17 +10,17 @@ from __future__ import absolute_import
>> import gettext as gettextmod
>> import locale
>> import os
>> import sys
>>
>> from . import encoding
>>
>> # modelled after templater.templatepath:
>> -if getattr(sys, 'frozen', None) is not None:
>> +if getattr(sys, u'frozen', None) is not None:
>> module = sys.executable
>> else:
>> module = __file__
>>
>> try:
>> unicode
>> except NameError:
>> unicode = str
>> @@ -41,17 +41,17 @@ if (os.name == 'nt'
>> _languages = [locale.windows_locale[langid]]
>> except (ImportError, AttributeError, KeyError):
>> # ctypes not found or unknown langid
>> pass
>>
>> _ugettext = None
>>
>> def setdatapath(datapath):
>> - localedir = os.path.join(datapath, 'locale')
>> + localedir = os.path.join(datapath, u'locale')
>> t = gettextmod.translation('hg', localedir, _languages, fallback=True)
>> global _ugettext
>> try:
>> _ugettext = t.ugettext
>> except AttributeError:
>> _ugettext = t.gettext
>>
>> _msgcache = {}
>> @@ -70,34 +70,34 @@ def gettext(message):
>> if message is None or not _ugettext:
>> return message
>>
>> if message not in _msgcache:
>> if type(message) is unicode:
>> # goofy unicode docstrings in test
>> paragraphs = message.split(u'\n\n')
>> else:
>> - paragraphs = [p.decode("ascii") for p in message.split('\n\n')]
>> + paragraphs = [p.decode(u"ascii") for p in message.split('\n\n')]
>> # Be careful not to translate the empty string -- it holds the
>> # meta data of the .po file.
>> u = u'\n\n'.join([p and _ugettext(p) or '' for p in paragraphs])
>> try:
>> # encoding.tolocal cannot be used since it will first try to
>> # decode the Unicode string. Calling u.decode(enc) really
>> # means u.encode(sys.getdefaultencoding()).decode(enc). Since
>> # the Python encoding defaults to 'ascii', this fails if the
>> # translated string use non-ASCII characters.
>> - _msgcache[message] = u.encode(encoding.encoding, "replace")
>> + _msgcache[message] = u.encode(encoding.encoding, u"replace")
>> except LookupError:
>> # An unknown encoding results in a LookupError.
>> _msgcache[message] = message
>> return _msgcache[message]
>>
>> def _plain():
>> - if 'HGPLAIN' not in os.environ and 'HGPLAINEXCEPT' not in os.environ:
>> + if u'HGPLAIN' not in os.environ and u'HGPLAINEXCEPT' not in os.environ:
>> return False
>> - exceptions = os.environ.get('HGPLAINEXCEPT', '').strip().split(',')
>> - return 'i18n' not in exceptions
>> + exceptions = os.environ.get(u'HGPLAINEXCEPT', u'').strip().split(u',')
>> + return u'i18n' not in exceptions
>>
>> if _plain():
>> _ = lambda message: message
>> else:
>> _ = gettext
>> diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py
>> --- a/mercurial/mdiff.py
>> +++ b/mercurial/mdiff.py
>> @@ -40,27 +40,27 @@ class diffopts(object):
>> noprefix disables the 'a/' and 'b/' prefixes (ignored in plain mode)
>> ignorews ignores all whitespace changes in the diff
>> ignorewsamount ignores changes in the amount of whitespace
>> ignoreblanklines ignores changes whose lines are all blank
>> upgrade generates git diffs to avoid data loss
>> '''
>>
>> defaults = {
>> - 'context': 3,
>> - 'text': False,
>> - 'showfunc': False,
>> - 'git': False,
>> - 'nodates': False,
>> - 'nobinary': False,
>> - 'noprefix': False,
>> - 'ignorews': False,
>> - 'ignorewsamount': False,
>> - 'ignoreblanklines': False,
>> - 'upgrade': False,
>> + u'context': 3,
>> + u'text': False,
>> + u'showfunc': False,
>> + u'git': False,
>> + u'nodates': False,
>> + u'nobinary': False,
>> + u'noprefix': False,
>> + u'ignorews': False,
>> + u'ignorewsamount': False,
>> + u'ignoreblanklines': False,
>> + u'upgrade': False,
>> }
>>
>> __slots__ = defaults.keys()
>>
>> def __init__(self, **opts):
>> for k in self.__slots__:
>> v = opts.get(k)
>> if v is None:
>> diff --git a/mercurial/pure/osutil.py b/mercurial/pure/osutil.py
>> --- a/mercurial/pure/osutil.py
>> +++ b/mercurial/pure/osutil.py
>> @@ -75,43 +75,43 @@ if os.name != 'nt':
>> _msg_iovlen_t = ctypes.c_size_t
>> else:
>> _cmsg_len_t = _socklen_t
>> _msg_controllen_t = _socklen_t
>> _msg_iovlen_t = ctypes.c_int
>>
>> class _iovec(ctypes.Structure):
>> _fields_ = [
>> - ('iov_base', ctypes.c_void_p),
>> - ('iov_len', ctypes.c_size_t),
>> + (u'iov_base', ctypes.c_void_p),
>> + (u'iov_len', ctypes.c_size_t),
>> ]
>>
>> class _msghdr(ctypes.Structure):
>> _fields_ = [
>> - ('msg_name', ctypes.c_void_p),
>> - ('msg_namelen', _socklen_t),
>> - ('msg_iov', ctypes.POINTER(_iovec)),
>> - ('msg_iovlen', _msg_iovlen_t),
>> - ('msg_control', ctypes.c_void_p),
>> - ('msg_controllen', _msg_controllen_t),
>> - ('msg_flags', ctypes.c_int),
>> + (u'msg_name', ctypes.c_void_p),
>> + (u'msg_namelen', _socklen_t),
>> + (u'msg_iov', ctypes.POINTER(_iovec)),
>> + (u'msg_iovlen', _msg_iovlen_t),
>> + (u'msg_control', ctypes.c_void_p),
>> + (u'msg_controllen', _msg_controllen_t),
>> + (u'msg_flags', ctypes.c_int),
>> ]
>>
>> class _cmsghdr(ctypes.Structure):
>> _fields_ = [
>> - ('cmsg_len', _cmsg_len_t),
>> - ('cmsg_level', ctypes.c_int),
>> - ('cmsg_type', ctypes.c_int),
>> - ('cmsg_data', ctypes.c_ubyte * 0),
>> + (u'cmsg_len', _cmsg_len_t),
>> + (u'cmsg_level', ctypes.c_int),
>> + (u'cmsg_type', ctypes.c_int),
>> + (u'cmsg_data', ctypes.c_ubyte * 0),
>> ]
>>
>> - _libc = ctypes.CDLL(ctypes.util.find_library('c'), use_errno=True)
>> - _recvmsg = getattr(_libc, 'recvmsg', None)
>> + _libc = ctypes.CDLL(ctypes.util.find_library(u'c'), use_errno=True)
>> + _recvmsg = getattr(_libc, u'recvmsg', None)
>> if _recvmsg:
>> - _recvmsg.restype = getattr(ctypes, 'c_ssize_t', ctypes.c_long)
>> + _recvmsg.restype = getattr(ctypes, u'c_ssize_t', ctypes.c_long)
>> _recvmsg.argtypes = (ctypes.c_int, ctypes.POINTER(_msghdr),
>> ctypes.c_int)
>> else:
>> # recvmsg isn't always provided by libc; such systems are unsupported
>> def _recvmsg(sockfd, msg, flags):
>> raise NotImplementedError('unsupported platform')
>>
>> def _CMSG_FIRSTHDR(msgh):
>> diff --git a/mercurial/pycompat.py b/mercurial/pycompat.py
>> --- a/mercurial/pycompat.py
>> +++ b/mercurial/pycompat.py
>> @@ -29,17 +29,17 @@ class _pycompatstub(object):
>> pass
>>
>> def _alias(alias, origin, items):
>> """ populate a _pycompatstub
>>
>> copies items from origin to alias
>> """
>> def hgcase(item):
>> - return item.replace('_', '').lower()
>> + return item.replace(u'_', u'').lower()
>> for item in items:
>> try:
>> setattr(alias, hgcase(item), getattr(origin, item))
>> except AttributeError:
>> pass
>>
>> urlreq = _pycompatstub()
>> urlerr = _pycompatstub()
>> @@ -80,44 +80,44 @@ try:
>> _alias(urlerr, urllib2, (
>> "HTTPError",
>> "URLError",
>> ))
>>
>> except ImportError:
>> import urllib.request
>> _alias(urlreq, urllib.request, (
>> - "AbstractHTTPHandler",
>> - "addclosehook",
>> - "addinfourl",
>> - "BaseHandler",
>> - "build_opener",
>> - "FileHandler",
>> - "FTPHandler",
>> - "ftpwrapper",
>> - "HTTPHandler",
>> - "HTTPSHandler",
>> - "install_opener",
>> - "pathname2url",
>> - "HTTPBasicAuthHandler",
>> - "HTTPDigestAuthHandler",
>> - "ProxyHandler",
>> - "quote",
>> - "Request",
>> - "splitattr",
>> - "splitpasswd",
>> - "splitport",
>> - "splituser",
>> - "unquote",
>> - "url2pathname",
>> - "urlopen",
>> + u"AbstractHTTPHandler",
>> + u"addclosehook",
>> + u"addinfourl",
>> + u"BaseHandler",
>> + u"build_opener",
>> + u"FileHandler",
>> + u"FTPHandler",
>> + u"ftpwrapper",
>> + u"HTTPHandler",
>> + u"HTTPSHandler",
>> + u"install_opener",
>> + u"pathname2url",
>> + u"HTTPBasicAuthHandler",
>> + u"HTTPDigestAuthHandler",
>> + u"ProxyHandler",
>> + u"quote",
>> + u"Request",
>> + u"splitattr",
>> + u"splitpasswd",
>> + u"splitport",
>> + u"splituser",
>> + u"unquote",
>> + u"url2pathname",
>> + u"urlopen",
>> ))
>> import urllib.error
>> _alias(urlerr, urllib.error, (
>> - "HTTPError",
>> - "URLError",
>> + u"HTTPError",
>> + u"URLError",
>> ))
>>
>> try:
>> xrange
>> except NameError:
>> import builtins
>> builtins.xrange = range
>> diff --git a/mercurial/registrar.py b/mercurial/registrar.py
>> --- a/mercurial/registrar.py
>> +++ b/mercurial/registrar.py
>> @@ -44,17 +44,17 @@ class _funcregistrarbase(object):
>> self._table = table
>>
>> def __call__(self, decl, *args, **kwargs):
>> return lambda func: self._doregister(func, decl, *args, **kwargs)
>>
>> def _doregister(self, func, decl, *args, **kwargs):
>> name = self._getname(decl)
>>
>> - if func.__doc__ and not util.safehasattr(func, '_origdoc'):
>> + if func.__doc__ and not util.safehasattr(func, u'_origdoc'):
>> doc = func.__doc__.strip()
>> func._origdoc = doc
>> func.__doc__ = self._formatdoc(decl, doc)
>>
>> self._table[name] = func
>> self._extrasetup(name, func, *args, **kwargs)
>>
>> return func
>> @@ -78,17 +78,19 @@ class _funcregistrarbase(object):
>>
>> _docformat = None
>>
>> def _formatdoc(self, decl, doc):
>> """Return formatted document of the registered function for help
>>
>> 'doc' is '__doc__.strip()' of the registered function.
>> """
>> - return self._docformat % (decl, doc)
>> + # docstrings are using the source file encoding, which should be
>> + # utf-8.
>> + return self._docformat % (decl, doc.encode(u'utf-8'))
>>
>> def _extrasetup(self, name, func):
>> """Execute exra setup for registered function, if needed
>> """
>> pass
>>
>> class revsetpredicate(_funcregistrarbase):
>> """Decorator to register revset predicate
>> diff --git a/mercurial/revset.py b/mercurial/revset.py
>> --- a/mercurial/revset.py
>> +++ b/mercurial/revset.py
>> @@ -171,21 +171,21 @@ elements = {
>> "string": (0, "string", None, None, None),
>> "end": (0, None, None, None, None),
>> }
>>
>> keywords = set(['and', 'or', 'not'])
>>
>> # default set of valid characters for the initial letter of symbols
>> _syminitletters = set(c for c in [chr(i) for i in xrange(256)]
>> - if c.isalnum() or c in '._@' or ord(c) > 127)
>> + if c.isalnum() or c in u'._@' or ord(c) > 127)
>>
>> # default set of valid characters for non-initial letters of symbols
>> _symletters = set(c for c in [chr(i) for i in xrange(256)]
>> - if c.isalnum() or c in '-._/@' or ord(c) > 127)
>> + if c.isalnum() or c in u'-._/@' or ord(c) > 127)
>>
>> def tokenize(program, lookup=None, syminitletters=None, symletters=None):
>> '''
>> Parse a revset statement into a stream of tokens
>>
>> ``syminitletters`` is the set of valid characters for the initial
>> letter of symbols.
>>
>> @@ -2215,17 +2215,17 @@ def _optimize(x, small):
>>
>> def optimize(tree):
>> _weight, newtree = _optimize(tree, small=True)
>> return newtree
>>
>> # the set of valid characters for the initial letter of symbols in
>> # alias declarations and definitions
>> _aliassyminitletters = set(c for c in [chr(i) for i in xrange(256)]
>> - if c.isalnum() or c in '._@$' or ord(c) > 127)
>> + if c.isalnum() or c in u'._@$' or ord(c) > 127)
>>
>> def _parsewith(spec, lookup=None, syminitletters=None):
>> """Generate a parse tree of given spec with given tokenizing options
>>
>> >>> _parsewith('foo($1)', syminitletters=_aliassyminitletters)
>> ('func', ('symbol', 'foo'), ('symbol', '$1'))
>> >>> _parsewith('$1')
>> Traceback (most recent call last):
>> diff --git a/mercurial/sslutil.py b/mercurial/sslutil.py
>> --- a/mercurial/sslutil.py
>> +++ b/mercurial/sslutil.py
>> @@ -22,31 +22,31 @@ from . import (
>> # Python 2.7.9+ overhauled the built-in SSL/TLS features of Python. It added
>> # support for TLS 1.1, TLS 1.2, SNI, system CA stores, etc. These features are
>> # all exposed via the "ssl" module.
>> #
>> # Depending on the version of Python being used, SSL/TLS support is either
>> # modern/secure or legacy/insecure. Many operations in this module have
>> # separate code paths depending on support in Python.
>>
>> -hassni = getattr(ssl, 'HAS_SNI', False)
>> +hassni = getattr(ssl, u'HAS_SNI', False)
>>
>> try:
>> OP_NO_SSLv2 = ssl.OP_NO_SSLv2
>> OP_NO_SSLv3 = ssl.OP_NO_SSLv3
>> except AttributeError:
>> OP_NO_SSLv2 = 0x1000000
>> OP_NO_SSLv3 = 0x2000000
>>
>> try:
>> # ssl.SSLContext was added in 2.7.9 and presence indicates modern
>> # SSL/TLS features are available.
>> SSLContext = ssl.SSLContext
>> modernssl = True
>> - _canloaddefaultcerts = util.safehasattr(SSLContext, 'load_default_certs')
>> + _canloaddefaultcerts = util.safehasattr(SSLContext, u'load_default_certs')
>> except AttributeError:
>> modernssl = False
>> _canloaddefaultcerts = False
>>
>> # We implement SSLContext using the interface from the standard library.
>> class SSLContext(object):
>> # ssl.wrap_socket gained the "ciphers" named argument in 2.7.
>> _supportsciphers = sys.version_info >= (2, 7)
>> diff --git a/mercurial/util.py b/mercurial/util.py
>> --- a/mercurial/util.py
>> +++ b/mercurial/util.py
>> @@ -41,22 +41,22 @@ from . import (
>> error,
>> i18n,
>> osutil,
>> parsers,
>> pycompat,
>> )
>>
>> for attr in (
>> - 'empty',
>> - 'queue',
>> - 'urlerr',
>> + u'empty',
>> + u'queue',
>> + u'urlerr',
>> # we do import urlreq, but we do it outside the loop
>> #'urlreq',
>> - 'stringio',
>> + u'stringio',
>> ):
>> globals()[attr] = getattr(pycompat, attr)
>>
>> # This line is to make pyflakes happy:
>> urlreq = pycompat.urlreq
>>
>> if os.name == 'nt':
>> from . import windows as platform
>> @@ -108,17 +108,17 @@ samefile = platform.samefile
>> samestat = platform.samestat
>> setbinary = platform.setbinary
>> setflags = platform.setflags
>> setsignalhandler = platform.setsignalhandler
>> shellquote = platform.shellquote
>> spawndetached = platform.spawndetached
>> split = platform.split
>> sshargs = platform.sshargs
>> -statfiles = getattr(osutil, 'statfiles', platform.statfiles)
>> +statfiles = getattr(osutil, u'statfiles', platform.statfiles)
>> statisexec = platform.statisexec
>> statislink = platform.statislink
>> termwidth = platform.termwidth
>> testpid = platform.testpid
>> umask = platform.umask
>> unlink = platform.unlink
>> unlinkpath = platform.unlinkpath
>> username = platform.username
>> @@ -525,17 +525,17 @@ class sortdict(dict):
>> dict.__setitem__(self, key, val)
>>
>> class _lrucachenode(object):
>> """A node in a doubly linked list.
>>
>> Holds a reference to nodes on either side as well as a key-value
>> pair for the dictionary entry.
>> """
>> - __slots__ = ('next', 'prev', 'key', 'value')
>> + __slots__ = (u'next', u'prev', u'key', u'value')
>>
>> def __init__(self):
>> self.next = None
>> self.prev = None
>>
>> self.key = _notset
>> self.value = None
>>
>> @@ -887,22 +887,22 @@ def pathto(root, n1, n2):
>> return os.sep.join((['..'] * len(a)) + b) or '.'
>>
>> def mainfrozen():
>> """return True if we are a frozen executable.
>>
>> The code supports py2exe (most common, Windows only) and tools/freeze
>> (portable, not much used).
>> """
>> - return (safehasattr(sys, "frozen") or # new py2exe
>> - safehasattr(sys, "importers") or # old py2exe
>> - imp.is_frozen("__main__")) # tools/freeze
>> + return (safehasattr(sys, u"frozen") or # new py2exe
>> + safehasattr(sys, u"importers") or # old py2exe
>> + imp.is_frozen(u"__main__")) # tools/freeze
>>
>> # the location of data files matching the source code
>> -if mainfrozen() and getattr(sys, 'frozen', None) != 'macosx_app':
>> +if mainfrozen() and getattr(sys, u'frozen', None) != u'macosx_app':
>> # executable version (py2exe) doesn't support __file__
>> datapath = os.path.dirname(sys.executable)
>> else:
>> datapath = os.path.dirname(__file__)
>>
>> i18n.setdatapath(datapath)
>>
>> _hgexecutable = None
>> @@ -2135,17 +2135,17 @@ def getport(port):
>>
>> def parsebool(s):
>> """Parse s into a boolean.
>>
>> If s is not a valid boolean, returns None.
>> """
>> return _booleans.get(s.lower(), None)
>>
>> -_hexdig = '0123456789ABCDEFabcdef'
>> +_hexdig = u'0123456789ABCDEFabcdef'
>> _hextochr = dict((a + b, chr(int(a + b, 16)))
>> for a in _hexdig for b in _hexdig)
>>
>> def _urlunquote(s):
>> """Decode HTTP/HTML % encoding.
>>
>> >>> _urlunquote('abc%20def')
>> 'abc def'
>> @@ -2628,17 +2628,17 @@ class dirs(object):
>> del dirs[base]
>>
>> def __iter__(self):
>> return self._dirs.iterkeys()
>>
>> def __contains__(self, d):
>> return d in self._dirs
>>
>> -if safehasattr(parsers, 'dirs'):
>> +if safehasattr(parsers, u'dirs'):
>> dirs = parsers.dirs
>>
>> def finddirs(path):
>> pos = path.rfind('/')
>> while pos != -1:
>> yield path[:pos]
>> pos = path.rfind('/', 0, pos)
>>
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at mercurial-scm.org
>> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20160516/ff3c454c/attachment.html>
More information about the Mercurial-devel
mailing list