| #!/bin/sh | 
 |  | 
 | test_description='git grep --open-files-in-pager | 
 | ' | 
 |  | 
 | . ./test-lib.sh | 
 | . "$TEST_DIRECTORY"/lib-pager.sh | 
 | unset PAGER GIT_PAGER | 
 |  | 
 | test_expect_success 'setup' ' | 
 | 	test_commit initial grep.h " | 
 | enum grep_pat_token { | 
 | 	GREP_PATTERN, | 
 | 	GREP_PATTERN_HEAD, | 
 | 	GREP_PATTERN_BODY, | 
 | 	GREP_AND, | 
 | 	GREP_OPEN_PAREN, | 
 | 	GREP_CLOSE_PAREN, | 
 | 	GREP_NOT, | 
 | 	GREP_OR, | 
 | };" && | 
 |  | 
 | 	test_commit add-user revision.c " | 
 | 	} | 
 | 	if (seen_dashdash) | 
 | 		read_pathspec_from_stdin(revs, &sb, prune); | 
 | 	strbuf_release(&sb); | 
 | } | 
 |  | 
 | static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what) | 
 | { | 
 | 	append_grep_pattern(&revs->grep_filter, ptn, \"command line\", 0, what); | 
 | " && | 
 |  | 
 | 	mkdir subdir && | 
 | 	test_commit subdir subdir/grep.c "enum grep_pat_token" && | 
 |  | 
 | 	test_commit uninteresting unrelated "hello, world" && | 
 |  | 
 | 	echo GREP_PATTERN >untracked | 
 | ' | 
 |  | 
 | test_expect_success SIMPLEPAGER 'git grep -O' ' | 
 | 	cat >$less <<-\EOF && | 
 | 	#!/bin/sh | 
 | 	printf "%s\n" "$@" >pager-args | 
 | 	EOF | 
 | 	chmod +x $less && | 
 | 	cat >expect.less <<-\EOF && | 
 | 	+/*GREP_PATTERN | 
 | 	grep.h | 
 | 	EOF | 
 | 	echo grep.h >expect.notless && | 
 | 	>empty && | 
 |  | 
 | 	PATH=.:$PATH git grep -O GREP_PATTERN >out && | 
 | 	{ | 
 | 		test_cmp expect.less pager-args || | 
 | 		test_cmp expect.notless pager-args | 
 | 	} && | 
 | 	test_cmp empty out | 
 | ' | 
 |  | 
 | test_expect_success 'git grep -O --cached' ' | 
 | 	test_must_fail git grep --cached -O GREP_PATTERN >out 2>msg && | 
 | 	test_i18ngrep open-files-in-pager msg | 
 | ' | 
 |  | 
 | test_expect_success 'git grep -O --no-index' ' | 
 | 	rm -f expect.less pager-args out && | 
 | 	cat >expect <<-\EOF && | 
 | 	grep.h | 
 | 	untracked | 
 | 	EOF | 
 | 	>empty && | 
 |  | 
 | 	( | 
 | 		GIT_PAGER='\''printf "%s\n" >pager-args'\'' && | 
 | 		export GIT_PAGER && | 
 | 		git grep --no-index -O GREP_PATTERN >out | 
 | 	) && | 
 | 	test_cmp expect pager-args && | 
 | 	test_cmp empty out | 
 | ' | 
 |  | 
 | test_expect_success 'setup: fake "less"' ' | 
 | 	cat >less <<-\EOF && | 
 | 	#!/bin/sh | 
 | 	printf "%s\n" "$@" >actual | 
 | 	EOF | 
 | 	chmod +x less | 
 | ' | 
 |  | 
 | test_expect_success 'git grep -O jumps to line in less' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	+/*GREP_PATTERN | 
 | 	grep.h | 
 | 	EOF | 
 | 	>empty && | 
 |  | 
 | 	GIT_PAGER=./less git grep -O GREP_PATTERN >out && | 
 | 	test_cmp expect actual && | 
 | 	test_cmp empty out && | 
 |  | 
 | 	git grep -O./less GREP_PATTERN >out2 && | 
 | 	test_cmp expect actual && | 
 | 	test_cmp empty out2 | 
 | ' | 
 |  | 
 | test_expect_success 'modified file' ' | 
 | 	rm -f actual && | 
 | 	cat >expect <<-\EOF && | 
 | 	+/*enum grep_pat_token | 
 | 	grep.h | 
 | 	revision.c | 
 | 	subdir/grep.c | 
 | 	unrelated | 
 | 	EOF | 
 | 	>empty && | 
 |  | 
 | 	echo "enum grep_pat_token" >unrelated && | 
 | 	test_when_finished "git checkout HEAD unrelated" && | 
 | 	GIT_PAGER=./less git grep -F -O "enum grep_pat_token" >out && | 
 | 	test_cmp expect actual && | 
 | 	test_cmp empty out | 
 | ' | 
 |  | 
 | test_expect_success 'copes with color settings' ' | 
 | 	rm -f actual && | 
 | 	echo grep.h >expect && | 
 | 	test_config color.grep always && | 
 | 	test_config color.grep.filename yellow && | 
 | 	test_config color.grep.separator green && | 
 | 	git grep -O'\''printf "%s\n" >actual'\'' GREP_AND && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'run from subdir' ' | 
 | 	rm -f actual && | 
 | 	echo grep.c >expect && | 
 | 	>empty && | 
 |  | 
 | 	( | 
 | 		cd subdir && | 
 | 		export GIT_PAGER && | 
 | 		GIT_PAGER='\''printf "%s\n" >../args'\'' && | 
 | 		git grep -O "enum grep_pat_token" >../out && | 
 | 		git grep -O"pwd >../dir; :" "enum grep_pat_token" >../out2 | 
 | 	) && | 
 | 	case $(cat dir) in | 
 | 	*subdir) | 
 | 		: good | 
 | 		;; | 
 | 	*) | 
 | 		false | 
 | 		;; | 
 | 	esac && | 
 | 	test_cmp expect args && | 
 | 	test_cmp empty out && | 
 | 	test_cmp empty out2 | 
 | ' | 
 |  | 
 | test_done |