Mercurial > hg
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