@@ -190,6 +190,14 @@ test_expect_success 'subtest: test_todo allowed arguments' '
"test_todo test_must_fail git --version"
test_expect_success "test_todo test_must_fail rejects bad command" \
"test_todo test_must_fail test_true"
+ test_expect_success "test_todo accepts grep" \
+ "echo a >a && test_todo grep b <a"
+ test_expect_success "test_todo accepts ! grep" \
+ "echo a >a && test_todo ! grep -v b <a"
+ test_expect_success "test_todo detects grep errors" \
+ "echo a >a && test_todo grep --invalid-option b <a"
+ test_expect_success "test_todo detects ! grep errors" \
+ "echo a >a && test_todo ! grep --invalid-option -v b <a"
test_done
EOF
check_sub_test_lib_test acceptable-test-todo <<-\EOF
@@ -199,9 +207,15 @@ test_expect_success 'subtest: test_todo allowed arguments' '
> not ok 3 - test_todo test_must_fail accepts good command # TODO known breakage
> not ok 4 - test_todo test_must_fail rejects bad command
> # test_todo test_must_fail test_true
- > # still have 2 known breakage(s)
- > # failed 2 among remaining 2 test(s)
- > 1..4
+ > not ok 5 - test_todo accepts grep # TODO known breakage
+ > not ok 6 - test_todo accepts ! grep # TODO known breakage
+ > not ok 7 - test_todo detects grep errors
+ > # echo a >a && test_todo grep --invalid-option b <a
+ > not ok 8 - test_todo detects ! grep errors
+ > # echo a >a && test_todo ! grep --invalid-option -v b <a
+ > # still have 4 known breakage(s)
+ > # failed 4 among remaining 4 test(s)
+ > 1..8
EOF
'
@@ -577,7 +577,7 @@ test_expect_success '--continue respects -x in first commit in multi-pick' '
grep "cherry picked from.*$picked" msg
'
-test_expect_failure '--signoff is automatically propagated to resolved conflict' '
+test_expect_success '--signoff is automatically propagated to resolved conflict' '
pristine_detach initial &&
test_expect_code 1 git cherry-pick --signoff base..anotherpick &&
echo "c" >foo &&
@@ -591,11 +591,11 @@ test_expect_failure '--signoff is automatically propagated to resolved conflict'
git cat-file commit HEAD~3 >initial_msg &&
! grep "Signed-off-by:" initial_msg &&
grep "Signed-off-by:" unrelatedpick_msg &&
- ! grep "Signed-off-by:" picked_msg &&
+ test_todo ! grep "Signed-off-by:" picked_msg &&
grep "Signed-off-by:" anotherpick_msg
'
-test_expect_failure '--signoff dropped for implicit commit of resolution, multi-pick case' '
+test_expect_success '--signoff dropped for implicit commit of resolution, multi-pick case' '
pristine_detach initial &&
test_must_fail git cherry-pick -s picked anotherpick &&
echo c >foo &&
@@ -605,10 +605,10 @@ test_expect_failure '--signoff dropped for implicit commit of resolution, multi-
git diff --exit-code HEAD &&
test_cmp_rev initial HEAD^^ &&
git cat-file commit HEAD^ >msg &&
- ! grep Signed-off-by: msg
+ test_todo ! grep Signed-off-by: msg
'
-test_expect_failure 'sign-off needs to be reaffirmed after conflict resolution, single-pick case' '
+test_expect_success 'sign-off needs to be reaffirmed after conflict resolution, single-pick case' '
pristine_detach initial &&
test_must_fail git cherry-pick -s picked &&
echo c >foo &&
@@ -618,7 +618,7 @@ test_expect_failure 'sign-off needs to be reaffirmed after conflict resolution,
git diff --exit-code HEAD &&
test_cmp_rev initial HEAD^ &&
git cat-file commit HEAD >msg &&
- ! grep Signed-off-by: msg
+ test_todo ! grep Signed-off-by: msg
'
test_expect_success 'malformed instruction sheet 1' '
@@ -165,12 +165,12 @@ test_expect_success 'additional command line cc (ascii)' '
grep "^ *S E Cipient <scipient@example.com>\$" hdrs5
'
-test_expect_failure 'additional command line cc (rfc822)' '
+test_expect_success 'additional command line cc (rfc822)' '
git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" &&
git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout main..side >patch5 &&
sed -e "/^\$/q" patch5 >hdrs5 &&
grep "^Cc: R E Cipient <rcipient@example.com>,\$" hdrs5 &&
- grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5
+ test_todo grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" hdrs5
'
test_expect_success 'command line headers' '
@@ -195,16 +195,16 @@ test_expect_success 'command line To: header (ascii)' '
grep "^To: R E Cipient <rcipient@example.com>\$" hdrs8
'
-test_expect_failure 'command line To: header (rfc822)' '
+test_expect_success 'command line To: header (rfc822)' '
git format-patch --to="R. E. Cipient <rcipient@example.com>" --stdout main..side >patch8 &&
sed -e "/^\$/q" patch8 >hdrs8 &&
- grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs8
+ test_todo grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs8
'
-test_expect_failure 'command line To: header (rfc2047)' '
+test_expect_success 'command line To: header (rfc2047)' '
git format-patch --to="R Ä Cipient <rcipient@example.com>" --stdout main..side >patch8 &&
sed -e "/^\$/q" patch8 >hdrs8 &&
- grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs8
+ test_todo grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs8
'
test_expect_success 'configuration To: header (ascii)' '
@@ -214,18 +214,18 @@ test_expect_success 'configuration To: header (ascii)' '
grep "^To: R E Cipient <rcipient@example.com>\$" hdrs9
'
-test_expect_failure 'configuration To: header (rfc822)' '
+test_expect_success 'configuration To: header (rfc822)' '
git config format.to "R. E. Cipient <rcipient@example.com>" &&
git format-patch --stdout main..side >patch9 &&
sed -e "/^\$/q" patch9 >hdrs9 &&
- grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs9
+ test_todo grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" hdrs9
'
-test_expect_failure 'configuration To: header (rfc2047)' '
+test_expect_success 'configuration To: header (rfc2047)' '
git config format.to "R Ä Cipient <rcipient@example.com>" &&
git format-patch --stdout main..side >patch9 &&
sed -e "/^\$/q" patch9 >hdrs9 &&
- grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs9
+ test_todo grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" hdrs9
'
# check_patch <patch>: Verify that <patch> looks like a half-sane
@@ -1010,8 +1010,9 @@ list_contains () {
# with env, the env and its corresponding variable settings will be
# stripped before we we test the command being run.
#
-# test_todo() allows any of the assertions beginning test_ such as
-# test_cmp in addition the commands allowed by test_must_fail().
+# test_todo() allows "grep" or any of the assertions beginning test_
+# such as test_cmp in addition the commands allowed by
+# test_must_fail().
test_must_fail_acceptable () {
local name
@@ -1050,9 +1051,21 @@ test_must_fail_acceptable () {
fi
return 1
;;
- test_*)
- test "$name" = "todo"
- return $?
+ grep|test_*)
+ if test "$name" = "todo"
+ then
+ test_todo_command_="$1"
+ return 0
+ fi
+ return 1
+ ;;
+ '!')
+ if test "$name" = "todo" && test "$2" = "grep"
+ then
+ test_todo_command_=grep
+ return 0
+ fi
+ return 1
;;
*)
return 1
@@ -1061,6 +1074,7 @@ test_must_fail_acceptable () {
}
test_must_fail_helper () {
+ test_todo_command_=
test_must_fail_name_="$1"
shift
case "$1" in
@@ -1077,8 +1091,27 @@ test_must_fail_helper () {
echo >&7 "test_$test_must_fail_name_: only 'git' is allowed: $*"
return 1
fi
+ test_invert_exit_code_=
+ if test "$1" = "!"
+ then
+ test_invert_exit_code_=1
+ shift
+ fi
"$@" 2>&7
exit_code=$?
+ if test -n "$test_invert_exit_code_"
+ # We only invert the exit code of grep. An exit code greater
+ # than 1 indicates an error rather than a failed match so
+ # we only want to swap zero and one.
+ then
+ if test $exit_code -eq 0
+ then
+ exit_code=1
+ elif test $exit_code -eq 1
+ then
+ exit_code=0
+ fi
+ fi
if test $exit_code -eq 0 && ! list_contains "$_test_ok" success
then
echo >&4 "test_$test_must_fail_name_: command succeeded: $*"
@@ -1098,6 +1131,15 @@ test_must_fail_helper () {
then
echo >&4 "test_$test_must_fail_name_: valgrind error: $*"
return 1
+ else
+ case "$test_todo_command_" in
+ grep)
+ if test $exit_code -ne 1
+ then
+ echo >&4 "test_todo: $test_todo_command_ error: $*"
+ return 1
+ fi;;
+ esac
fi
return 0
@@ -1116,8 +1158,8 @@ test_must_fail_helper () {
# '
#
# This test will fail if "git foo" fails or err is unexpectedly empty.
-# test_todo can be used with "git" or any of the "test_*" assertions
-# such as test_cmp().
+# test_todo can be used with "git", "grep" or any of the "test_*"
+# assertions such as test_cmp().
test_todo () {
if test "$test_todo_" = "test_expect_failure"