cleanup: migrate from re.escape to stringutil.reescape
This has consistent behavior on Python 2.7, 3.6, and 3.7 and has the
benefit of probably being a little faster. Test output changes are
largely because / used to be pointlessly escaped.
Differential Revision: https://phab.mercurial-scm.org/D3842
--- a/hgext/keyword.py Tue Jun 26 10:33:52 2018 -0400
+++ b/hgext/keyword.py Tue Jun 26 10:36:23 2018 -0400
@@ -245,7 +245,7 @@
@util.propertycache
def escape(self):
'''Returns bar-separated and escaped keywords.'''
- return '|'.join(map(re.escape, self.templates.keys()))
+ return '|'.join(map(stringutil.reescape, self.templates.keys()))
@util.propertycache
def rekw(self):
--- a/hgext/lfs/pointer.py Tue Jun 26 10:33:52 2018 -0400
+++ b/hgext/lfs/pointer.py Tue Jun 26 10:36:23 2018 -0400
@@ -56,7 +56,7 @@
_requiredre = {
'size': re.compile(br'\A[0-9]+\Z'),
'oid': re.compile(br'\Asha256:[0-9a-f]{64}\Z'),
- 'version': re.compile(br'\A%s\Z' % re.escape(VERSION)),
+ 'version': re.compile(br'\A%s\Z' % stringutil.reescape(VERSION)),
}
def validate(self):
--- a/mercurial/hgweb/webutil.py Tue Jun 26 10:33:52 2018 -0400
+++ b/mercurial/hgweb/webutil.py Tue Jun 26 10:36:23 2018 -0400
@@ -766,7 +766,7 @@
for key, pattern in websubdefs:
# grab the delimiter from the character after the "s"
unesc = pattern[1:2]
- delim = re.escape(unesc)
+ delim = stringutil.reescape(unesc)
# identify portions of the pattern, taking care to avoid escaped
# delimiters. the replace format and flags are optional, but
--- a/mercurial/match.py Tue Jun 26 10:33:52 2018 -0400
+++ b/mercurial/match.py Tue Jun 26 10:36:23 2018 -0400
@@ -714,7 +714,7 @@
>>> bprint(_globre(br'**/a'))
(?:.*/)?a
>>> bprint(_globre(br'a/**/b'))
- a\/(?:.*/)?b
+ a/(?:.*/)?b
>>> bprint(_globre(br'[a*?!^][^b][!c]'))
[a*?!^][\^b][^c]
>>> bprint(_globre(br'{a,b}'))
@@ -725,7 +725,7 @@
i, n = 0, len(pat)
res = ''
group = 0
- escape = util.re.escape
+ escape = util.stringutil.reescape
def peek():
return i < n and pat[i:i + 1]
while i < n:
@@ -790,13 +790,13 @@
if kind in ('path', 'relpath'):
if pat == '.':
return ''
- return util.re.escape(pat) + '(?:/|$)'
+ return util.stringutil.reescape(pat) + '(?:/|$)'
if kind == 'rootfilesin':
if pat == '.':
escaped = ''
else:
# Pattern is a directory name.
- escaped = util.re.escape(pat) + '/'
+ escaped = util.stringutil.reescape(pat) + '/'
# Anything after the pattern must be a non-directory.
return escaped + '[^/]+$'
if kind == 'relglob':
--- a/mercurial/sshpeer.py Tue Jun 26 10:33:52 2018 -0400
+++ b/mercurial/sshpeer.py Tue Jun 26 10:36:23 2018 -0400
@@ -22,6 +22,7 @@
)
from .utils import (
procutil,
+ stringutil,
)
def _serverquote(s):
@@ -273,7 +274,7 @@
# Assume version 1 of wire protocol by default.
protoname = wireprototypes.SSHV1
- reupgraded = re.compile(b'^upgraded %s (.*)$' % re.escape(token))
+ reupgraded = re.compile(b'^upgraded %s (.*)$' % stringutil.reescape(token))
lines = ['', 'dummy']
max_noise = 500
--- a/mercurial/sslutil.py Tue Jun 26 10:33:52 2018 -0400
+++ b/mercurial/sslutil.py Tue Jun 26 10:36:23 2018 -0400
@@ -618,14 +618,14 @@
# The client SHOULD NOT attempt to match a presented identifier
# where the wildcard character is embedded within an A-label or
# U-label of an internationalized domain name.
- pats.append(re.escape(leftmost))
+ pats.append(stringutil.reescape(leftmost))
else:
# Otherwise, '*' matches any dotless string, e.g. www*
- pats.append(re.escape(leftmost).replace(br'\*', '[^.]*'))
+ pats.append(stringutil.reescape(leftmost).replace(br'\*', '[^.]*'))
# add the remaining fragments, ignore any wildcards
for frag in remainder:
- pats.append(re.escape(frag))
+ pats.append(stringutil.reescape(frag))
pat = re.compile(br'\A' + br'\.'.join(pats) + br'\Z', re.IGNORECASE)
return pat.match(hostname) is not None
--- a/tests/test-walk.t Tue Jun 26 10:33:52 2018 -0400
+++ b/tests/test-walk.t Tue Jun 26 10:36:23 2018 -0400
@@ -92,11 +92,11 @@
f mammals/skunk skunk
$ hg debugwalk -v -I '*k'
* matcher:
- <includematcher includes='(?:mammals\\/[^/]*k(?:/|$))'>
+ <includematcher includes='(?:mammals/[^/]*k(?:/|$))'>
f mammals/skunk skunk
$ hg debugwalk -v -I 'glob:*k'
* matcher:
- <includematcher includes='(?:mammals\\/[^/]*k(?:/|$))'>
+ <includematcher includes='(?:mammals/[^/]*k(?:/|$))'>
f mammals/skunk skunk
$ hg debugwalk -v -I 'relglob:*k'
* matcher:
@@ -260,7 +260,7 @@
f mammals/skunk skunk
$ hg debugwalk -v Procyonidae
* matcher:
- <patternmatcher patterns='(?:mammals\\/Procyonidae(?:/|$))'>
+ <patternmatcher patterns='(?:mammals/Procyonidae(?:/|$))'>
f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
f mammals/Procyonidae/raccoon Procyonidae/raccoon
@@ -268,7 +268,7 @@
$ cd Procyonidae
$ hg debugwalk -v .
* matcher:
- <patternmatcher patterns='(?:mammals\\/Procyonidae(?:/|$))'>
+ <patternmatcher patterns='(?:mammals/Procyonidae(?:/|$))'>
f mammals/Procyonidae/cacomistle cacomistle
f mammals/Procyonidae/coatimundi coatimundi
f mammals/Procyonidae/raccoon raccoon
@@ -316,7 +316,7 @@
f beans/turtle beans/turtle
$ hg debugwalk -v -I '{*,{b,m}*/*}k'
* matcher:
- <includematcher includes='(?:(?:[^/]*|(?:b|m)[^/]*\\/[^/]*)k(?:/|$))'>
+ <includematcher includes='(?:(?:[^/]*|(?:b|m)[^/]*/[^/]*)k(?:/|$))'>
f beans/black beans/black
f fenugreek fenugreek
f mammals/skunk mammals/skunk
@@ -330,25 +330,25 @@
<includematcher includes='(?:non\\-existent(?:/|$))'>
$ hg debugwalk -v -Inon-existent -Ibeans/black
* matcher:
- <includematcher includes='(?:non\\-existent(?:/|$)|beans\\/black(?:/|$))'>
+ <includematcher includes='(?:non\\-existent(?:/|$)|beans/black(?:/|$))'>
f beans/black beans/black
$ hg debugwalk -v -Ibeans beans/black
* matcher:
<intersectionmatcher
- m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))'>,
+ m1=<patternmatcher patterns='(?:beans/black(?:/|$))'>,
m2=<includematcher includes='(?:beans(?:/|$))'>>
f beans/black beans/black exact
$ hg debugwalk -v -Ibeans/black beans
* matcher:
<intersectionmatcher
m1=<patternmatcher patterns='(?:beans(?:/|$))'>,
- m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
+ m2=<includematcher includes='(?:beans/black(?:/|$))'>>
f beans/black beans/black
$ hg debugwalk -v -Xbeans/black beans
* matcher:
<differencematcher
m1=<patternmatcher patterns='(?:beans(?:/|$))'>,
- m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
+ m2=<includematcher includes='(?:beans/black(?:/|$))'>>
f beans/borlotti beans/borlotti
f beans/kidney beans/kidney
f beans/navy beans/navy
@@ -358,7 +358,7 @@
* matcher:
<differencematcher
m1=<includematcher includes='(?:beans(?:/|$))'>,
- m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
+ m2=<includematcher includes='(?:beans/black(?:/|$))'>>
f beans/borlotti beans/borlotti
f beans/kidney beans/kidney
f beans/navy beans/navy
@@ -367,33 +367,33 @@
$ hg debugwalk -v -Xbeans/black beans/black
* matcher:
<differencematcher
- m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))'>,
- m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
+ m1=<patternmatcher patterns='(?:beans/black(?:/|$))'>,
+ m2=<includematcher includes='(?:beans/black(?:/|$))'>>
$ hg debugwalk -v -Xbeans/black -Ibeans/black
* matcher:
<differencematcher
- m1=<includematcher includes='(?:beans\\/black(?:/|$))'>,
- m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
+ m1=<includematcher includes='(?:beans/black(?:/|$))'>,
+ m2=<includematcher includes='(?:beans/black(?:/|$))'>>
$ hg debugwalk -v -Xbeans beans/black
* matcher:
<differencematcher
- m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))'>,
+ m1=<patternmatcher patterns='(?:beans/black(?:/|$))'>,
m2=<includematcher includes='(?:beans(?:/|$))'>>
$ hg debugwalk -v -Xbeans -Ibeans/black
* matcher:
<differencematcher
- m1=<includematcher includes='(?:beans\\/black(?:/|$))'>,
+ m1=<includematcher includes='(?:beans/black(?:/|$))'>,
m2=<includematcher includes='(?:beans(?:/|$))'>>
$ hg debugwalk -v 'glob:mammals/../beans/b*'
* matcher:
- <patternmatcher patterns='(?:beans\\/b[^/]*$)'>
+ <patternmatcher patterns='(?:beans/b[^/]*$)'>
f beans/black beans/black
f beans/borlotti beans/borlotti
$ hg debugwalk -v '-X*/Procyonidae' mammals
* matcher:
<differencematcher
m1=<patternmatcher patterns='(?:mammals(?:/|$))'>,
- m2=<includematcher includes='(?:[^/]*\\/Procyonidae(?:/|$))'>>
+ m2=<includematcher includes='(?:[^/]*/Procyonidae(?:/|$))'>>
f mammals/skunk mammals/skunk
$ hg debugwalk -v path:mammals
* matcher:
@@ -436,12 +436,12 @@
$ hg debugwalk -v beans/black -X 'path:beans'
* matcher:
<differencematcher
- m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))'>,
+ m1=<patternmatcher patterns='(?:beans/black(?:/|$))'>,
m2=<includematcher includes='(?:beans(?:/|$))'>>
$ hg debugwalk -v -I 'path:beans/black' -X 'path:beans'
* matcher:
<differencematcher
- m1=<includematcher includes='(?:beans\\/black(?:/|$))'>,
+ m1=<includematcher includes='(?:beans/black(?:/|$))'>,
m2=<includematcher includes='(?:beans(?:/|$))'>>
Test absolute paths:
@@ -485,11 +485,11 @@
glob: $ENOENT$
$ hg debugwalk -v glob:glob:glob
* matcher:
- <patternmatcher patterns='(?:glob\\:glob$)'>
+ <patternmatcher patterns='(?:glob:glob$)'>
f glob:glob glob:glob exact
$ hg debugwalk -v path:glob:glob
* matcher:
- <patternmatcher patterns='(?:glob\\:glob(?:/|$))'>
+ <patternmatcher patterns='(?:glob:glob(?:/|$))'>
f glob:glob glob:glob exact
$ rm glob:glob
$ hg addremove
@@ -511,11 +511,11 @@
$ hg debugwalk -v path:beans/black
* matcher:
- <patternmatcher patterns='(?:beans\\/black(?:/|$))'>
+ <patternmatcher patterns='(?:beans/black(?:/|$))'>
f beans/black beans/black exact
$ hg debugwalk -v path:beans//black
* matcher:
- <patternmatcher patterns='(?:beans\\/black(?:/|$))'>
+ <patternmatcher patterns='(?:beans/black(?:/|$))'>
f beans/black beans/black exact
$ hg debugwalk -v relglob:Procyonidae
@@ -523,20 +523,20 @@
<patternmatcher patterns='(?:(?:|.*/)Procyonidae$)'>
$ hg debugwalk -v 'relglob:Procyonidae/**'
* matcher:
- <patternmatcher patterns='(?:(?:|.*/)Procyonidae\\/.*$)'>
+ <patternmatcher patterns='(?:(?:|.*/)Procyonidae/.*$)'>
f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
$ hg debugwalk -v 'relglob:Procyonidae/**' fennel
* matcher:
- <patternmatcher patterns='(?:(?:|.*/)Procyonidae\\/.*$|fennel(?:/|$))'>
+ <patternmatcher patterns='(?:(?:|.*/)Procyonidae/.*$|fennel(?:/|$))'>
f fennel fennel exact
f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
$ hg debugwalk -v beans 'glob:beans/*'
* matcher:
- <patternmatcher patterns='(?:beans(?:/|$)|beans\\/[^/]*$)'>
+ <patternmatcher patterns='(?:beans(?:/|$)|beans/[^/]*$)'>
f beans/black beans/black
f beans/borlotti beans/borlotti
f beans/kidney beans/kidney
@@ -598,7 +598,7 @@
<patternmatcher patterns='(?:ignored(?:/|$))'>
$ hg debugwalk -v ignored/file
* matcher:
- <patternmatcher patterns='(?:ignored\\/file(?:/|$))'>
+ <patternmatcher patterns='(?:ignored/file(?:/|$))'>
f ignored/file ignored/file exact
Test listfile and listfile0
@@ -612,7 +612,7 @@
$ $PYTHON -c "open('listfile', 'wb').write(b'fenugreek\nnew\r\nmammals/skunk\n')"
$ hg debugwalk -v -I 'listfile:listfile'
* matcher:
- <includematcher includes='(?:fenugreek(?:/|$)|new(?:/|$)|mammals\\/skunk(?:/|$))'>
+ <includematcher includes='(?:fenugreek(?:/|$)|new(?:/|$)|mammals/skunk(?:/|$))'>
f fenugreek fenugreek
f mammals/skunk mammals/skunk
f new new
@@ -620,17 +620,17 @@
$ cd ..
$ hg debugwalk -v -R t t/mammals/skunk
* matcher:
- <patternmatcher patterns='(?:mammals\\/skunk(?:/|$))'>
+ <patternmatcher patterns='(?:mammals/skunk(?:/|$))'>
f mammals/skunk t/mammals/skunk exact
$ mkdir t2
$ cd t2
$ hg debugwalk -v -R ../t ../t/mammals/skunk
* matcher:
- <patternmatcher patterns='(?:mammals\\/skunk(?:/|$))'>
+ <patternmatcher patterns='(?:mammals/skunk(?:/|$))'>
f mammals/skunk ../t/mammals/skunk exact
$ hg debugwalk -v --cwd ../t mammals/skunk
* matcher:
- <patternmatcher patterns='(?:mammals\\/skunk(?:/|$))'>
+ <patternmatcher patterns='(?:mammals/skunk(?:/|$))'>
f mammals/skunk mammals/skunk exact
$ cd ..