Jeff King <peff@xxxxxxxx> writes: > If we are running "git grep --no-index" outside of a git > repository, we behave roughly like "grep -r", examining all > files in the current directory and its subdirectories. > However, because we use fill_directory() to do the > recursion, it will skip over any directories which look like > sub-repositories. > > For a normal git operation (like "git grep" in a repository) > this makes sense; we do not want to cross the boundary out > of our current repository into a submodule. But for > "--no-index" without a repository, we should look at all > files, including embedded repositories. > > There is one exception, though: we probably should _not_ > descend into ".git" directories. Doing so is inefficient and > unlikely to turn up useful hits. > > This patch drops our use of dir.c's gitlink-detection, but > we do still avoid ".git". That makes us more like tools such > as "ack" or "ag", which also know to avoid cruft in .git. > > As a bonus, this also drops our usage of the ref code > when we are outside of a repository, making the transition > to pluggable ref backends cleaner. > > Based-on-a-patch-by: David Turner <dturner@xxxxxxxxxxxxxxxx> > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > I hope the reasoning above makes sense. My ulterior motive is the > "bonus", but I really think the new behavior is what people would expect > (i.e., that "git grep --no-index" is basically a replacement for "ack", > etc). I agree with --no-index part, but the caller of grep_directory() is "either no-index, or untracked". I am not sure if the latter wants this new behaviour. > > builtin/grep.c | 1 + > t/t7810-grep.sh | 27 +++++++++++++++++++++++++++ > 2 files changed, 28 insertions(+) > > diff --git a/builtin/grep.c b/builtin/grep.c > index aa7435f..0636cd7 100644 > --- a/builtin/grep.c > +++ b/builtin/grep.c > @@ -528,6 +528,7 @@ static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec, > int i, hit = 0; > > memset(&dir, 0, sizeof(dir)); > + dir.flags |= DIR_NO_GITLINKS; > if (exc_std) > setup_standard_excludes(&dir); > > diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh > index b540944..1e72971 100755 > --- a/t/t7810-grep.sh > +++ b/t/t7810-grep.sh > @@ -905,6 +905,33 @@ test_expect_success 'inside git repository but with --no-index' ' > ) > ' > > +test_expect_success 'grep --no-index descends into repos, but not .git' ' > + rm -fr non && > + mkdir -p non/git && > + ( > + GIT_CEILING_DIRECTORIES="$(pwd)/non" && > + export GIT_CEILING_DIRECTORIES && > + cd non/git && > + > + echo magic >file && > + git init repo && > + ( > + cd repo && > + echo magic >file && > + git add file && > + git commit -m foo && > + echo magic >.git/file > + ) && > + > + cat >expect <<-\EOF && > + file > + repo/file > + EOF > + git grep -l --no-index magic >actual && > + test_cmp expect actual > + ) > +' > + > test_expect_success 'setup double-dash tests' ' > cat >double-dash <<EOF && > -- -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html