Re: [PATCH 2/4] pathspec: do exact comparison on the leading non-wildcard part
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Nov 19, 2012, 20:54 UTC
- Message-ID
- <7vzk2duw3m.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <1353229989-13075-3-git-send-email-pclouds@gmail.com>
Nguyễn Thái Ngọc Duy <pclouds@gmail.com> writes:
Show 28 quoted lines
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> dir.c | 18 +++++++++++++++++-
> dir.h | 8 ++++++++
> tree-walk.c | 6 ++++--
> 3 files changed, 29 insertions(+), 3 deletions(-)
>
> diff --git a/dir.c b/dir.c
> index c391d46..e4e6ca1 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -34,6 +34,21 @@ int fnmatch_icase(const char *pattern, const char *string, int flags)
> return fnmatch(pattern, string, flags | (ignore_case ? FNM_CASEFOLD : 0));
> }
>
> +inline int git_fnmatch(const char *pattern, const char *string,
> + int flags, int prefix)
> +{
> + int fnm_flags = 0;
> + if (flags & GF_PATHNAME)
> + fnm_flags |= FNM_PATHNAME;
> + if (prefix > 0) {
> + if (strncmp(pattern, string, prefix))
> + return FNM_NOMATCH;
> + pattern += prefix;
> + string += prefix;
> + }
> + return fnmatch(pattern, string, fnm_flags);How would we protect this optimization from future breakages?
Once we start using FNM_PERIOD, this becomes unsafe, as the simple part in "foo/bar*baz" would be "foo/bar" with remainder "*baz".
The pattern "foo/bar*baz" should match "foo/bar.baz" with FNM_PERIOD set. But with this optimization, fnmatch is fed pattern="*baz", string=".baz" and they would not match.