changeset 32466:12e241b2713c

match: remove support for excludes from matcher class The support is now provided by differencematcher() and still available via the match() function.
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 16 May 2017 22:15:42 -0700
parents a83a7d27911e
children ad37c569ec81
files mercurial/match.py tests/test-eolfilename.t tests/test-hgignore.t tests/test-walk.t
diffstat 4 files changed, 92 insertions(+), 112 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/match.py	Tue May 16 16:36:48 2017 -0700
+++ b/mercurial/match.py	Tue May 16 22:15:42 2017 -0700
@@ -142,12 +142,12 @@
                 kindpats.append((kind, pats, source))
             return kindpats
 
-    m = matcher(root, cwd, normalize, patterns, include=include, exclude=None,
+    m = matcher(root, cwd, normalize, patterns, include=include,
                 default=default, exact=exact, auditor=auditor, ctx=ctx,
                 listsubrepos=listsubrepos, warn=warn, badfn=badfn)
     if exclude:
-        em = matcher(root, cwd, normalize, [], include=exclude, exclude=None,
-                     default=default, exact=False, auditor=auditor, ctx=ctx,
+        em = matcher(root, cwd, normalize, [], include=exclude, default=default,
+                     exact=False, auditor=auditor, ctx=ctx,
                      listsubrepos=listsubrepos, warn=warn, badfn=None)
         m = differencematcher(m, em)
     return m
@@ -305,25 +305,21 @@
 class matcher(basematcher):
 
     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):
+                 default='glob', exact=False, auditor=None, ctx=None,
+                 listsubrepos=False, warn=None, badfn=None):
         super(matcher, self).__init__(root, cwd, badfn)
         if include is None:
             include = []
-        if exclude is None:
-            exclude = []
 
-        self._anypats = bool(include or exclude)
+        self._anypats = bool(include)
         self._anyincludepats = False
         self._always = False
-        self._pathrestricted = bool(include or exclude or patterns)
+        self._pathrestricted = bool(include or patterns)
         self.patternspat = None
         self.includepat = None
-        self.excludepat = None
 
-        # roots are directories which are recursively included/excluded.
+        # roots are directories which are recursively included.
         self._includeroots = set()
-        self._excluderoots = set()
         # dirs are directories which are non-recursively included.
         self._includedirs = set()
 
@@ -337,18 +333,6 @@
             self._includeroots.update(roots)
             self._includedirs.update(dirs)
             matchfns.append(im)
-        if exclude:
-            kindpats = normalize(exclude, 'glob', root, cwd, auditor, warn)
-            self.excludepat, em = _buildmatch(ctx, kindpats, '(?:/|$)',
-                                              listsubrepos, root)
-            if not _anypats(kindpats):
-                # Only consider recursive excludes as such - if a non-recursive
-                # exclude is used, we must still recurse into the excluded
-                # directory, at least to find subdirectories. In such a case,
-                # the regex still won't match the non-recursively-excluded
-                # files.
-                self._excluderoots.update(_roots(kindpats))
-            matchfns.append(lambda f: not em(f))
         if exact:
             if isinstance(patterns, list):
                 self._files = patterns
@@ -388,11 +372,8 @@
     def visitdir(self, dir):
         if self.prefix() and dir in self._fileset:
             return 'all'
-        if dir in self._excluderoots:
-            return False
         if self._includeroots or self._includedirs:
             if (not self._anyincludepats and
-                not self._excluderoots and
                 dir in self._includeroots):
                 # The condition above is essentially self.prefix() for includes
                 return 'all'
@@ -419,9 +400,8 @@
         return self.matchfn == self.exact
 
     def __repr__(self):
