Patchwork [V2] match: inverse _anypats(), making it _prefix()

login
register
mail settings
Submitter via Mercurial-devel
Date July 11, 2017, 4:44 p.m.
Message ID <2800fa259f4e1c23dc9c.1499791468@martinvonz.svl.corp.google.com>
Download mbox | patch
Permalink /patch/22237/
State Accepted
Headers show

Comments

via Mercurial-devel - July 11, 2017, 4:44 p.m.
# HG changeset patch
# User Martin von Zweigbergk <martinvonz@google.com>
# Date 1499791352 25200
#      Tue Jul 11 09:42:32 2017 -0700
# Node ID 2800fa259f4e1c23dc9c9605ed02f4d734dd1761
# Parent  32331f54930cebd2baf953506971953a588491b4
match: inverse _anypats(), making it _prefix()
Yuya Nishihara - July 13, 2017, 4:04 p.m.
On Tue, 11 Jul 2017 09:44:28 -0700, Martin von Zweigbergk via Mercurial-devel wrote:
> # HG changeset patch
> # User Martin von Zweigbergk <martinvonz@google.com>
> # Date 1499791352 25200
> #      Tue Jul 11 09:42:32 2017 -0700
> # Node ID 2800fa259f4e1c23dc9c9605ed02f4d734dd1761
> # Parent  32331f54930cebd2baf953506971953a588491b4
> match: inverse _anypats(), making it _prefix()

Queued, thanks.

> -def _anypats(kindpats):
> +def _prefix(kindpats):
> +    '''Whether all the patterns match a prefix (i.e. recursively)'''
>      for kind, pat, source in kindpats:
> -        if kind in ('glob', 're', 'relglob', 'relre', 'set', 'rootfilesin'):
> -            return True
> +        if kind not in ('path', 'relpath'):
> +            return False

So previously, 'subinclude' wasn't taken as anypats, which was wrong. Correct
me if I'm wrong.
via Mercurial-devel - July 13, 2017, 4:09 p.m.
On Thu, Jul 13, 2017 at 9:04 AM, Yuya Nishihara <yuya@tcha.org> wrote:
> On Tue, 11 Jul 2017 09:44:28 -0700, Martin von Zweigbergk via Mercurial-devel wrote:
>> # HG changeset patch
>> # User Martin von Zweigbergk <martinvonz@google.com>
>> # Date 1499791352 25200
>> #      Tue Jul 11 09:42:32 2017 -0700
>> # Node ID 2800fa259f4e1c23dc9c9605ed02f4d734dd1761
>> # Parent  32331f54930cebd2baf953506971953a588491b4
>> match: inverse _anypats(), making it _prefix()
>
> Queued, thanks.
>
>> -def _anypats(kindpats):
>> +def _prefix(kindpats):
>> +    '''Whether all the patterns match a prefix (i.e. recursively)'''
>>      for kind, pat, source in kindpats:
>> -        if kind in ('glob', 're', 'relglob', 'relre', 'set', 'rootfilesin'):
>> -            return True
>> +        if kind not in ('path', 'relpath'):
>> +            return False
>
> So previously, 'subinclude' wasn't taken as anypats, which was wrong. Correct
> me if I'm wrong.

Oh, sorry, I didn't even think about that. But yes, you're correct. I
didn't mean to sneak in a bug fix in this patch, but now that's it's
done, I guess it's not worth splitting it up.

Patch

diff --git a/mercurial/match.py b/mercurial/match.py
--- a/mercurial/match.py
+++ b/mercurial/match.py
@@ -373,7 +373,7 @@ 
         super(patternmatcher, self).__init__(root, cwd, badfn)
 
         self._files = _explicitfiles(kindpats)
-        self._anypats = _anypats(kindpats)
+        self._prefix = _prefix(kindpats)
         self._pats, self.matchfn = _buildmatch(ctx, kindpats, '$', listsubrepos,
                                                root)
 
@@ -382,7 +382,7 @@ 
         return set(util.dirs(self._fileset)) | {'.'}
 
     def visitdir(self, dir):
-        if self.prefix() and dir in self._fileset:
+        if self._prefix and dir in self._fileset:
             return 'all'
         return ('.' in self._fileset or
                 dir in self._fileset or
@@ -391,7 +391,7 @@ 
                     for parentdir in util.finddirs(dir)))
 
     def prefix(self):
-        return not self._anypats
+        return self._prefix
 
     def __repr__(self):
         return ('<patternmatcher patterns=%r>' % self._pats)
@@ -404,7 +404,7 @@ 
 
         self._pats, self.matchfn = _buildmatch(ctx, kindpats, '(?:/|$)',
                                                listsubrepos, root)
-        self._anypats = _anypats(kindpats)
+        self._prefix = _prefix(kindpats)
         roots, dirs = _rootsanddirs(kindpats)
         # roots are directories which are recursively included.
         self._roots = set(roots)
@@ -412,8 +412,7 @@ 
         self._dirs = set(dirs)
 
     def visitdir(self, dir):
-        if not self._anypats and dir in self._roots:
-            # The condition above is essentially self.prefix() for includes
+        if self._prefix and dir in self._roots:
             return 'all'
         return ('.' in self._roots or
                 dir in self._roots or
@@ -948,10 +947,12 @@ 
     filable = [kp for kp in kindpats if kp[0] not in ('rootfilesin',)]
     return _roots(filable)
 
-def _anypats(kindpats):
+def _prefix(kindpats):
+    '''Whether all the patterns match a prefix (i.e. recursively)'''
     for kind, pat, source in kindpats:
-        if kind in ('glob', 're', 'relglob', 'relre', 'set', 'rootfilesin'):
-            return True
+        if kind not in ('path', 'relpath'):
+            return False
+    return True
 
 _commentre = None