* grep --no-index and pathspec @ 2011-02-11 8:59 Lars Noschinski 2011-02-11 15:04 ` Michael J Gruber 0 siblings, 1 reply; 8+ messages in thread From: Lars Noschinski @ 2011-02-11 8:59 UTC (permalink / raw) To: git Hi everyone, I encountered some strange behaviour with grep when using both the --no-index option and a pathspec. Glob patterns seem to be ignored: ---------- $ git grep -l --no-index . -- '*.bib' paper.bib paper.tex ex1.tex ---------- But on the other hands, leading path matches work: ---------- $ git grep -l --no-index . -- 'paper' paper.bib paper.tex ---------- Without the --no-index option, everything works fine: ---------- $ git grep -l --no-index . -- '*.bib' paper.bib ---------- This is with git version 1.7.4, but I encountered it also with the 1.7.2.3 Debian package. -- Lars ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: grep --no-index and pathspec 2011-02-11 8:59 grep --no-index and pathspec Lars Noschinski @ 2011-02-11 15:04 ` Michael J Gruber 2011-02-11 15:06 ` [PATCH] grep.txt: document pathspec for --no-index Michael J Gruber 2011-02-11 18:27 ` grep --no-index and pathspec Junio C Hamano 0 siblings, 2 replies; 8+ messages in thread From: Michael J Gruber @ 2011-02-11 15:04 UTC (permalink / raw) To: Lars Noschinski; +Cc: git, Junio C Hamano Lars Noschinski venit, vidit, dixit 11.02.2011 09:59: > Hi everyone, > > I encountered some strange behaviour with grep when using both the > --no-index option and a pathspec. Glob patterns seem to be ignored: > > ---------- > $ git grep -l --no-index . -- '*.bib' > paper.bib > paper.tex > ex1.tex > ---------- > > But on the other hands, leading path matches work: > ---------- > $ git grep -l --no-index . -- 'paper' > paper.bib > paper.tex > ---------- > > Without the --no-index option, everything works fine: > ---------- > $ git grep -l --no-index . -- '*.bib' > paper.bib > ---------- > > This is with git version 1.7.4, but I encountered it also with the > 1.7.2.3 Debian package. "grep --no-index" and "grep" have different codepaths for looking up the files/blobs. If I read that correctly then "grep --no-index -- pathspec" only does a literal match at the left boundary, whereas for the normal mode glob patterns are allowed. CC'ing Junio who created "--no-index". Michael ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] grep.txt: document pathspec for --no-index 2011-02-11 15:04 ` Michael J Gruber @ 2011-02-11 15:06 ` Michael J Gruber 2011-02-11 18:27 ` grep --no-index and pathspec Junio C Hamano 1 sibling, 0 replies; 8+ messages in thread From: Michael J Gruber @ 2011-02-11 15:06 UTC (permalink / raw) To: git; +Cc: Junio C Hamano, Lars Noschinski because it allows leading path match only, no globs. Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net> --- Documentation/git-grep.txt | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt index dab0a78..ef01a57 100644 --- a/Documentation/git-grep.txt +++ b/Documentation/git-grep.txt @@ -186,7 +186,8 @@ OPTIONS <pathspec>...:: If given, limit the search to paths matching at least one pattern. - Both leading paths match and glob(7) patterns are supported. + Both leading paths match and glob(7) patterns are supported + unless `--no-index` is used, which supports only the former. Examples -------- -- 1.7.4.91.g3d0bb ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: grep --no-index and pathspec 2011-02-11 15:04 ` Michael J Gruber 2011-02-11 15:06 ` [PATCH] grep.txt: document pathspec for --no-index Michael J Gruber @ 2011-02-11 18:27 ` Junio C Hamano 2011-02-11 21:37 ` Junio C Hamano 1 sibling, 1 reply; 8+ messages in thread From: Junio C Hamano @ 2011-02-11 18:27 UTC (permalink / raw) To: Michael J Gruber; +Cc: Lars Noschinski, git, Junio C Hamano Michael J Gruber <git@drmicha.warpmail.net> writes: > "grep --no-index" and "grep" have different codepaths for looking up the > files/blobs. If I read that correctly then "grep --no-index -- pathspec" > only does a literal match at the left boundary, whereas for the normal > mode glob patterns are allowed. > > CC'ing Junio who created "--no-index". Anything with --no-index is a quick hack, so I wouldn't be surprised if it ignored the normal pathspec logic. As I do not recall the details of the particular codepath and offhand do not know how involved a change to pay proper attention to the pathspecs would be, but I suspect that it would be more appropriate to fix it on top of nd/struct-pathspec topic than writing the current behaviour down in the documentation outside of BUGS section as if it were a feature ;-). ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: grep --no-index and pathspec 2011-02-11 18:27 ` grep --no-index and pathspec Junio C Hamano @ 2011-02-11 21:37 ` Junio C Hamano 2011-02-12 8:14 ` Nguyen Thai Ngoc Duy 0 siblings, 1 reply; 8+ messages in thread From: Junio C Hamano @ 2011-02-11 21:37 UTC (permalink / raw) To: Michael J Gruber Cc: Nguyễn Thái Ngọc Duy, Lars Noschinski, git Junio C Hamano <gitster@pobox.com> writes: > Michael J Gruber <git@drmicha.warpmail.net> writes: > >> "grep --no-index" and "grep" have different codepaths for looking up the >> files/blobs. If I read that correctly then "grep --no-index -- pathspec" >> only does a literal match at the left boundary, whereas for the normal >> mode glob patterns are allowed. >> >> CC'ing Junio who created "--no-index". > > Anything with --no-index is a quick hack, so I wouldn't be surprised if it > ignored the normal pathspec logic. As I do not recall the details of the > particular codepath and offhand do not know how involved a change to pay > proper attention to the pathspecs would be, but I suspect that it would be > more appropriate to fix it on top of nd/struct-pathspec topic than writing > the current behaviour down in the documentation outside of BUGS section as > if it were a feature ;-). This is a band-aid modelled after what builtin/clean.c does to the returned list from fill_directory(), and it seems to do its job, but I am quite unhappy about it. The function fill_directory() already takes a pathspec, albeit in the degenerate "const char **" form. Why does its output need further filtering? builtin/grep.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/builtin/grep.c b/builtin/grep.c index c3af876..5afee2f 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -626,6 +626,10 @@ static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec) fill_directory(&dir, pathspec->raw); for (i = 0; i < dir.nr; i++) { + const char *name = dir.entries[i]->name; + int namelen = strlen(name); + if (!match_pathspec_depth(pathspec, name, namelen, 0, NULL)) + continue; hit |= grep_file(opt, dir.entries[i]->name); if (hit && opt->status_only) break; ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: grep --no-index and pathspec 2011-02-11 21:37 ` Junio C Hamano @ 2011-02-12 8:14 ` Nguyen Thai Ngoc Duy 2011-02-12 8:26 ` Junio C Hamano 0 siblings, 1 reply; 8+ messages in thread From: Nguyen Thai Ngoc Duy @ 2011-02-12 8:14 UTC (permalink / raw) To: Junio C Hamano; +Cc: Michael J Gruber, Lars Noschinski, git 2011/2/12 Junio C Hamano <gitster@pobox.com>: > This is a band-aid modelled after what builtin/clean.c does to the > returned list from fill_directory(), and it seems to do its job, but I am > quite unhappy about it. > > The function fill_directory() already takes a pathspec, albeit in the > degenerate "const char **" form. Why does its output need further > filtering? Because it was designed so? Quotes from 9fc42d6 (Optimize directory listing with pathspec limiter. - 2007-03-30), which added simplify_away(), the function that does pathspec filtering for fill_directory(): NOTE! This does *not* obviate the need for the caller to do the *exact* pathspec match later. It's a first-level filter on "read_directory()", but it does not do the full pathspec thing. Maybe it should. But in the meantime, builtin-add.c really does need to do first read_directory(dir, .., pathspec); if (pathspec) prune_directory(dir, pathspec, baselen); ie the "prune_directory()" part will do the *exact* pathspec pruning, while the "read_directory()" will use the pathspec just to do some quick high-level pruning of the directories it will recurse into. > @@ -626,6 +626,10 @@ static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec) > > fill_directory(&dir, pathspec->raw); > for (i = 0; i < dir.nr; i++) { > + const char *name = dir.entries[i]->name; > + int namelen = strlen(name); > + if (!match_pathspec_depth(pathspec, name, namelen, 0, NULL)) > + continue; > hit |= grep_file(opt, dir.entries[i]->name); > if (hit && opt->status_only) > break; Looks good. We could move prune_directory() from builtin/add.c to dir.c and use it here, but the gain is nothing (except noticing people some pathspecs do not match any). -- Duy ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: grep --no-index and pathspec 2011-02-12 8:14 ` Nguyen Thai Ngoc Duy @ 2011-02-12 8:26 ` Junio C Hamano 2011-02-12 8:39 ` Nguyen Thai Ngoc Duy 0 siblings, 1 reply; 8+ messages in thread From: Junio C Hamano @ 2011-02-12 8:26 UTC (permalink / raw) To: Nguyen Thai Ngoc Duy; +Cc: Michael J Gruber, Lars Noschinski, git Nguyen Thai Ngoc Duy <pclouds@gmail.com> writes: > 2011/2/12 Junio C Hamano <gitster@pobox.com>: >> >> The function fill_directory() already takes a pathspec, albeit in the >> degenerate "const char **" form. Why does its output need further >> filtering? > > Because it was designed so? Quotes from 9fc42d6 (Optimize directory > listing with pathspec limiter. - 2007-03-30), which added > simplify_away(), the function that does pathspec filtering for > fill_directory(): > > NOTE! This does *not* obviate the need for the caller to do the *exact* > pathspec match later. It's a first-level filter on "read_directory()", but > it does not do the full pathspec thing. Maybe it should. But in the > meantime,... I was around back then, so I know how the code came about ;-) The pieces used in the pathspec limiting logic have been restructured well enough that I suspect it may now be feasible for us to revisit the "Maybe it should" part in the above quote. Thanks to nd/struct-pathspec topic, I think we are already half-way there. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: grep --no-index and pathspec 2011-02-12 8:26 ` Junio C Hamano @ 2011-02-12 8:39 ` Nguyen Thai Ngoc Duy 0 siblings, 0 replies; 8+ messages in thread From: Nguyen Thai Ngoc Duy @ 2011-02-12 8:39 UTC (permalink / raw) To: Junio C Hamano; +Cc: Michael J Gruber, Lars Noschinski, git On Sat, Feb 12, 2011 at 3:26 PM, Junio C Hamano <gitster@pobox.com> wrote: > Nguyen Thai Ngoc Duy <pclouds@gmail.com> writes: >> NOTE! This does *not* obviate the need for the caller to do the *exact* >> pathspec match later. It's a first-level filter on "read_directory()", but >> it does not do the full pathspec thing. Maybe it should. But in the >> meantime,... > > I was around back then, so I know how the code came about ;-) > > The pieces used in the pathspec limiting logic have been restructured well > enough that I suspect it may now be feasible for us to revisit the "Maybe > it should" part in the above quote. Thanks to nd/struct-pathspec topic, I > think we are already half-way there. I was around too, just oblivious about things. I can look into that. Need to think a bit how to save what pathspecs are "seen", so that prune_directory() in builtin/add.c can be dropped. -- Duy ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2011-02-12 8:40 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-02-11 8:59 grep --no-index and pathspec Lars Noschinski 2011-02-11 15:04 ` Michael J Gruber 2011-02-11 15:06 ` [PATCH] grep.txt: document pathspec for --no-index Michael J Gruber 2011-02-11 18:27 ` grep --no-index and pathspec Junio C Hamano 2011-02-11 21:37 ` Junio C Hamano 2011-02-12 8:14 ` Nguyen Thai Ngoc Duy 2011-02-12 8:26 ` Junio C Hamano 2011-02-12 8:39 ` Nguyen Thai Ngoc Duy
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.