Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> writes: > Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> > --- > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html