changeset 38475:67dc32d4e790

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
author Augie Fackler <augie@google.com>
date Tue, 26 Jun 2018 10:36:23 -0400
parents 96f65bdf0bf4
children b4cfd803b3f2
files hgext/keyword.py hgext/lfs/pointer.py mercurial/hgweb/webutil.py mercurial/match.py mercurial/sshpeer.py mercurial/sslutil.py tests/test-walk.t
diffstat 7 files changed, 44 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- 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 ..