| #!/bin/sh | 
 |  | 
 | test_description='log --grep/--author/--regexp-ignore-case/-S/-G' | 
 | . ./test-lib.sh | 
 |  | 
 | test_log () { | 
 | 	expect=$1 | 
 | 	kind=$2 | 
 | 	needle=$3 | 
 | 	shift 3 | 
 | 	rest=$@ | 
 |  | 
 | 	case $kind in | 
 | 	--*) | 
 | 		opt=$kind=$needle | 
 | 		;; | 
 | 	*) | 
 | 		opt=$kind$needle | 
 | 		;; | 
 | 	esac | 
 | 	case $expect in | 
 | 	expect_nomatch) | 
 | 		match=nomatch | 
 | 		;; | 
 | 	*) | 
 | 		match=match | 
 | 		;; | 
 | 	esac | 
 |  | 
 | 	test_expect_success "log $kind${rest:+ $rest} ($match)" " | 
 | 		git log $rest $opt --format=%H >actual && | 
 | 		test_cmp $expect actual | 
 | 	" | 
 | } | 
 |  | 
 | # test -i and --regexp-ignore-case and expect both to behave the same way | 
 | test_log_icase () { | 
 | 	test_log $@ --regexp-ignore-case | 
 | 	test_log $@ -i | 
 | } | 
 |  | 
 | test_expect_success setup ' | 
 | 	>expect_nomatch && | 
 |  | 
 | 	>file && | 
 | 	git add file && | 
 | 	test_tick && | 
 | 	git commit -m initial && | 
 | 	git rev-parse --verify HEAD >expect_initial && | 
 |  | 
 | 	echo Picked >file && | 
 | 	git add file && | 
 | 	test_tick && | 
 | 	git commit --author="Another Person <another@example.com>" -m second && | 
 | 	git rev-parse --verify HEAD >expect_second | 
 | ' | 
 |  | 
 | test_expect_success 'usage' ' | 
 | 	test_expect_code 129 git log -S 2>err && | 
 | 	test_i18ngrep "switch.*requires a value" err && | 
 |  | 
 | 	test_expect_code 129 git log -G 2>err && | 
 | 	test_i18ngrep "switch.*requires a value" err && | 
 |  | 
 | 	test_expect_code 128 git log -Gregex -Sstring 2>err && | 
 | 	grep "cannot be used together" err && | 
 |  | 
 | 	test_expect_code 128 git log -Gregex --find-object=HEAD 2>err && | 
 | 	grep "cannot be used together" err && | 
 |  | 
 | 	test_expect_code 128 git log -Sstring --find-object=HEAD 2>err && | 
 | 	grep "cannot be used together" err && | 
 |  | 
 | 	test_expect_code 128 git log --pickaxe-all --find-object=HEAD 2>err && | 
 | 	grep "cannot be used together" err | 
 | ' | 
 |  | 
 | test_expect_success 'usage: --pickaxe-regex' ' | 
 | 	test_expect_code 128 git log -Gregex --pickaxe-regex 2>err && | 
 | 	grep "cannot be used together" err | 
 | ' | 
 |  | 
 | test_expect_success 'usage: --no-pickaxe-regex' ' | 
 | 	cat >expect <<-\EOF && | 
 | 	fatal: unrecognized argument: --no-pickaxe-regex | 
 | 	EOF | 
 |  | 
 | 	test_expect_code 128 git log -Sstring --no-pickaxe-regex 2>actual && | 
 | 	test_cmp expect actual && | 
 |  | 
 | 	test_expect_code 128 git log -Gstring --no-pickaxe-regex 2>err && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_log	expect_initial	--grep initial | 
 | test_log	expect_nomatch	--grep InItial | 
 | test_log_icase	expect_initial	--grep InItial | 
 | test_log_icase	expect_nomatch	--grep initail | 
 |  | 
 | test_log	expect_second	--author Person | 
 | test_log	expect_nomatch	--author person | 
 | test_log_icase	expect_second	--author person | 
 | test_log_icase	expect_nomatch	--author spreon | 
 |  | 
 | test_log	expect_nomatch	-G picked | 
 | test_log	expect_second	-G Picked | 
 | test_log_icase	expect_nomatch	-G pickle | 
 | test_log_icase	expect_second	-G picked | 
 |  | 
 | test_expect_success 'log -G --textconv (missing textconv tool)' ' | 
 | 	echo "* diff=test" >.gitattributes && | 
 | 	test_must_fail git -c diff.test.textconv=missing log -Gfoo && | 
 | 	rm .gitattributes | 
 | ' | 
 |  | 
 | test_expect_success 'log -G --no-textconv (missing textconv tool)' ' | 
 | 	echo "* diff=test" >.gitattributes && | 
 | 	git -c diff.test.textconv=missing log -Gfoo --no-textconv >actual && | 
 | 	test_cmp expect_nomatch actual && | 
 | 	rm .gitattributes | 
 | ' | 
 |  | 
 | test_log	expect_nomatch	-S picked | 
 | test_log	expect_second	-S Picked | 
 | test_log_icase	expect_second	-S picked | 
 | test_log_icase	expect_nomatch	-S pickle | 
 |  | 
 | test_log	expect_nomatch	-S p.cked --pickaxe-regex | 
 | test_log	expect_second	-S P.cked --pickaxe-regex | 
 | test_log_icase	expect_second	-S p.cked --pickaxe-regex | 
 | test_log_icase	expect_nomatch	-S p.ckle --pickaxe-regex | 
 |  | 
 | test_expect_success 'log -S --textconv (missing textconv tool)' ' | 
 | 	echo "* diff=test" >.gitattributes && | 
 | 	test_must_fail git -c diff.test.textconv=missing log -Sfoo && | 
 | 	rm .gitattributes | 
 | ' | 
 |  | 
 | test_expect_success 'log -S --no-textconv (missing textconv tool)' ' | 
 | 	echo "* diff=test" >.gitattributes && | 
 | 	git -c diff.test.textconv=missing log -Sfoo --no-textconv >actual && | 
 | 	test_cmp expect_nomatch actual && | 
 | 	rm .gitattributes | 
 | ' | 
 |  | 
 | test_expect_success 'setup log -[GS] plain & regex' ' | 
 | 	test_create_repo GS-plain && | 
 | 	test_commit -C GS-plain --append A data.txt "a" && | 
 | 	test_commit -C GS-plain --append B data.txt "a a" && | 
 | 	test_commit -C GS-plain --append C data.txt "b" && | 
 | 	test_commit -C GS-plain --append D data.txt "[b]" && | 
 | 	test_commit -C GS-plain E data.txt "" && | 
 |  | 
 | 	# We also include E, the deletion commit | 
 | 	git -C GS-plain log --grep="[ABE]" >A-to-B-then-E-log && | 
 | 	git -C GS-plain log --grep="[CDE]" >C-to-D-then-E-log && | 
 | 	git -C GS-plain log --grep="[DE]" >D-then-E-log && | 
 | 	git -C GS-plain log >full-log | 
 | ' | 
 |  | 
 | test_expect_success 'log -G trims diff new/old [-+]' ' | 
 | 	git -C GS-plain log -G"[+-]a" >log && | 
 | 	test_must_be_empty log && | 
 | 	git -C GS-plain log -G"^a" >log && | 
 | 	test_cmp log A-to-B-then-E-log | 
 | ' | 
 |  | 
 | test_expect_success 'log -S<pat> is not a regex, but -S<pat> --pickaxe-regex is' ' | 
 | 	git -C GS-plain log -S"a" >log && | 
 | 	test_cmp log A-to-B-then-E-log && | 
 |  | 
 | 	git -C GS-plain log -S"[a]" >log && | 
 | 	test_must_be_empty log && | 
 |  | 
 | 	git -C GS-plain log -S"[a]" --pickaxe-regex >log && | 
 | 	test_cmp log A-to-B-then-E-log && | 
 |  | 
 | 	git -C GS-plain log -S"[b]" >log && | 
 | 	test_cmp log D-then-E-log && | 
 |  | 
 | 	git -C GS-plain log -S"[b]" --pickaxe-regex >log && | 
 | 	test_cmp log C-to-D-then-E-log | 
 | ' | 
 |  | 
 | test_expect_success 'setup log -[GS] binary & --text' ' | 
 | 	test_create_repo GS-bin-txt && | 
 | 	test_commit -C GS-bin-txt --printf A data.bin "a\na\0a\n" && | 
 | 	test_commit -C GS-bin-txt --append --printf B data.bin "a\na\0a\n" && | 
 | 	test_commit -C GS-bin-txt C data.bin "" && | 
 | 	git -C GS-bin-txt log >full-log | 
 | ' | 
 |  | 
 | test_expect_success 'log -G ignores binary files' ' | 
 | 	git -C GS-bin-txt log -Ga >log && | 
 | 	test_must_be_empty log | 
 | ' | 
 |  | 
 | test_expect_success 'log -G looks into binary files with -a' ' | 
 | 	git -C GS-bin-txt log -a -Ga >log && | 
 | 	test_cmp log full-log | 
 | ' | 
 |  | 
 | test_expect_success 'log -G looks into binary files with textconv filter' ' | 
 | 	test_when_finished "rm GS-bin-txt/.gitattributes" && | 
 | 	( | 
 | 		cd GS-bin-txt && | 
 | 		echo "* diff=bin" >.gitattributes && | 
 | 		git -c diff.bin.textconv=cat log -Ga >../log | 
 | 	) && | 
 | 	test_cmp log full-log | 
 | ' | 
 |  | 
 | test_expect_success 'log -S looks into binary files' ' | 
 | 	git -C GS-bin-txt log -Sa >log && | 
 | 	test_cmp log full-log | 
 | ' | 
 |  | 
 | test_expect_success 'log -S --pickaxe-regex looks into binary files' ' | 
 | 	git -C GS-bin-txt log --pickaxe-regex -Sa >log && | 
 | 	test_cmp log full-log && | 
 |  | 
 | 	git -C GS-bin-txt log --pickaxe-regex -S"[a]" >log && | 
 | 	test_cmp log full-log | 
 | ' | 
 |  | 
 | test_done |