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>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2012-11-24 11:33:49 +07:00 коммит произвёл Junio C Hamano
Родитель 170260ae90
Коммит 5d74762d87
3 изменённых файлов: 29 добавлений и 3 удалений

18
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 & 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;

8
dir.h
Просмотреть файл

@ -139,4 +139,12 @@ extern int strcmp_icase(const char *a, const char *b);
extern int strncmp_icase(const char *a, const char *b, size_t count);
extern int fnmatch_icase(const char *pattern, const char *string, int flags);
/*
* The prefix part of pattern must not contains wildcards.
*/
#define GFNM_PATHNAME 1 /* similar to FNM_PATHNAME */
extern int git_fnmatch(const char *pattern, const char *string,
int flags, int prefix);
#endif

Просмотреть файл

@ -627,7 +627,8 @@ enum interesting tree_entry_interesting(const struct name_entry *entry,
return entry_interesting;
if (item->nowildcard_len < item->len) {
if (!fnmatch(match + baselen, entry->path, 0))
if (!git_fnmatch(match + baselen, entry->path,
0, item->nowildcard_len - baselen))
return entry_interesting;
/*
@ -652,7 +653,8 @@ match_wildcards:
strbuf_add(base, entry->path, pathlen);
if (!fnmatch(match, base->buf + base_offset, 0)) {
if (!git_fnmatch(match, base->buf + base_offset,
0, item->nowildcard_len)) {
strbuf_setlen(base, base_offset + baselen);
return entry_interesting;
}