diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2012-11-24 11:33:49 +0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-11-26 11:12:51 -0800 |
commit | 5d74762d87859d08fdf4c87ec9387e31e097acba (patch) | |
tree | 7bb2c2522a33fe0aef56d35666b6a1a8cd13c8fd /dir.c | |
parent | 170260ae90cb6a0fec476e7d970e3ac3e81e98f5 (diff) | |
download | git-5d74762d87859d08fdf4c87ec9387e31e097acba.tar.gz git-5d74762d87859d08fdf4c87ec9387e31e097acba.tar.xz |
pathspec: do exact comparison on the leading non-wildcard part
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'dir.c')
-rw-r--r-- | dir.c | 18 |
1 files changed, 17 insertions, 1 deletions
@@ -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 & GFNM_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); +} + static size_t common_prefix_len(const char **pathspec) { const char *n, *first; @@ -230,7 +245,8 @@ static int match_pathspec_item(const struct pathspec_item *item, int prefix, return MATCHED_RECURSIVELY; } - if (item->nowildcard_len < item->len && !fnmatch(match, name, 0)) + if (item->nowildcard_len < item->len && + !git_fnmatch(match, name, 0, item->nowildcard_len - prefix)) return MATCHED_FNMATCH; return 0; |