Patchwork [5,of,7] match: pass in normalize() function to matchers

login
register
mail settings
Submitter via Mercurial-devel
Date May 22, 2017, 6:16 a.m.
Message ID <5d46130266daa706a08f.1495433765@martinvonz.svl.corp.google.com>
Download mbox | patch
Permalink /patch/20820/
State Accepted
Headers show

Comments

via Mercurial-devel - May 22, 2017, 6:16 a.m.
# HG changeset patch
# User Martin von Zweigbergk <martinvonz@google.com>
# Date 1495147550 25200
#      Thu May 18 15:45:50 2017 -0700
# Node ID 5d46130266daa706a08f1457827fb21f9233a659
# Parent  fcf2e822e20b4c25e4525057a0fdf8221e48b0ec
match: pass in normalize() function to matchers

This will let us delete icasefsmatcher.

Patch

diff --git a/mercurial/match.py b/mercurial/match.py
--- a/mercurial/match.py
+++ b/mercurial/match.py
@@ -116,9 +116,10 @@ 
                           the same directory
     '<something>' - a pattern of the specified default type
     """
-    return matcher(root, cwd, patterns, include=include, exclude=exclude,
-                   default=default, exact=exact, auditor=auditor, ctx=ctx,
-                   listsubrepos=listsubrepos, warn=warn, badfn=badfn)
+    return matcher(root, cwd, _donormalize, patterns, include=include,
+                   exclude=exclude, default=default, exact=exact,
+                   auditor=auditor, ctx=ctx, listsubrepos=listsubrepos,
+                   warn=warn, badfn=badfn)
 
 def icasefsmatch(root, cwd, patterns, include=None, exclude=None,
                  default='glob', auditor=None, ctx=None,
@@ -126,9 +127,28 @@ 
     """A matcher for wdir on case insensitive filesystems, which normalizes the
     given patterns to the case in the filesystem.
     """
-    return icasefsmatcher(root, cwd, patterns, include=include, exclude=exclude,
-                          default=default, auditor=auditor, ctx=ctx,
-                          listsubrepos=listsubrepos, badfn=badfn)
+    dirstate = ctx.repo().dirstate
+    dsnormalize = dirstate.normalize
+
+    def normalize(patterns, default, root, cwd, auditor, warn):
+        kp = _donormalize(patterns, default, root, cwd, auditor, warn)
+        kindpats = []
+        for kind, pats, source in kp:
+            if kind not in ('re', 'relre'):  # regex can't be normalized
+                p = pats
+                pats = dsnormalize(pats)
+
+                # Preserve the original to handle a case only rename.
+                if p != pats and p in dirstate:
+                    kindpats.append((kind, p, source))
+
+            kindpats.append((kind, pats, source))
+        return kindpats
+
+    return icasefsmatcher(root, cwd, normalize, patterns=patterns,
+                          include=include, exclude=exclude, default=default,
+                          auditor=auditor, ctx=ctx, listsubrepos=listsubrepos,
+                          badfn=badfn)
 
 def exact(root, cwd, files, badfn=None):
     return match(root, cwd, files, exact=True, badfn=badfn)
@@ -187,9 +207,9 @@ 
 
 class matcher(object):
 
-    def __init__(self, root, cwd, patterns, include=None, exclude=None,
-                 default='glob', exact=False, auditor=None, ctx=None,
-                 listsubrepos=False, warn=None, badfn=None):
+    def __init__(self, root, cwd, normalize, patterns, include=None,
+                 exclude=None, default='glob', exact=False, auditor=None,
+                 ctx=None, listsubrepos=False, warn=None, badfn=None):
         if include is None:
             include = []
         if exclude is None:
@@ -213,8 +233,7 @@ 
 
         matchfns = []
         if include:
-            kindpats = self._normalize(include, 'glob', root, cwd, auditor,
-                                       warn)
+            kindpats = normalize(include, 'glob', root, cwd, auditor, warn)
             self.includepat, im = _buildmatch(ctx, kindpats, '(?:/|$)',
                                               listsubrepos, root)
             roots, dirs = _rootsanddirs(kindpats)
@@ -222,8 +241,7 @@ 
             self._includedirs.update(dirs)
             matchfns.append(im)
         if exclude:
-            kindpats = self._normalize(exclude, 'glob', root, cwd, auditor,
-                                       warn)
+            kindpats = normalize(exclude, 'glob', root, cwd, auditor, warn)
             self.excludepat, em = _buildmatch(ctx, kindpats, '(?:/|$)',
                                               listsubrepos, root)
             if not _anypats(kindpats):
@@ -241,8 +259,7 @@ 
                 self._files = list(patterns)
             matchfns.append(self.exact)
         elif patterns:
-            kindpats = self._normalize(patterns, default, root, cwd, auditor,
-                                       warn)
+            kindpats = normalize(patterns, default, root, cwd, auditor, warn)
             if not _kindpatsalwaysmatch(kindpats):
                 self._files = _explicitfiles(kindpats)
                 self._anypats = self._anypats or _anypats(kindpats)
@@ -365,9 +382,6 @@ 
     def prefix(self):
         return not self.always() and not self.isexact() and not self.anypats()
 
-    def _normalize(self, patterns, default, root, cwd, auditor, warn):
-        return _donormalize(patterns, default, root, cwd, auditor, warn)
-
 class subdirmatcher(matcher):
     """Adapt a matcher to work on a subdirectory only.
 
@@ -441,30 +455,13 @@ 
 
 class icasefsmatcher(matcher):
 
-    def __init__(self, root, cwd, patterns, include, exclude, default, auditor,
-                 ctx, listsubrepos=False, badfn=None):
+    def __init__(self, root, cwd, normalize, patterns, include, exclude,
+                 default, auditor, ctx, listsubrepos=False, badfn=None):
         init = super(icasefsmatcher, self).__init__
-        self._dirstate = ctx.repo().dirstate
-        self._dsnormalize = self._dirstate.normalize
-
-        init(root, cwd, patterns, include, exclude, default, auditor=auditor,
-             ctx=ctx, listsubrepos=listsubrepos, badfn=badfn)
 
-    def _normalize(self, patterns, default, root, cwd, auditor, warn):
-        kp = super(icasefsmatcher, self)._normalize(patterns, default, root,
-                                                    cwd, auditor, warn)
-        kindpats = []
-        for kind, pats, source in kp:
-            if kind not in ('re', 'relre'):  # regex can't be normalized
-                p = pats
-                pats = self._dsnormalize(pats)
-
-                # Preserve the original to handle a case only rename.
-                if p != pats and p in self._dirstate:
-                    kindpats.append((kind, p, source))
-
-            kindpats.append((kind, pats, source))
-        return kindpats
+        init(root, cwd, normalize=normalize, patterns=patterns, include=include,
+             exclude=exclude, default=default, auditor=auditor,
+             ctx=ctx, listsubrepos=listsubrepos, badfn=badfn)
 
 def patkind(pattern, default=None):
     '''If pattern is 'kind:pat' with a known kind, return kind.'''