Jeff King <p...@peff.net> 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 <dtur...@twopensource.com>
> Signed-off-by: Jeff King <p...@peff.net>
> ---
> 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to