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.
--- 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