[PATCH 7 of 7] match: replace icasefsmatch() function by flag to regular match()
Yuya Nishihara
yuya at tcha.org
Mon May 22 10:40:25 EDT 2017
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?
More information about the Mercurial-devel
mailing list