##// END OF EJS Templates
match: add `filepath:` pattern to match an exact filepath relative to the root...
match: add `filepath:` pattern to match an exact filepath relative to the root It's useful in certain automated workflows to make sure we recurse in directories whose name conflicts with files in other revisions. In addition it makes it possible to avoid building a potentially costly regex, improving performance when the set of files to match explicitly is large. The benchmark below are run in the following configuration : # data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog # benchmark.name = files # benchmark.variants.rev = tip # benchmark.variants.files = all-list-filepath-sorted # bin-env-vars.hg.flavor = no-rust It also includes timings using the re2 engine (through the `google-re2` module) to show how much can be saved by just using a better regexp engine. Pattern time (seconds) time using re2 ----------------------------------------------------------- just "." 0.4 0.4 list of "filepath:…" 1.3 1.3 list of "path:…" 25.7 3.9 list of patterns 29.7 10.4 As you can see, Without re2, using "filepath:" instead of "path:" is a huge win. With re2, it is still about three times faster to not have to build the regex.

File last commit:

r49762:b677bccf default
r51588:1c31b343 default
Show More
charencode.py
86 lines | 2.2 KiB | text/x-python | PythonLexer
Yuya Nishihara
encoding: drop circular import by proxying through '<policy>.charencode'...
r33756 # charencode.py - miscellaneous character encoding
#
Raphaël Gomès
contributor: change mentions of mpm to olivia...
r47575 # Copyright 2005-2009 Olivia Mackall <olivia@selenic.com> and others
Yuya Nishihara
encoding: drop circular import by proxying through '<policy>.charencode'...
r33756 #
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925 import array
Augie Fackler
formatting: blacken the codebase...
r43346 from .. import pycompat
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925
Yuya Nishihara
encoding: add function to test if a str consists of ASCII characters...
r33927 def isasciistr(s):
try:
s.decode('ascii')
return True
except UnicodeDecodeError:
return False
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
encoding: drop circular import by proxying through '<policy>.charencode'...
r33756 def asciilower(s):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """convert a string to lowercase if ASCII
Yuya Nishihara
encoding: drop circular import by proxying through '<policy>.charencode'...
r33756
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 Raises UnicodeDecodeError if non-ASCII characters are found."""
Yuya Nishihara
encoding: drop circular import by proxying through '<policy>.charencode'...
r33756 s.decode('ascii')
return s.lower()
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
encoding: drop circular import by proxying through '<policy>.charencode'...
r33756 def asciiupper(s):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """convert a string to uppercase if ASCII
Yuya Nishihara
encoding: drop circular import by proxying through '<policy>.charencode'...
r33756
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 Raises UnicodeDecodeError if non-ASCII characters are found."""
Yuya Nishihara
encoding: drop circular import by proxying through '<policy>.charencode'...
r33756 s.decode('ascii')
return s.upper()
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925 _jsonmap = []
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _jsonmap.extend(b"\\u%04x" % x for x in range(32))
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925 _jsonmap.extend(pycompat.bytechr(x) for x in range(32, 127))
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _jsonmap.append(b'\\u007f')
_jsonmap[0x09] = b'\\t'
_jsonmap[0x0A] = b'\\n'
_jsonmap[0x22] = b'\\"'
_jsonmap[0x5C] = b'\\\\'
_jsonmap[0x08] = b'\\b'
_jsonmap[0x0C] = b'\\f'
_jsonmap[0x0D] = b'\\r'
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925 _paranoidjsonmap = _jsonmap[:]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _paranoidjsonmap[0x3C] = b'\\u003c' # '<' (e.g. escape "</script>")
_paranoidjsonmap[0x3E] = b'\\u003e' # '>'
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925 _jsonmap.extend(pycompat.bytechr(x) for x in range(128, 256))
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925 def jsonescapeu8fast(u8chars, paranoid):
"""Convert a UTF-8 byte string to JSON-escaped form (fast path)
Raises ValueError if non-ASCII characters have to be escaped.
"""
if paranoid:
jm = _paranoidjsonmap
else:
jm = _jsonmap
try:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return b''.join(jm[x] for x in bytearray(u8chars))
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925 except IndexError:
raise ValueError
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
charencode: remove Python 2 support code...
r49762 _utf8strict = r'surrogatepass'
Yuya Nishihara
py3: use 'surrogatepass' error handler to process U+DCxx transparently...
r34215
Augie Fackler
formatting: blacken the codebase...
r43346
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925 def jsonescapeu8fallback(u8chars, paranoid):
"""Convert a UTF-8 byte string to JSON-escaped form (slow path)
Escapes all non-ASCII characters no matter if paranoid is False.
"""
if paranoid:
jm = _paranoidjsonmap
else:
jm = _jsonmap
# non-BMP char is represented as UTF-16 surrogate pair
Yuya Nishihara
py3: use 'surrogatepass' error handler to process U+DCxx transparently...
r34215 u16b = u8chars.decode('utf-8', _utf8strict).encode('utf-16', _utf8strict)
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 u16codes = array.array('H', u16b)
Yuya Nishihara
encoding: extract stub for fast JSON escape...
r33925 u16codes.pop(0) # drop BOM
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return b''.join(jm[x] if x < 128 else b'\\u%04x' % x for x in u16codes)