[PATCH 7 of 7] match: replace icasefsmatch() function by flag to regular match()

Martin von Zweigbergk martinvonz at google.com
Mon May 22 11:44:55 EDT 2017


On Mon, May 22, 2017 at 7:40 AM, Yuya Nishihara <yuya at tcha.org> wrote:
> On Sun, 21 May 2017 23:16:07 -0700, Martin von Zweigbergk via Mercurial-devel wrote:
>> # HG changeset patch
>> # User Martin von Zweigbergk <martinvonz at google.com>
>> # Date 1495171259 25200
>> #      Thu May 18 22:20:59 2017 -0700
>> # Node ID ed78062d1d886bf26565a9deaeb193ba0dadc3ab
>> # Parent  9e10877c30246447a99745c70f3303ee11c33fac
>> match: replace icasefsmatch() function by flag to regular match()
>>
>> match() will soon gain more logic and we don't want to duplicate that
>> in icasefsmatch(), so merge the two functions instead and use a flag
>> to get case-insensitive behavior.
>>
>> diff --git a/mercurial/context.py b/mercurial/context.py
>> --- a/mercurial/context.py
>> +++ b/mercurial/context.py
>> @@ -1593,13 +1593,11 @@
>>
>>          # Only a case insensitive filesystem needs magic to translate user input
>>          # to actual case in the filesystem.
>> -        matcherfunc = matchmod.match
>> -        if not util.fscasesensitive(r.root):
>> -            matcherfunc = matchmod.icasefsmatch
>> -        return matcherfunc(r.root, r.getcwd(), pats,
>> -                           include, exclude, default,
>> -                           auditor=r.auditor, ctx=self,
>> -                           listsubrepos=listsubrepos, badfn=badfn)
>> +        icasefs = not util.fscasesensitive(r.root)
>> +        return matchmod.match(r.root, r.getcwd(), pats, include, exclude,
>> +                              default, auditor=r.auditor, ctx=self,
>> +                              listsubrepos=listsubrepos, badfn=badfn,
>> +                              icasefs=icasefs)
>>
>>      def _filtersuspectsymlink(self, files):
>>          if not files or self._repo.dirstate._checklink:
>> diff --git a/mercurial/match.py b/mercurial/match.py
>> --- a/mercurial/match.py
>> +++ b/mercurial/match.py
>> @@ -86,7 +86,7 @@
>>
>>  def match(root, cwd, patterns, include=None, exclude=None, default='glob',
>>            exact=False, auditor=None, ctx=None, listsubrepos=False, warn=None,
>> -          badfn=None):
>> +          badfn=None, icasefs=False):
>>      """build an object to match a set of file patterns
>>
>>      arguments:
>> @@ -99,6 +99,8 @@
>>      exact - patterns are actually filenames (include/exclude still apply)
>>      warn - optional function used for printing warnings
>>      badfn - optional bad() callback for this matcher instead of the default
>> +    icasefs - make a matcher for wdir on case insensitive filesystems, which
>> +        normalizes the given patterns to the case in the filesystem
>>
>>      a pattern is one of:
>>      'glob:<glob>' - a glob relative to cwd
>> @@ -116,39 +118,31 @@
>>                            the same directory
>>      '<something>' - a pattern of the specified default type
>>      """
>> -    return matcher(root, cwd, _donormalize, patterns, include=include,
>> +    normalize = _donormalize
>> +    if icasefs:
>> +        dirstate = ctx.repo().dirstate
>> +        dsnormalize = dirstate.normalize
>> +
>> +        def normalize(patterns, default, root, cwd, auditor, warn):
>> +            kp = _donormalize(patterns, default, root, cwd, auditor, warn)
>> +            kindpats = []
>> +            for kind, pats, source in kp:
>> +                if kind not in ('re', 'relre'):  # regex can't be normalized
>> +                    p = pats
>> +                    pats = dsnormalize(pats)
>> +
>> +                    # Preserve the original to handle a case only rename.
>> +                    if p != pats and p in dirstate:
>> +                        kindpats.append((kind, p, source))
>> +
>> +                kindpats.append((kind, pats, source))
>> +            return kindpats
>> +
>> +    return matcher(root, cwd, normalize, patterns, include=include,
>
> Maybe we should reject bad combination such as icasefs + exact?

Good idea. I'll send a patch (either separately or as part of the
remainder of the series).


More information about the Mercurial-devel mailing list