changeset 32502:3026f19b4b01

match: remove support for non-include patterns from includematcher The includematcher will always get at least one include pattern and will never get any non-include patterns, so we can remove most of the code in it. This patch does mostly straight-forward deletions of code. We will clean up further later.
author Martin von Zweigbergk <martinvonz@google.com>
date Fri, 19 May 2017 13:36:34 -0700
parents 7095dbc266e3
children 361808a2b0b8
files mercurial/match.py tests/test-hgignore.t tests/test-walk.t
diffstat 3 files changed, 66 insertions(+), 121 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/match.py	Fri May 19 22:36:14 2017 -0700
+++ b/mercurial/match.py	Fri May 19 13:36:34 2017 -0700
@@ -149,14 +149,14 @@
                            default=default, auditor=auditor, ctx=ctx,
                            listsubrepos=listsubrepos, warn=warn, badfn=badfn)
     if include:
-        im = includematcher(root, cwd, normalize, [], include=include,
-                            default=default, auditor=auditor, ctx=ctx,
-                            listsubrepos=listsubrepos, warn=warn, badfn=None)
+        im = includematcher(root, cwd, normalize, include, auditor=auditor,
+                            ctx=ctx, listsubrepos=listsubrepos, warn=warn,
+                            badfn=None)
         m = intersectmatchers(m, im)
     if exclude:
-        em = includematcher(root, cwd, normalize, [], include=exclude,
-                            default=default, auditor=auditor, ctx=ctx,
-                            listsubrepos=listsubrepos, warn=warn, badfn=None)
+        em = includematcher(root, cwd, normalize, exclude, auditor=auditor,
+                            ctx=ctx, listsubrepos=listsubrepos, warn=warn,
+                            badfn=None)
         m = differencematcher(m, em)
     return m
 
@@ -403,93 +403,38 @@
 
 class includematcher(basematcher):
 
