Nguyễn Thái Ngọc Duy  <pclo...@gmail.com> writes:

> Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@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.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to