X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=dir.c;h=29d1d5ba31def46ba8b55905dc60773cc6cc167e;hb=2c47789d817aaf745a5ce5d5f79619c634cc8566;hp=edc458e020772a7ab704e9cf69786d3aa641bcd4;hpb=803d5158123346229d71de53818920efbc88ca0f;p=git.git diff --git a/dir.c b/dir.c index edc458e02..29d1d5ba3 100644 --- a/dir.c +++ b/dir.c @@ -52,6 +52,11 @@ int common_prefix(const char **pathspec) return prefix; } +static inline int special_char(unsigned char c1) +{ + return !c1 || c1 == '*' || c1 == '[' || c1 == '?'; +} + /* * Does 'match' matches the given name? * A match is found if @@ -69,18 +74,31 @@ static int match_one(const char *match, const char *name, int namelen) int matchlen; /* If the match was just the prefix, we matched */ - matchlen = strlen(match); - if (!matchlen) + if (!*match) return MATCHED_RECURSIVELY; + for (;;) { + unsigned char c1 = *match; + unsigned char c2 = *name; + if (special_char(c1)) + break; + if (c1 != c2) + return 0; + match++; + name++; + namelen--; + } + + /* * If we don't match the matchstring exactly, * we need to match by fnmatch */ + matchlen = strlen(match); if (strncmp(match, name, matchlen)) return !fnmatch(match, name, 0) ? MATCHED_FNMATCH : 0; - if (!name[matchlen]) + if (namelen == matchlen) return MATCHED_EXACTLY; if (match[matchlen-1] == '/' || name[matchlen] == '/') return MATCHED_RECURSIVELY; @@ -371,7 +389,7 @@ static struct dir_entry *dir_entry_new(const char *pathname, int len) struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int len) { - if (cache_name_exists(pathname, len)) + if (cache_name_exists(pathname, len, ignore_case)) return NULL; ALLOC_GROW(dir->entries, dir->nr+1, dir->alloc);