-    def __init__(self, root, cwd, normalize, patterns, include=None,
-                 default='glob', auditor=None, ctx=None,
+    def __init__(self, root, cwd, normalize, include, auditor=None, ctx=None,
                  listsubrepos=False, warn=None, badfn=None):
-        super(includematcher, self).__init__(root, cwd, badfn,
-                                             relativeuipath=bool(include or
-                                                                 patterns))
-        if include is None:
-            include = []
-
-        self._anypats = bool(include)
-        self._anyincludepats = False
-        self._always = False
-        self.patternspat = None
-        self.includepat = None
-
-        # roots are directories which are recursively included.
-        self._includeroots = set()
-        # dirs are directories which are non-recursively included.
-        self._includedirs = set()
+        super(includematcher, self).__init__(root, cwd, badfn)
 
-        matchfns = []
-        if include:
-            kindpats = normalize(include, 'glob', root, cwd, auditor, warn)
-            self.includepat, im = _buildmatch(ctx, kindpats, '(?:/|$)',
-                                              listsubrepos, root)
-            self._anyincludepats = _anypats(kindpats)
-            roots, dirs = _rootsanddirs(kindpats)
-            self._includeroots.update(roots)
-            self._includedirs.update(dirs)
-            matchfns.append(im)
-        if patterns:
-            kindpats = normalize(patterns, default, root, cwd, auditor, warn)
-            if not _kindpatsalwaysmatch(kindpats):
-                self._files = _explicitfiles(kindpats)
-                self._anypats = self._anypats or _anypats(kindpats)
-                self.patternspat, pm = _buildmatch(ctx, kindpats, '$',
-                                                   listsubrepos, root)
-                matchfns.append(pm)
-
-        if not matchfns:
-            m = util.always
-            self._always = True
-        elif len(matchfns) == 1:
-            m = matchfns[0]
-        else:
-            def m(f):
-                for matchfn in matchfns:
-                    if not matchfn(f):
-                        return False
-                return True
-
-        self.matchfn = m
-
-    @propertycache
-    def _dirs(self):
-        return set(util.dirs(self._fileset)) | {'.'}
+        kindpats = normalize(include, 'glob', root, cwd, auditor, warn)
+        self.includepat, im = _buildmatch(ctx, kindpats, '(?:/|$)',
+                                          listsubrepos, root)
+        self._anyincludepats = _anypats(kindpats)
+        roots, dirs = _rootsanddirs(kindpats)
+        # roots are directories which are recursively included.
+        self._includeroots = set(roots)
+        # dirs are directories which are non-recursively included.
+        self._includedirs = set(dirs)
+        self.matchfn = im
 
     def visitdir(self, dir):
-        if self.prefix() and dir in self._fileset:
+        if not self._anyincludepats and dir in self._includeroots:
+            # The condition above is essentially self.prefix() for includes
             return 'all'
-        if self._includeroots or self._includedirs:
-            if (not self._anyincludepats and
-                dir in self._includeroots):
-                # The condition above is essentially self.prefix() for includes
-                return 'all'
-            if ('.' not in self._includeroots and
-                dir not in self._includeroots and
-                dir not in self._includedirs and
-                not any(parent in self._includeroots
-                        for parent in util.finddirs(dir))):
-                return False
-        return (not self._fileset or
-                '.' in self._fileset or
-                dir in self._fileset or
-                dir in self._dirs or
-                any(parentdir in self._fileset
-                    for parentdir in util.finddirs(dir)))
+        if ('.' not in self._includeroots and
+            dir not in self._includeroots and
+            dir not in self._includedirs and
+            not any(parent in self._includeroots
+                    for parent in util.finddirs(dir))):
+            return False
+        return True
 
     def anypats(self):
-        return self._anypats
-
-    def always(self):
-        return self._always
+        return True
 
     def __repr__(self):
-        return ('<includematcher patterns=%r, includes=%r>' %
-                (self.patternspat, self.includepat))
+        return ('<includematcher includes=%r>' % self.includepat)
 
 class exactmatcher(basematcher):
     '''Matches the input files exactly. They are interpreted as paths, not
--- a/tests/test-hgignore.t	Fri May 19 22:36:14 2017 -0700
+++ b/tests/test-hgignore.t	Fri May 19 13:36:34 2017 -0700
@@ -164,7 +164,7 @@
   A b.o
 
   $ hg debugignore
-  <includematcher patterns=None, includes='(?:(?:|.*/)[^/]*(?:/|$))'>
+  <includematcher includes='(?:(?:|.*/)[^/]*(?:/|$))'>
 
   $ hg debugignore b.o
   b.o is ignored
--- a/tests/test-walk.t	Fri May 19 22:36:14 2017 -0700
+++ b/tests/test-walk.t	Fri May 19 13:36:34 2017 -0700
@@ -44,7 +44,7 @@
   f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
   f  mammals/skunk                   mammals/skunk
   $ hg debugwalk -I.
-  matcher: <includematcher patterns=None, includes='(?:)'>
+  matcher: <includematcher includes='(?:)'>
   f  beans/black                     beans/black
   f  beans/borlotti                  beans/borlotti
   f  beans/kidney                    beans/kidney
@@ -76,7 +76,7 @@
   f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
   f  mammals/skunk                   skunk
   $ hg debugwalk -X ../beans
-  matcher: <differencematcher m1=<patternmatcher patterns=None, includes=None>, m2=<includematcher patterns=None, includes='(?:beans(?:/|$))'>>
+  matcher: <differencematcher m1=<patternmatcher patterns=None, includes=None>, m2=<includematcher includes='(?:beans(?:/|$))'>>
   f  fennel                          ../fennel
   f  fenugreek                       ../fenugreek
   f  fiddlehead                      ../fiddlehead
@@ -85,31 +85,31 @@
   f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
   f  mammals/skunk                   skunk
   $ hg debugwalk -I '*k'
-  matcher: <includematcher patterns=None, includes='(?:mammals\\/[^/]*k(?:/|$))'>
+  matcher: <includematcher includes='(?:mammals\\/[^/]*k(?:/|$))'>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'glob:*k'
-  matcher: <includematcher patterns=None, includes='(?:mammals\\/[^/]*k(?:/|$))'>
+  matcher: <includematcher includes='(?:mammals\\/[^/]*k(?:/|$))'>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'relglob:*k'
-  matcher: <includematcher patterns=None, includes='(?:(?:|.*/)[^/]*k(?:/|$))'>
+  matcher: <includematcher includes='(?:(?:|.*/)[^/]*k(?:/|$))'>
   f  beans/black    ../beans/black
   f  fenugreek      ../fenugreek
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'relglob:*k' .
-  matcher: <intersectionmatcher m1=<patternmatcher patterns='(?:mammals(?:/|$))', includes=None>, m2=<includematcher patterns=None, includes='(?:(?:|.*/)[^/]*k(?:/|$))'>>
+  matcher: <intersectionmatcher m1=<patternmatcher patterns='(?:mammals(?:/|$))', includes=None>, m2=<includematcher includes='(?:(?:|.*/)[^/]*k(?:/|$))'>>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 're:.*k$'
-  matcher: <includematcher patterns=None, includes='(?:.*k$)'>
+  matcher: <includematcher includes='(?:.*k$)'>
   f  beans/black    ../beans/black
   f  fenugreek      ../fenugreek
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'relre:.*k$'
-  matcher: <includematcher patterns=None, includes='(?:.*.*k$)'>
+  matcher: <includematcher includes='(?:.*.*k$)'>
   f  beans/black    ../beans/black
   f  fenugreek      ../fenugreek
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'path:beans'
-  matcher: <includematcher patterns=None, includes='(?:^beans(?:/|$))'>
+  matcher: <includematcher includes='(?:^beans(?:/|$))'>
   f  beans/black     ../beans/black
   f  beans/borlotti  ../beans/borlotti
   f  beans/kidney    ../beans/kidney
@@ -117,7 +117,7 @@
   f  beans/pinto     ../beans/pinto
   f  beans/turtle    ../beans/turtle
   $ hg debugwalk -I 'relpath:detour/../../beans'
-  matcher: <includematcher patterns=None, includes='(?:beans(?:/|$))'>
+  matcher: <includematcher includes='(?:beans(?:/|$))'>
   f  beans/black     ../beans/black
   f  beans/borlotti  ../beans/borlotti
   f  beans/kidney    ../beans/kidney
@@ -131,7 +131,7 @@
   f  fenugreek   ../fenugreek
   f  fiddlehead  ../fiddlehead
   $ hg debugwalk -I 'rootfilesin:'
-  matcher: <includematcher patterns=None, includes='(?:^[^/]+$)'>
+  matcher: <includematcher includes='(?:^[^/]+$)'>
   f  fennel      ../fennel
   f  fenugreek   ../fenugreek
   f  fiddlehead  ../fiddlehead
@@ -141,12 +141,12 @@
   f  fenugreek   ../fenugreek
   f  fiddlehead  ../fiddlehead
   $ hg debugwalk -I 'rootfilesin:.'
-  matcher: <includematcher patterns=None, includes='(?:^[^/]+$)'>
+  matcher: <includematcher includes='(?:^[^/]+$)'>
   f  fennel      ../fennel
   f  fenugreek   ../fenugreek
   f  fiddlehead  ../fiddlehead
   $ hg debugwalk -X 'rootfilesin:'
-  matcher: <differencematcher m1=<patternmatcher patterns=None, includes=None>, m2=<includematcher patterns=None, includes='(?:^[^/]+$)'>>
+  matcher: <differencematcher m1=<patternmatcher patterns=None, includes=None>, m2=<includematcher includes='(?:^[^/]+$)'>>
   f  beans/black                     ../beans/black
   f  beans/borlotti                  ../beans/borlotti
   f  beans/kidney                    ../beans/kidney
@@ -160,11 +160,11 @@
   $ hg debugwalk 'rootfilesin:fennel'
   matcher: <patternmatcher patterns='(?:^fennel/[^/]+$)', includes=None>
   $ hg debugwalk -I 'rootfilesin:fennel'
-  matcher: <includematcher patterns=None, includes='(?:^fennel/[^/]+$)'>
+  matcher: <includematcher includes='(?:^fennel/[^/]+$)'>
   $ hg debugwalk 'rootfilesin:skunk'
   matcher: <patternmatcher patterns='(?:^skunk/[^/]+$)', includes=None>
   $ hg debugwalk -I 'rootfilesin:skunk'
-  matcher: <includematcher patterns=None, includes='(?:^skunk/[^/]+$)'>
+  matcher: <includematcher includes='(?:^skunk/[^/]+$)'>
   $ hg debugwalk 'rootfilesin:beans'
   matcher: <patternmatcher patterns='(?:^beans/[^/]+$)', includes=None>
   f  beans/black     ../beans/black
@@ -174,7 +174,7 @@
   f  beans/pinto     ../beans/pinto
   f  beans/turtle    ../beans/turtle
   $ hg debugwalk -I 'rootfilesin:beans'
-  matcher: <includematcher patterns=None, includes='(?:^beans/[^/]+$)'>
+  matcher: <includematcher includes='(?:^beans/[^/]+$)'>
   f  beans/black     ../beans/black
   f  beans/borlotti  ../beans/borlotti
   f  beans/kidney    ../beans/kidney
@@ -185,16 +185,16 @@
   matcher: <patternmatcher patterns='(?:^mammals/[^/]+$)', includes=None>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'rootfilesin:mammals'
-  matcher: <includematcher patterns=None, includes='(?:^mammals/[^/]+$)'>
+  matcher: <includematcher includes='(?:^mammals/[^/]+$)'>
   f  mammals/skunk  skunk
   $ hg debugwalk 'rootfilesin:mammals/'
   matcher: <patternmatcher patterns='(?:^mammals/[^/]+$)', includes=None>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'rootfilesin:mammals/'
-  matcher: <includematcher patterns=None, includes='(?:^mammals/[^/]+$)'>
+  matcher: <includematcher includes='(?:^mammals/[^/]+$)'>
   f  mammals/skunk  skunk
   $ hg debugwalk -X 'rootfilesin:mammals'
-  matcher: <differencematcher m1=<patternmatcher patterns=None, includes=None>, m2=<includematcher patterns=None, includes='(?:^mammals/[^/]+$)'>>
+  matcher: <differencematcher m1=<patternmatcher patterns=None, includes=None>, m2=<includematcher includes='(?:^mammals/[^/]+$)'>>
   f  beans/black                     ../beans/black
   f  beans/borlotti                  ../beans/borlotti
   f  beans/kidney                    ../beans/kidney
@@ -215,7 +215,7 @@
   f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
   f  mammals/skunk                   skunk
   $ hg debugwalk -I.
-  matcher: <includematcher patterns=None, includes='(?:mammals(?:/|$))'>
+  matcher: <includematcher includes='(?:mammals(?:/|$))'>
   f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
   f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
   f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
@@ -263,7 +263,7 @@
   $ cd ..
 
   $ hg debugwalk -Ibeans
-  matcher: <includematcher patterns=None, includes='(?:beans(?:/|$))'>
+  matcher: <includematcher includes='(?:beans(?:/|$))'>
   f  beans/black     beans/black
   f  beans/borlotti  beans/borlotti
   f  beans/kidney    beans/kidney
@@ -271,53 +271,53 @@
   f  beans/pinto     beans/pinto
   f  beans/turtle    beans/turtle
   $ hg debugwalk -I '{*,{b,m}*/*}k'
-  matcher: <includematcher patterns=None, includes='(?:(?:[^/]*|(?:b|m)[^/]*\\/[^/]*)k(?:/|$))'>
+  matcher: <includematcher includes='(?:(?:[^/]*|(?:b|m)[^/]*\\/[^/]*)k(?:/|$))'>
   f  beans/black    beans/black
   f  fenugreek      fenugreek
   f  mammals/skunk  mammals/skunk
   $ hg debugwalk -Ibeans mammals
-  matcher: <intersectionmatcher m1=<patternmatcher patterns='(?:mammals(?:/|$))', includes=None>, m2=<includematcher patterns=None, includes='(?:beans(?:/|$))'>>
+  matcher: <intersectionmatcher m1=<patternmatcher patterns='(?:mammals(?:/|$))', includes=None>, m2=<includematcher includes='(?:beans(?:/|$))'>>
   $ hg debugwalk -Inon-existent
-  matcher: <includematcher patterns=None, includes='(?:non\\-existent(?:/|$))'>
+  matcher: <includematcher includes='(?:non\\-existent(?:/|$))'>
   $ hg debugwalk -Inon-existent -Ibeans/black
-  matcher: <includematcher patterns=None, includes='(?:non\\-existent(?:/|$)|beans\\/black(?:/|$))'>
+  matcher: <includematcher includes='(?:non\\-existent(?:/|$)|beans\\/black(?:/|$))'>
   f  beans/black  beans/black
   $ hg debugwalk -Ibeans beans/black
-  matcher: <intersectionmatcher m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))', includes=None>, m2=<includematcher patterns=None, includes='(?:beans(?:/|$))'>>
+  matcher: <intersectionmatcher m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))', includes=None>, m2=<includematcher includes='(?:beans(?:/|$))'>>
   f  beans/black  beans/black  exact
   $ hg debugwalk -Ibeans/black beans
-  matcher: <intersectionmatcher m1=<patternmatcher patterns='(?:beans(?:/|$))', includes=None>, m2=<includematcher patterns=None, includes='(?:beans\\/black(?:/|$))'>>
+  matcher: <intersectionmatcher m1=<patternmatcher patterns='(?:beans(?:/|$))', includes=None>, m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
   f  beans/black  beans/black
   $ hg debugwalk -Xbeans/black beans
-  matcher: <differencematcher m1=<patternmatcher patterns='(?:beans(?:/|$))', includes=None>, m2=<includematcher patterns=None, includes='(?:beans\\/black(?:/|$))'>>
+  matcher: <differencematcher m1=<patternmatcher patterns='(?:beans(?:/|$))', includes=None>, m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
   f  beans/borlotti  beans/borlotti
   f  beans/kidney    beans/kidney
   f  beans/navy      beans/navy
   f  beans/pinto     beans/pinto
   f  beans/turtle    beans/turtle
   $ hg debugwalk -Xbeans/black -Ibeans
-  matcher: <differencematcher m1=<includematcher patterns=None, includes='(?:beans(?:/|$))'>, m2=<includematcher patterns=None, includes='(?:beans\\/black(?:/|$))'>>
+  matcher: <differencematcher m1=<includematcher includes='(?:beans(?:/|$))'>, m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
   f  beans/borlotti  beans/borlotti
   f  beans/kidney    beans/kidney
   f  beans/navy      beans/navy
   f  beans/pinto     beans/pinto
   f  beans/turtle    beans/turtle
   $ hg debugwalk -Xbeans/black beans/black
-  matcher: <differencematcher m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))', includes=None>, m2=<includematcher patterns=None, includes='(?:beans\\/black(?:/|$))'>>
+  matcher: <differencematcher m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))', includes=None>, m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
   f  beans/black  beans/black  exact
   $ hg debugwalk -Xbeans/black -Ibeans/black
-  matcher: <differencematcher m1=<includematcher patterns=None, includes='(?:beans\\/black(?:/|$))'>, m2=<includematcher patterns=None, includes='(?:beans\\/black(?:/|$))'>>
+  matcher: <differencematcher m1=<includematcher includes='(?:beans\\/black(?:/|$))'>, m2=<includematcher includes='(?:beans\\/black(?:/|$))'>>
   $ hg debugwalk -Xbeans beans/black
-  matcher: <differencematcher m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))', includes=None>, m2=<includematcher patterns=None, includes='(?:beans(?:/|$))'>>
+  matcher: <differencematcher m1=<patternmatcher patterns='(?:beans\\/black(?:/|$))', includes=None>, m2=<includematcher includes='(?:beans(?:/|$))'>>
   f  beans/black  beans/black  exact
   $ hg debugwalk -Xbeans -Ibeans/black
-  matcher: <differencematcher m1=<includematcher patterns=None, includes='(?:beans\\/black(?:/|$))'>, m2=<includematcher patterns=None, includes='(?:beans(?:/|$))'>>
+  matcher: <differencematcher m1=<includematcher includes='(?:beans\\/black(?:/|$))'>, m2=<includematcher includes='(?:beans(?:/|$))'>>
   $ hg debugwalk 'glob:mammals/../beans/b*'
   matcher: <patternmatcher patterns='(?:beans\\/b[^/]*$)', includes=None>
   f  beans/black     beans/black
   f  beans/borlotti  beans/borlotti
   $ hg debugwalk '-X*/Procyonidae' mammals
-  matcher: <differencematcher m1=<patternmatcher patterns='(?:mammals(?:/|$))', includes=None>, m2=<includematcher patterns=None, includes='(?:[^/]*\\/Procyonidae(?:/|$))'>>
+  matcher: <differencematcher m1=<patternmatcher patterns='(?:mammals(?:/|$))', includes=None>, m2=<includematcher includes='(?:[^/]*\\/Procyonidae(?:/|$))'>>
   f  mammals/skunk  mammals/skunk
   $ hg debugwalk path:mammals
   matcher: <patternmatcher patterns='(?:^mammals(?:/|$))', includes=None>
@@ -481,12 +481,12 @@
 
   $ $PYTHON -c "file('listfile0', 'wb').write('fenugreek\0new\0')"
   $ hg debugwalk -I 'listfile0:listfile0'
-  matcher: <includematcher patterns=None, includes='(?:fenugreek(?:/|$)|new(?:/|$))'>
+  matcher: <includematcher includes='(?:fenugreek(?:/|$)|new(?:/|$))'>
   f  fenugreek  fenugreek
   f  new        new
   $ $PYTHON -c "file('listfile', 'wb').write('fenugreek\nnew\r\nmammals/skunk\n')"
   $ hg debugwalk -I 'listfile:listfile'
-  matcher: <includematcher patterns=None, includes='(?:fenugreek(?:/|$)|new(?:/|$)|mammals\\/skunk(?:/|$))'>
+  matcher: <includematcher includes='(?:fenugreek(?:/|$)|new(?:/|$)|mammals\\/skunk(?:/|$))'>
   f  fenugreek      fenugreek
   f  mammals/skunk  mammals/skunk
   f  new            new