mirror of
https://github.com/git/git.git
synced 2024-11-18 19:03:52 +01:00
Merge branch 'lt/dirmatch-optim'
* lt/dirmatch-optim: Optimize match_pathspec() to avoid fnmatch()
This commit is contained in:
commit
4c4d3ac746
22
dir.c
22
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,14 +74,27 @@ 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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user