-        return ('<matcher files=%r, patterns=%r, includes=%r, excludes=%r>' %
-                (self._files, self.patternspat, self.includepat,
-                 self.excludepat))
+        return ('<matcher files=%r, patterns=%r, includes=%r>' %
+                (self._files, self.patternspat, self.includepat))
 
 class differencematcher(basematcher):
     '''Composes two matchers by matching if the first matches and the second
--- a/tests/test-eolfilename.t	Tue May 16 16:36:48 2017 -0700
+++ b/tests/test-eolfilename.t	Tue May 16 22:15:42 2017 -0700
@@ -33,7 +33,7 @@
   [255]
   $ echo foo > "$A"
   $ hg debugwalk
-  matcher: <matcher files=[], patterns=None, includes=None, excludes=None>
+  matcher: <matcher files=[], patterns=None, includes=None>
   f  he\r (no-eol) (esc)
   llo  he\r (no-eol) (esc)
   llo
--- a/tests/test-hgignore.t	Tue May 16 16:36:48 2017 -0700
+++ b/tests/test-hgignore.t	Tue May 16 22:15:42 2017 -0700
@@ -164,7 +164,7 @@
   A b.o
 
   $ hg debugignore
-  <matcher files=[], patterns=None, includes='(?:(?:|.*/)[^/]*(?:/|$))', excludes=None>
+  <matcher files=[], patterns=None, includes='(?:(?:|.*/)[^/]*(?:/|$))'>
 
   $ hg debugignore b.o
   b.o is ignored
--- a/tests/test-walk.t	Tue May 16 16:36:48 2017 -0700
+++ b/tests/test-walk.t	Tue May 16 22:15:42 2017 -0700
@@ -29,7 +29,7 @@
   $ hg commit -m "commit #0"
 
   $ hg debugwalk
-  matcher: <matcher files=[], patterns=None, includes=None, excludes=None>
+  matcher: <matcher files=[], patterns=None, includes=None>
   f  beans/black                     beans/black
   f  beans/borlotti                  beans/borlotti
   f  beans/kidney                    beans/kidney
@@ -44,7 +44,7 @@
   f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
   f  mammals/skunk                   mammals/skunk
   $ hg debugwalk -I.
-  matcher: <matcher files=[], patterns=None, includes='(?:)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:)'>
   f  beans/black                     beans/black
   f  beans/borlotti                  beans/borlotti
   f  beans/kidney                    beans/kidney
@@ -61,7 +61,7 @@
 
   $ cd mammals
   $ hg debugwalk
-  matcher: <matcher files=[], patterns=None, includes=None, excludes=None>
+  matcher: <matcher files=[], patterns=None, includes=None>
   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=<matcher files=[], patterns=None, includes=None, excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:beans(?:/|$))', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes=None>, m2=<matcher files=[], patterns=None, 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: <matcher files=[], patterns=None, includes='(?:mammals\\/[^/]*k(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:mammals\\/[^/]*k(?:/|$))'>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'glob:*k'
-  matcher: <matcher files=[], patterns=None, includes='(?:mammals\\/[^/]*k(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:mammals\\/[^/]*k(?:/|$))'>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'relglob:*k'
-  matcher: <matcher files=[], patterns=None, includes='(?:(?:|.*/)[^/]*k(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:(?:|.*/)[^/]*k(?:/|$))'>
   f  beans/black    ../beans/black
   f  fenugreek      ../fenugreek
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'relglob:*k' .
-  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes='(?:(?:|.*/)[^/]*k(?:/|$))', excludes=None>
+  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes='(?:(?:|.*/)[^/]*k(?:/|$))'>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 're:.*k$'
-  matcher: <matcher files=[], patterns=None, includes='(?:.*k$)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:.*k$)'>
   f  beans/black    ../beans/black
   f  fenugreek      ../fenugreek
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'relre:.*k$'
-  matcher: <matcher files=[], patterns=None, includes='(?:.*.*k$)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:.*.*k$)'>
   f  beans/black    ../beans/black
   f  fenugreek      ../fenugreek
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'path:beans'
-  matcher: <matcher files=[], patterns=None, includes='(?:^beans(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, 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: <matcher files=[], patterns=None, includes='(?:beans(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:beans(?:/|$))'>
   f  beans/black     ../beans/black
   f  beans/borlotti  ../beans/borlotti
   f  beans/kidney    ../beans/kidney
@@ -126,27 +126,27 @@
   f  beans/turtle    ../beans/turtle
 
   $ hg debugwalk 'rootfilesin:'
-  matcher: <matcher files=[], patterns='(?:^[^/]+$)', includes=None, excludes=None>
+  matcher: <matcher files=[], patterns='(?:^[^/]+$)', includes=None>
   f  fennel      ../fennel
   f  fenugreek   ../fenugreek
   f  fiddlehead  ../fiddlehead
   $ hg debugwalk -I 'rootfilesin:'
-  matcher: <matcher files=[], patterns=None, includes='(?:^[^/]+$)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:^[^/]+$)'>
   f  fennel      ../fennel
   f  fenugreek   ../fenugreek
   f  fiddlehead  ../fiddlehead
   $ hg debugwalk 'rootfilesin:.'
-  matcher: <matcher files=[], patterns='(?:^[^/]+$)', includes=None, excludes=None>
+  matcher: <matcher files=[], patterns='(?:^[^/]+$)', includes=None>
   f  fennel      ../fennel
   f  fenugreek   ../fenugreek
   f  fiddlehead  ../fiddlehead
   $ hg debugwalk -I 'rootfilesin:.'
-  matcher: <matcher files=[], patterns=None, includes='(?:^[^/]+$)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:^[^/]+$)'>
   f  fennel      ../fennel
   f  fenugreek   ../fenugreek
   f  fiddlehead  ../fiddlehead
   $ hg debugwalk -X 'rootfilesin:'
-  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes=None, excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:^[^/]+$)', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes=None>, m2=<matcher files=[], patterns=None, includes='(?:^[^/]+$)'>>
   f  beans/black                     ../beans/black
   f  beans/borlotti                  ../beans/borlotti
   f  beans/kidney                    ../beans/kidney
@@ -158,15 +158,15 @@
   f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
   f  mammals/skunk                   skunk
   $ hg debugwalk 'rootfilesin:fennel'
-  matcher: <matcher files=[], patterns='(?:^fennel/[^/]+$)', includes=None, excludes=None>
+  matcher: <matcher files=[], patterns='(?:^fennel/[^/]+$)', includes=None>
   $ hg debugwalk -I 'rootfilesin:fennel'
-  matcher: <matcher files=[], patterns=None, includes='(?:^fennel/[^/]+$)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:^fennel/[^/]+$)'>
   $ hg debugwalk 'rootfilesin:skunk'
-  matcher: <matcher files=[], patterns='(?:^skunk/[^/]+$)', includes=None, excludes=None>
+  matcher: <matcher files=[], patterns='(?:^skunk/[^/]+$)', includes=None>
   $ hg debugwalk -I 'rootfilesin:skunk'
-  matcher: <matcher files=[], patterns=None, includes='(?:^skunk/[^/]+$)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:^skunk/[^/]+$)'>
   $ hg debugwalk 'rootfilesin:beans'
-  matcher: <matcher files=[], patterns='(?:^beans/[^/]+$)', includes=None, excludes=None>
+  matcher: <matcher files=[], patterns='(?:^beans/[^/]+$)', includes=None>
   f  beans/black     ../beans/black
   f  beans/borlotti  ../beans/borlotti
   f  beans/kidney    ../beans/kidney
@@ -174,7 +174,7 @@
   f  beans/pinto     ../beans/pinto
   f  beans/turtle    ../beans/turtle
   $ hg debugwalk -I 'rootfilesin:beans'
-  matcher: <matcher files=[], patterns=None, includes='(?:^beans/[^/]+$)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:^beans/[^/]+$)'>
   f  beans/black     ../beans/black
   f  beans/borlotti  ../beans/borlotti
   f  beans/kidney    ../beans/kidney
@@ -182,19 +182,19 @@
   f  beans/pinto     ../beans/pinto
   f  beans/turtle    ../beans/turtle
   $ hg debugwalk 'rootfilesin:mammals'
-  matcher: <matcher files=[], patterns='(?:^mammals/[^/]+$)', includes=None, excludes=None>
+  matcher: <matcher files=[], patterns='(?:^mammals/[^/]+$)', includes=None>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'rootfilesin:mammals'
-  matcher: <matcher files=[], patterns=None, includes='(?:^mammals/[^/]+$)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:^mammals/[^/]+$)'>
   f  mammals/skunk  skunk
   $ hg debugwalk 'rootfilesin:mammals/'
-  matcher: <matcher files=[], patterns='(?:^mammals/[^/]+$)', includes=None, excludes=None>
+  matcher: <matcher files=[], patterns='(?:^mammals/[^/]+$)', includes=None>
   f  mammals/skunk  skunk
   $ hg debugwalk -I 'rootfilesin:mammals/'
-  matcher: <matcher files=[], patterns=None, includes='(?:^mammals/[^/]+$)', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:^mammals/[^/]+$)'>
   f  mammals/skunk  skunk
   $ hg debugwalk -X 'rootfilesin:mammals'
-  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes=None, excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:^mammals/[^/]+$)', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes=None>, m2=<matcher files=[], patterns=None, includes='(?:^mammals/[^/]+$)'>>
   f  beans/black                     ../beans/black
   f  beans/borlotti                  ../beans/borlotti
   f  beans/kidney                    ../beans/kidney
@@ -209,31 +209,31 @@
   f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
 
   $ hg debugwalk .
-  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes=None>
   f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
   f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
   f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
   f  mammals/skunk                   skunk
   $ hg debugwalk -I.
-  matcher: <matcher files=[], patterns=None, includes='(?:mammals(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:mammals(?:/|$))'>
   f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
   f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
   f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
   f  mammals/skunk                   skunk
   $ hg debugwalk Procyonidae
-  matcher: <matcher files=['mammals/Procyonidae'], patterns='(?:mammals\\/Procyonidae(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['mammals/Procyonidae'], patterns='(?:mammals\\/Procyonidae(?:/|$))', includes=None>
   f  mammals/Procyonidae/cacomistle  Procyonidae/cacomistle
   f  mammals/Procyonidae/coatimundi  Procyonidae/coatimundi
   f  mammals/Procyonidae/raccoon     Procyonidae/raccoon
 
   $ cd Procyonidae
   $ hg debugwalk .
-  matcher: <matcher files=['mammals/Procyonidae'], patterns='(?:mammals\\/Procyonidae(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['mammals/Procyonidae'], patterns='(?:mammals\\/Procyonidae(?:/|$))', includes=None>
   f  mammals/Procyonidae/cacomistle  cacomistle
   f  mammals/Procyonidae/coatimundi  coatimundi
   f  mammals/Procyonidae/raccoon     raccoon
   $ hg debugwalk ..
-  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes=None>
   f  mammals/Procyonidae/cacomistle  cacomistle
   f  mammals/Procyonidae/coatimundi  coatimundi
   f  mammals/Procyonidae/raccoon     raccoon
@@ -241,7 +241,7 @@
   $ cd ..
 
   $ hg debugwalk ../beans
-  matcher: <matcher files=['beans'], patterns='(?:beans(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['beans'], patterns='(?:beans(?:/|$))', includes=None>
   f  beans/black     ../beans/black
   f  beans/borlotti  ../beans/borlotti
   f  beans/kidney    ../beans/kidney
@@ -249,7 +249,7 @@
   f  beans/pinto     ../beans/pinto
   f  beans/turtle    ../beans/turtle
   $ hg debugwalk .
-  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes=None>
   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: <matcher files=[], patterns=None, includes='(?:beans(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:beans(?:/|$))'>
   f  beans/black     beans/black
   f  beans/borlotti  beans/borlotti
   f  beans/kidney    beans/kidney
@@ -271,56 +271,56 @@
   f  beans/pinto     beans/pinto
   f  beans/turtle    beans/turtle
   $ hg debugwalk -I '{*,{b,m}*/*}k'
-  matcher: <matcher files=[], patterns=None, includes='(?:(?:[^/]*|(?:b|m)[^/]*\\/[^/]*)k(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:(?:[^/]*|(?:b|m)[^/]*\\/[^/]*)k(?:/|$))'>
   f  beans/black    beans/black
   f  fenugreek      fenugreek
   f  mammals/skunk  mammals/skunk
   $ hg debugwalk -Ibeans mammals
-  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes='(?:beans(?:/|$))', excludes=None>
+  matcher: <matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes='(?:beans(?:/|$))'>
   $ hg debugwalk -Inon-existent
-  matcher: <matcher files=[], patterns=None, includes='(?:non\\-existent(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:non\\-existent(?:/|$))'>
   $ hg debugwalk -Inon-existent -Ibeans/black
-  matcher: <matcher files=[], patterns=None, includes='(?:non\\-existent(?:/|$)|beans\\/black(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:non\\-existent(?:/|$)|beans\\/black(?:/|$))'>
   f  beans/black  beans/black
   $ hg debugwalk -Ibeans beans/black
-  matcher: <matcher files=['beans/black'], patterns='(?:beans\\/black(?:/|$))', includes='(?:beans(?:/|$))', excludes=None>
+  matcher: <matcher files=['beans/black'], patterns='(?:beans\\/black(?:/|$))', includes='(?:beans(?:/|$))'>
   f  beans/black  beans/black  exact
   $ hg debugwalk -Ibeans/black beans
-  matcher: <matcher files=['beans'], patterns='(?:beans(?:/|$))', includes='(?:beans\\/black(?:/|$))', excludes=None>
+  matcher: <matcher files=['beans'], patterns='(?:beans(?:/|$))', includes='(?:beans\\/black(?:/|$))'>
   f  beans/black  beans/black
   $ hg debugwalk -Xbeans/black beans
-  matcher: <differencematcher m1=<matcher files=['beans'], patterns='(?:beans(?:/|$))', includes=None, excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=['beans'], patterns='(?:beans(?:/|$))', includes=None>, m2=<matcher files=[], patterns=None, 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=<matcher files=[], patterns=None, includes='(?:beans(?:/|$))', excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes='(?:beans(?:/|$))'>, m2=<matcher files=[], patterns=None, 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=<matcher files=['beans/black'], patterns='(?:beans\\/black(?:/|$))', includes=None, excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=['beans/black'], patterns='(?:beans\\/black(?:/|$))', includes=None>, m2=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))'>>
   f  beans/black  beans/black  exact
   $ hg debugwalk -Xbeans/black -Ibeans/black
-  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))', excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))'>, m2=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))'>>
   $ hg debugwalk -Xbeans beans/black
-  matcher: <differencematcher m1=<matcher files=['beans/black'], patterns='(?:beans\\/black(?:/|$))', includes=None, excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:beans(?:/|$))', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=['beans/black'], patterns='(?:beans\\/black(?:/|$))', includes=None>, m2=<matcher files=[], patterns=None, includes='(?:beans(?:/|$))'>>
   f  beans/black  beans/black  exact
   $ hg debugwalk -Xbeans -Ibeans/black
-  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))', excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:beans(?:/|$))', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=[], patterns=None, includes='(?:beans\\/black(?:/|$))'>, m2=<matcher files=[], patterns=None, includes='(?:beans(?:/|$))'>>
   $ hg debugwalk 'glob:mammals/../beans/b*'
-  matcher: <matcher files=['beans'], patterns='(?:beans\\/b[^/]*$)', includes=None, excludes=None>
+  matcher: <matcher files=['beans'], patterns='(?:beans\\/b[^/]*$)', includes=None>
   f  beans/black     beans/black
   f  beans/borlotti  beans/borlotti
   $ hg debugwalk '-X*/Procyonidae' mammals
-  matcher: <differencematcher m1=<matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes=None, excludes=None>, m2=<matcher files=[], patterns=None, includes='(?:[^/]*\\/Procyonidae(?:/|$))', excludes=None>>
+  matcher: <differencematcher m1=<matcher files=['mammals'], patterns='(?:mammals(?:/|$))', includes=None>, m2=<matcher files=[], patterns=None, includes='(?:[^/]*\\/Procyonidae(?:/|$))'>>
   f  mammals/skunk  mammals/skunk
   $ hg debugwalk path:mammals
-  matcher: <matcher files=['mammals'], patterns='(?:^mammals(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['mammals'], patterns='(?:^mammals(?:/|$))', includes=None>
   f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
   f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
   f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
@@ -347,7 +347,7 @@
 Test absolute paths:
 
   $ hg debugwalk `pwd`/beans
-  matcher: <matcher files=['beans'], patterns='(?:beans(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['beans'], patterns='(?:beans(?:/|$))', includes=None>
   f  beans/black     beans/black
   f  beans/borlotti  beans/borlotti
   f  beans/kidney    beans/kidney
@@ -361,7 +361,7 @@
 Test patterns:
 
   $ hg debugwalk glob:\*
-  matcher: <matcher files=['.'], patterns='(?:[^/]*$)', includes=None, excludes=None>
+  matcher: <matcher files=['.'], patterns='(?:[^/]*$)', includes=None>
   f  fennel      fennel
   f  fenugreek   fenugreek
   f  fiddlehead  fiddlehead
@@ -371,19 +371,19 @@
   adding glob:glob
   warning: filename contains ':', which is reserved on Windows: 'glob:glob'
   $ hg debugwalk glob:\*
-  matcher: <matcher files=['.'], patterns='(?:[^/]*$)', includes=None, excludes=None>
+  matcher: <matcher files=['.'], patterns='(?:[^/]*$)', includes=None>
   f  fennel      fennel
   f  fenugreek   fenugreek
   f  fiddlehead  fiddlehead
   f  glob:glob   glob:glob
   $ hg debugwalk glob:glob
-  matcher: <matcher files=['glob'], patterns='(?:glob$)', includes=None, excludes=None>
+  matcher: <matcher files=['glob'], patterns='(?:glob$)', includes=None>
   glob: No such file or directory
   $ hg debugwalk glob:glob:glob
-  matcher: <matcher files=['glob:glob'], patterns='(?:glob\\:glob$)', includes=None, excludes=None>
+  matcher: <matcher files=['glob:glob'], patterns='(?:glob\\:glob$)', includes=None>
   f  glob:glob  glob:glob  exact
   $ hg debugwalk path:glob:glob
-  matcher: <matcher files=['glob:glob'], patterns='(?:^glob\\:glob(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['glob:glob'], patterns='(?:^glob\\:glob(?:/|$))', includes=None>
   f  glob:glob  glob:glob  exact
   $ rm glob:glob
   $ hg addremove
@@ -391,38 +391,38 @@
 #endif
 
   $ hg debugwalk 'glob:**e'
-  matcher: <matcher files=['.'], patterns='(?:.*e$)', includes=None, excludes=None>
+  matcher: <matcher files=['.'], patterns='(?:.*e$)', includes=None>
   f  beans/turtle                    beans/turtle
   f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
 
   $ hg debugwalk 're:.*[kb]$'
-  matcher: <matcher files=['.'], patterns='(?:.*[kb]$)', includes=None, excludes=None>
+  matcher: <matcher files=['.'], patterns='(?:.*[kb]$)', includes=None>
   f  beans/black    beans/black
   f  fenugreek      fenugreek
   f  mammals/skunk  mammals/skunk
 
   $ hg debugwalk path:beans/black
-  matcher: <matcher files=['beans/black'], patterns='(?:^beans\\/black(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['beans/black'], patterns='(?:^beans\\/black(?:/|$))', includes=None>
   f  beans/black  beans/black  exact
   $ hg debugwalk path:beans//black
-  matcher: <matcher files=['beans/black'], patterns='(?:^beans\\/black(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['beans/black'], patterns='(?:^beans\\/black(?:/|$))', includes=None>
   f  beans/black  beans/black  exact
 
   $ hg debugwalk relglob:Procyonidae
-  matcher: <matcher files=['.'], patterns='(?:(?:|.*/)Procyonidae$)', includes=None, excludes=None>
+  matcher: <matcher files=['.'], patterns='(?:(?:|.*/)Procyonidae$)', includes=None>
   $ hg debugwalk 'relglob:Procyonidae/**'
-  matcher: <matcher files=['.'], patterns='(?:(?:|.*/)Procyonidae\\/.*$)', includes=None, excludes=None>
+  matcher: <matcher files=['.'], patterns='(?:(?:|.*/)Procyonidae\\/.*$)', includes=None>
   f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
   f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
   f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
   $ hg debugwalk 'relglob:Procyonidae/**' fennel
-  matcher: <matcher files=['.', 'fennel'], patterns='(?:(?:|.*/)Procyonidae\\/.*$|fennel(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['.', 'fennel'], patterns='(?:(?:|.*/)Procyonidae\\/.*$|fennel(?:/|$))', includes=None>
   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 beans 'glob:beans/*'
-  matcher: <matcher files=['beans', 'beans'], patterns='(?:beans(?:/|$)|beans\\/[^/]*$)', includes=None, excludes=None>
+  matcher: <matcher files=['beans', 'beans'], patterns='(?:beans(?:/|$)|beans\\/[^/]*$)', includes=None>
   f  beans/black     beans/black
   f  beans/borlotti  beans/borlotti
   f  beans/kidney    beans/kidney
@@ -430,78 +430,78 @@
   f  beans/pinto     beans/pinto
   f  beans/turtle    beans/turtle
   $ hg debugwalk 'glob:mamm**'
-  matcher: <matcher files=['.'], patterns='(?:mamm.*$)', includes=None, excludes=None>
+  matcher: <matcher files=['.'], patterns='(?:mamm.*$)', includes=None>
   f  mammals/Procyonidae/cacomistle  mammals/Procyonidae/cacomistle
   f  mammals/Procyonidae/coatimundi  mammals/Procyonidae/coatimundi
   f  mammals/Procyonidae/raccoon     mammals/Procyonidae/raccoon
   f  mammals/skunk                   mammals/skunk
   $ hg debugwalk 'glob:mamm**' fennel
-  matcher: <matcher files=['.', 'fennel'], patterns='(?:mamm.*$|fennel(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['.', 'fennel'], patterns='(?:mamm.*$|fennel(?:/|$))', includes=None>
   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
   f  mammals/skunk                   mammals/skunk
   $ hg debugwalk 'glob:j*'
-  matcher: <matcher files=['.'], patterns='(?:j[^/]*$)', includes=None, excludes=None>
+  matcher: <matcher files=['.'], patterns='(?:j[^/]*$)', includes=None>
   $ hg debugwalk NOEXIST
-  matcher: <matcher files=['NOEXIST'], patterns='(?:NOEXIST(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['NOEXIST'], patterns='(?:NOEXIST(?:/|$))', includes=None>
   NOEXIST: * (glob)
 
 #if fifo
   $ mkfifo fifo
   $ hg debugwalk fifo
-  matcher: <matcher files=['fifo'], patterns='(?:fifo(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['fifo'], patterns='(?:fifo(?:/|$))', includes=None>
   fifo: unsupported file type (type is fifo)
 #endif
 
   $ rm fenugreek
   $ hg debugwalk fenugreek
-  matcher: <matcher files=['fenugreek'], patterns='(?:fenugreek(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['fenugreek'], patterns='(?:fenugreek(?:/|$))', includes=None>
   f  fenugreek  fenugreek  exact
   $ hg rm fenugreek
   $ hg debugwalk fenugreek
-  matcher: <matcher files=['fenugreek'], patterns='(?:fenugreek(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['fenugreek'], patterns='(?:fenugreek(?:/|$))', includes=None>
   f  fenugreek  fenugreek  exact
   $ touch new
   $ hg debugwalk new
-  matcher: <matcher files=['new'], patterns='(?:new(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['new'], patterns='(?:new(?:/|$))', includes=None>
   f  new  new  exact
 
   $ mkdir ignored
   $ touch ignored/file
   $ echo '^ignored$' > .hgignore
   $ hg debugwalk ignored
-  matcher: <matcher files=['ignored'], patterns='(?:ignored(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['ignored'], patterns='(?:ignored(?:/|$))', includes=None>
   $ hg debugwalk ignored/file
-  matcher: <matcher files=['ignored/file'], patterns='(?:ignored\\/file(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['ignored/file'], patterns='(?:ignored\\/file(?:/|$))', includes=None>
   f  ignored/file  ignored/file  exact
 
 Test listfile and listfile0
 
   $ $PYTHON -c "file('listfile0', 'wb').write('fenugreek\0new\0')"
   $ hg debugwalk -I 'listfile0:listfile0'
-  matcher: <matcher files=[], patterns=None, includes='(?:fenugreek(?:/|$)|new(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, 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: <matcher files=[], patterns=None, includes='(?:fenugreek(?:/|$)|new(?:/|$)|mammals\\/skunk(?:/|$))', excludes=None>
+  matcher: <matcher files=[], patterns=None, includes='(?:fenugreek(?:/|$)|new(?:/|$)|mammals\\/skunk(?:/|$))'>
   f  fenugreek      fenugreek
   f  mammals/skunk  mammals/skunk
   f  new            new
 
   $ cd ..
   $ hg debugwalk -R t t/mammals/skunk
-  matcher: <matcher files=['mammals/skunk'], patterns='(?:mammals\\/skunk(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['mammals/skunk'], patterns='(?:mammals\\/skunk(?:/|$))', includes=None>
   f  mammals/skunk  t/mammals/skunk  exact
   $ mkdir t2
   $ cd t2
   $ hg debugwalk -R ../t ../t/mammals/skunk
-  matcher: <matcher files=['mammals/skunk'], patterns='(?:mammals\\/skunk(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['mammals/skunk'], patterns='(?:mammals\\/skunk(?:/|$))', includes=None>
   f  mammals/skunk  ../t/mammals/skunk  exact
   $ hg debugwalk --cwd ../t mammals/skunk
-  matcher: <matcher files=['mammals/skunk'], patterns='(?:mammals\\/skunk(?:/|$))', includes=None, excludes=None>
+  matcher: <matcher files=['mammals/skunk'], patterns='(?:mammals\\/skunk(?:/|$))', includes=None>
   f  mammals/skunk  mammals/skunk  exact
 
   $ cd ..