From: Junio C Hamano Date: Mon, 19 Nov 2012 20:54:45 GMT Subject: Re: [PATCH 2/4] pathspec: do exact comparison on the leading non-wildcard part 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 writes: > Signed-off-by: Nguyễn Thái Ngọc Duy > --- > 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.