X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=builtin-grep.c;h=2124fa62e8900754615bf7eb49228a4d2b790d52;hb=e0d7d6402d98cb5e07d7428b4af6374180bbf344;hp=09e3677824595d71d02fc7bfc03eef0428df8b90;hpb=9d275ed3e379c5d01056a7a4e5e4b4b8e6a3f2cd;p=git.git diff --git a/builtin-grep.c b/builtin-grep.c index 09e367782..2124fa62e 100644 --- a/builtin-grep.c +++ b/builtin-grep.c @@ -26,7 +26,7 @@ static int pathspec_matches(const char **paths, const char *name) for (i = 0; paths[i]; i++) { const char *match = paths[i]; int matchlen = strlen(match); - const char *slash, *cp; + const char *cp, *meta; if ((matchlen <= namelen) && !strncmp(name, match, matchlen) && @@ -38,38 +38,43 @@ static int pathspec_matches(const char **paths, const char *name) if (name[namelen-1] != '/') continue; - /* We are being asked if the name directory is worth + /* We are being asked if the directory ("name") is worth * descending into. * * Find the longest leading directory name that does * not have metacharacter in the pathspec; the name * we are looking at must overlap with that directory. */ - for (cp = match, slash = NULL; cp - match < matchlen; cp++) { + for (cp = match, meta = NULL; cp - match < matchlen; cp++) { char ch = *cp; - if (ch == '/') - slash = cp; - if (ch == '*' || ch == '[') + if (ch == '*' || ch == '[' || ch == '?') { + meta = cp; break; + } } - if (!slash) - slash = match; /* toplevel */ - else - slash++; - if (namelen <= slash - match) { + if (!meta) + meta = cp; /* fully literal */ + + if (namelen <= meta - match) { /* Looking at "Documentation/" and * the pattern says "Documentation/howto/", or - * "Documentation/diff*.txt". + * "Documentation/diff*.txt". The name we + * have should match prefix. */ if (!memcmp(match, name, namelen)) return 1; + continue; } - else { + + if (meta - match < namelen) { /* Looking at "Documentation/howto/" and - * the pattern says "Documentation/h*". + * the pattern says "Documentation/h*"; + * match up to "Do.../h"; this avoids descending + * into "Documentation/technical/". */ - if (!memcmp(match, name, slash - match)) + if (!memcmp(match, name, meta - match)) return 1; + continue; } } return 0;