git/t/t4255-am-submodule.sh
Denton Liu 5b0ac09fb1 lib-submodule-update: pass 'test_must_fail' as an argument
When we run a test helper function in test_submodule_switch_common(), we
sometimes specify a whole helper function as the $command. When we do
this, in some test cases, we just mark the whole function with
`test_must_fail`. However, it's possible that the helper function might
fail earlier or later than expected due to an introduced bug. If this
happens, then the test case will still report as passing but it should
really be marked as failing since it didn't actually display the
intended behaviour.

Instead of invoking `test_must_fail $command`, pass the string
"test_must_fail" as the second argument in case where the git command is
expected to fail.

When $command is a helper function, the parent function calling
test_submodule_switch_common() is test_submodule_switch_func(). For all
test_submodule_switch_func() invocations, increase the granularity of
the argument test helper function by prefixing the git invocation which is
meant to fail with the second argument like this:

	$2 git checkout "$1"

In the other cases, test_submodule_switch() and
test_submodule_forced_switch(), instead of passing in the git command
directly, wrap it using the git_test_func() and pass the git arguments
using the global variable $gitcmd. Unfortunately, since closures aren't
a thing in shell scripts, the global variable is necessary. Another
unfortunate result is that the "git_test_func" will used as the test
case name when $command is printed but it's worth it for the cleaner
code.

Finally, as an added bonus, `test_must_fail` will now only run on git
commands.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-06-24 08:54:18 -07:00

97 lines
2.1 KiB
Bash
Executable file

#!/bin/sh
test_description='git am handling submodules'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-submodule-update.sh
am () {
git format-patch --stdout --ignore-submodules=dirty "..$1" >patch &&
may_only_be_test_must_fail "$2" &&
$2 git am patch
}
test_submodule_switch_func "am"
am_3way () {
git format-patch --stdout --ignore-submodules=dirty "..$1" >patch &&
may_only_be_test_must_fail "$2" &&
$2 git am --3way patch
}
KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1
test_submodule_switch_func "am_3way"
test_expect_success 'setup diff.submodule' '
test_commit one &&
INITIAL=$(git rev-parse HEAD) &&
git init submodule &&
(
cd submodule &&
test_commit two &&
git rev-parse HEAD >../initial-submodule
) &&
git submodule add ./submodule &&
git commit -m first &&
(
cd submodule &&
test_commit three &&
git rev-parse HEAD >../first-submodule
) &&
git add submodule &&
git commit -m second &&
SECOND=$(git rev-parse HEAD) &&
(
cd submodule &&
git mv two.t four.t &&
git commit -m "second submodule" &&
git rev-parse HEAD >../second-submodule
) &&
test_commit four &&
git add submodule &&
git commit --amend --no-edit &&
THIRD=$(git rev-parse HEAD) &&
git submodule update --init
'
run_test() {
START_COMMIT=$1 &&
EXPECT=$2 &&
# Abort any merges in progress: the previous
# test may have failed, and we should clean up.
test_might_fail git am --abort &&
git reset --hard $START_COMMIT &&
rm -f *.patch &&
git format-patch -1 &&
git reset --hard $START_COMMIT^ &&
git submodule update &&
git am *.patch &&
git submodule update &&
git -C submodule rev-parse HEAD >actual &&
test_cmp $EXPECT actual
}
test_expect_success 'diff.submodule unset' '
test_unconfig diff.submodule &&
run_test $SECOND first-submodule
'
test_expect_success 'diff.submodule unset with extra file' '
test_unconfig diff.submodule &&
run_test $THIRD second-submodule
'
test_expect_success 'diff.submodule=log' '
test_config diff.submodule log &&
run_test $SECOND first-submodule
'
test_expect_success 'diff.submodule=log with extra file' '
test_config diff.submodule log &&
run_test $THIRD second-submodule
'
test_done