diff --git a/mercurial/utils/stringutil.py b/mercurial/utils/stringutil.py --- a/mercurial/utils/stringutil.py +++ b/mercurial/utils/stringutil.py @@ -27,7 +27,8 @@ # regex special chars pulled from https://bugs.python.org/issue29995 # which was part of Python 3.7. _respecial = pycompat.bytestr(b'()[]{}?*+-|^$\\.&~# \t\n\r\v\f') -_regexescapemap = {ord(i): (b'\\' + i).decode('latin1') for i in _respecial} +_regexescapemapb = {i: (b'\\' + i) for i in _respecial} +_regexescapemapu = {ord(i): (b'\\' + i).decode('latin1') for i in _respecial} def reescape(pat): """Drop-in replacement for re.escape.""" @@ -36,9 +37,13 @@ # unicode.translate, not bytes.translate. Sigh. wantuni = True if isinstance(pat, bytes): + if len(pat) == 1: + # fast path for hgignore parsing, which calls this on one + # char at a time + return _regexescapemapb.get(pat, pat) wantuni = False pat = pat.decode('latin1') - pat = pat.translate(_regexescapemap) + pat = pat.translate(_regexescapemapu) if wantuni: return pat return pat.encode('latin1')