Re: [PATCH 1/4] dir.c: fix match_pathname()
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 15, 2016, 23:29 UTC
- Message-ID
- <xmqqmvr1o8lk.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <1455527019-7787-2-git-send-email-pclouds@gmail.com>
Nguyễn Thái Ngọc Duy <pclouds@gmail.com> writes:
Show 15 quoted lines
> Given the pattern "1/2/3/4" and the path "1/2/3/4/f", the pattern > prefix is "1/2/3/4". We will compare and remove the prefix from both > pattern and path and come to this code > > /* > * If the whole pattern did not have a wildcard, > * then our prefix match is all we need; we > * do not need to call fnmatch at all. > */ > if (!patternlen && !namelen) > return 1; > > where patternlen is zero (full pattern consumed) and the remaining > path in "name" is "/f". We fail to realize it's matched in this case > and fall back to fnmatch(), which also fails to catch it. Fix it.
OK. And by checking *name against '/', we won't mistakenly say that "1/2/3/4f" matches the pattern. Nicely explained.
Can a pattern end with a '/'?
Show 18 quoted lines
> > Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> > --- > dir.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/dir.c b/dir.c > index f0b6d0a..bcaafac 100644 > --- a/dir.c > +++ b/dir.c > @@ -878,7 +878,7 @@ int match_pathname(const char *pathname, int pathlen, > * then our prefix match is all we need; we > * do not need to call fnmatch at all. > */ > - if (!patternlen && !namelen) > + if (!patternlen && (!namelen || *name == '/')) > return 1; > }