diff options
author | Junio C Hamano <junkio@cox.net> | 2006-05-02 22:04:16 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-05-02 22:04:16 -0700 |
commit | e0d7d6402d98cb5e07d7428b4af6374180bbf344 (patch) | |
tree | 2911d17ad3602f929285da88705acd21fa83ca9b | |
parent | Merge branch 'np/delta' into next (diff) | |
parent | builtin-grep: tighten path wildcard vs tree traversal. (diff) | |
download | tgif-e0d7d6402d98cb5e07d7428b4af6374180bbf344.tar.xz |
Merge branch 'jc/grep' into next
* jc/grep:
builtin-grep: tighten path wildcard vs tree traversal.
-rw-r--r-- | builtin-grep.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/builtin-grep.c b/builtin-grep.c index 09e3677824..2124fa62e8 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; |