From: Jonathan Nieder <jrnieder@xxxxxxxxx> If git grep --no-index is to be a general-purpose replacement for standard grep, then it should work even for examining the content of a .git directory. The current implementation has some problems: * .git/info/exclude is honored though it shouldn’t be * when run from within a .git directory, grep --no-index searches the entire .git directory instead of just directories below the current working directory. The last few tests (which demonstrate that grep --no-index looks for .git/info/exclude even when no repository is involved) are by Duy. Any bugs in the other tests are my fault. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- The original version. Good thing anyway, with or without tp/setup series. t/t7810-grep.sh | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 116 insertions(+), 0 deletions(-) diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh index 8a63227..7329433 100755 --- a/t/t7810-grep.sh +++ b/t/t7810-grep.sh @@ -494,6 +494,98 @@ test_expect_success 'inside git repository but with --no-index' ' ) ' +test_expect_success 'set up bare repository' ' + + rm -fr bare && + mkdir -p bare/basis/sub && + echo hello >bare/basis/file1 && + echo world >bare/basis/sub/file2 && + echo ".*o*" >bare/basis/.gitignore && + ( + cd bare/basis && + git init && + git ls-files --other | git update-index --add --stdin && + tree=$(git write-tree) && + commit=$(printf "basis\n" | git commit-tree "$tree") && + git update-ref -m init refs/heads/master "$commit" && + git update-index --refresh && + git diff-index --exit-code HEAD + ) && + git clone --no-checkout --bare bare/basis bare/d.git && + mkdir -p bare/d.git/sub && + echo olleh >bare/d.git/fich1 && + echo dlrow >bare/d.git/sub/file2 && + echo "file2" >bare/d.git/.gitignore && + echo "o*" >>bare/d.git/.gitignore + { + echo "HEAD:.gitignore:.*o*" && + echo HEAD:file1:hello && + echo HEAD:sub/file2:world + } >bare/expect.full && + : >bare/expect.empty && + echo file2:dlrow >bare/expect.sub +' + +test_expect_success 'in bare repo, grep without --no-index or --cached fails' ' + ( + cd bare/d.git && + test_must_fail git grep o >../actual.plain 2>../actual.msg && + grep "work tree" ../actual.msg && + test_cmp ../expect.empty ../actual.plain && + cd sub && + test_must_fail git grep o >../../actual.sub 2>../../actual.msg && + test_cmp ../../expect.empty ../../actual.sub && + grep "work tree" ../../actual.msg + ) +' + +test_expect_success 'in bare repo, --cached and HEAD ignore working dir' ' + + ( + cd bare/d.git && + test_must_fail git grep --cached o >../actual.cached 2>../actual.msg && + test_cmp ../expect.empty ../actual.cached && + ! grep fatal ../actual.msg && + git grep -e o HEAD >../actual.full && + test_cmp ../expect.full ../actual.full && + cd sub && + test_must_fail git grep o >../../actual.sub 2>../../actual.msg && + test_cmp ../../expect.empty ../../actual.sub && + git grep -e o HEAD >../../actual.full-sub && + test_cmp ../../expect.full ../../actual.full-sub + ) +' + +test_expect_success '--no-index from a bare repository' ' + rm -f bare/d.git/info/exclude && + ( + cd bare/d.git && + git grep --no-index o >../actual.noindex && + grep "^fich1:olleh\$" ../actual.noindex && + grep "^.gitignore:o[*]\$" ../actual.noindex && + ! grep file2 ../actual.noindex + ) +' + +test_expect_failure '--no-index from a subdirectory of a bare repository' ' + ( + cd bare/d.git/sub && + git grep --no-index o >../../actual.sub && + test_cmp ../../expect.sub ../../actual.sub + ) +' + +test_expect_failure '--no-index neglects info/exclude in bare repo' ' + echo "fich1" >bare/d.git/info/exclude && + ( + cd bare/d.git && + git grep --no-index o >../actual.noindex && + grep "^fich1:olleh\$" ../actual.noindex && + grep "^.gitignore:o[*]\$" ../actual.noindex && + ! grep file2 ../actual.noindex + ) +' + test_expect_success 'setup double-dash tests' ' cat >double-dash <<EOF && -- @@ -527,4 +619,28 @@ test_expect_success 'grep -e -- -- path' ' test_cmp expected actual ' +test_expect_success 'Setup fake .git' ' + cd t && + GIT_CEILING_DIRECTORIES="`pwd`" && + export GIT_CEILING_DIRECTORIES && + cd a && + mkdir -p .git/info && + cd ../.. + +' + +test_expect_failure 'Ignore fake .git/info/exclude' ' + ( + cd t/a && + echo v > .git/info/exclude && + git grep --no-index vvv . && + rm .git/info/exclude + ) +' + +test_expect_success 'Unsetup fake .git' ' + rm -rf t/a && + unset GIT_CEILING_DIRECTORIES +' + test_done -- 1.7.1.rc1.69.g24c2f7 -- 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