* 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).