mirror of
https://github.com/git/git
synced 2024-09-17 23:41:33 +00:00
fetch+push tests: use "test_hook" and "test_when_finished" pattern
Change the "t5516-fetch-push.sh" test code to make use of the new "test_hook" helper, and to use "test_when_finished" to have tests clean up their own state, instead of relying on subsequent tests to clean the trash directory. Before this each test would have been responsible for cleaning up after a preceding test (which may or may not have run, e.g. if --run or "GIT_SKIP_TESTS" was used), now each test will instead clean up after itself. In order to use both "test_hook" and "test_when_finished" we need to move them out of sub-shells, which requires some refactoring. While we're at it split up the "push with negotiation" test, now the middle of the test doesn't need to "rm event", and since it delimited two halves that were testing two different things the end-state is easier to read and reason about. While changing these lines make the minor change from "-fr" to "-rf" as the "rm" argument, some of them used it already, it's more common in the test suite, and it leaves the end-state of the file with more consistency. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
003cdf8882
commit
f818f7f725
|
@ -23,13 +23,10 @@ D=$(pwd)
|
||||||
|
|
||||||
mk_empty () {
|
mk_empty () {
|
||||||
repo_name="$1"
|
repo_name="$1"
|
||||||
rm -fr "$repo_name" &&
|
test_when_finished "rm -rf \"$repo_name\"" &&
|
||||||
mkdir "$repo_name" &&
|
test_path_is_missing "$repo_name" &&
|
||||||
(
|
git init "$repo_name" &&
|
||||||
cd "$repo_name" &&
|
git -C "$repo_name" config receive.denyCurrentBranch warn
|
||||||
git init &&
|
|
||||||
git config receive.denyCurrentBranch warn
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mk_test () {
|
mk_test () {
|
||||||
|
@ -58,40 +55,28 @@ mk_test () {
|
||||||
mk_test_with_hooks() {
|
mk_test_with_hooks() {
|
||||||
repo_name=$1
|
repo_name=$1
|
||||||
mk_test "$@" &&
|
mk_test "$@" &&
|
||||||
(
|
test_hook -C "$repo_name" pre-receive <<-'EOF' &&
|
||||||
cd "$repo_name" &&
|
|
||||||
mkdir .git/hooks &&
|
|
||||||
cd .git/hooks &&
|
|
||||||
|
|
||||||
cat >pre-receive <<-'EOF' &&
|
|
||||||
#!/bin/sh
|
|
||||||
cat - >>pre-receive.actual
|
cat - >>pre-receive.actual
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat >update <<-'EOF' &&
|
test_hook -C "$repo_name" update <<-'EOF' &&
|
||||||
#!/bin/sh
|
|
||||||
printf "%s %s %s\n" "$@" >>update.actual
|
printf "%s %s %s\n" "$@" >>update.actual
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat >post-receive <<-'EOF' &&
|
test_hook -C "$repo_name" post-receive <<-'EOF' &&
|
||||||
#!/bin/sh
|
|
||||||
cat - >>post-receive.actual
|
cat - >>post-receive.actual
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat >post-update <<-'EOF' &&
|
test_hook -C "$repo_name" post-update <<-'EOF'
|
||||||
#!/bin/sh
|
|
||||||
for ref in "$@"
|
for ref in "$@"
|
||||||
do
|
do
|
||||||
printf "%s\n" "$ref" >>post-update.actual
|
printf "%s\n" "$ref" >>post-update.actual
|
||||||
done
|
done
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
chmod +x pre-receive update post-receive post-update
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mk_child() {
|
mk_child() {
|
||||||
rm -rf "$2" &&
|
test_when_finished "rm -rf \"$2\"" &&
|
||||||
git clone "$1" "$2"
|
git clone "$1" "$2"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,32 +181,32 @@ grep_wrote () {
|
||||||
grep 'write_pack_file/wrote.*"value":"'$1'"' $2
|
grep 'write_pack_file/wrote.*"value":"'$1'"' $2
|
||||||
}
|
}
|
||||||
|
|
||||||
test_expect_success 'push with negotiation' '
|
test_expect_success 'push without negotiation' '
|
||||||
# Without negotiation
|
|
||||||
mk_empty testrepo &&
|
mk_empty testrepo &&
|
||||||
git push testrepo $the_first_commit:refs/remotes/origin/first_commit &&
|
git push testrepo $the_first_commit:refs/remotes/origin/first_commit &&
|
||||||
test_commit -C testrepo unrelated_commit &&
|
test_commit -C testrepo unrelated_commit &&
|
||||||
git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit &&
|
git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit &&
|
||||||
echo now pushing without negotiation &&
|
test_when_finished "rm event" &&
|
||||||
GIT_TRACE2_EVENT="$(pwd)/event" git -c protocol.version=2 push testrepo refs/heads/main:refs/remotes/origin/main &&
|
GIT_TRACE2_EVENT="$(pwd)/event" git -c protocol.version=2 push testrepo refs/heads/main:refs/remotes/origin/main &&
|
||||||
grep_wrote 5 event && # 2 commits, 2 trees, 1 blob
|
grep_wrote 5 event # 2 commits, 2 trees, 1 blob
|
||||||
|
'
|
||||||
|
|
||||||
# Same commands, but with negotiation
|
test_expect_success 'push with negotiation' '
|
||||||
rm event &&
|
|
||||||
mk_empty testrepo &&
|
mk_empty testrepo &&
|
||||||
git push testrepo $the_first_commit:refs/remotes/origin/first_commit &&
|
git push testrepo $the_first_commit:refs/remotes/origin/first_commit &&
|
||||||
test_commit -C testrepo unrelated_commit &&
|
test_commit -C testrepo unrelated_commit &&
|
||||||
git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit &&
|
git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit &&
|
||||||
|
test_when_finished "rm event" &&
|
||||||
GIT_TRACE2_EVENT="$(pwd)/event" git -c protocol.version=2 -c push.negotiate=1 push testrepo refs/heads/main:refs/remotes/origin/main &&
|
GIT_TRACE2_EVENT="$(pwd)/event" git -c protocol.version=2 -c push.negotiate=1 push testrepo refs/heads/main:refs/remotes/origin/main &&
|
||||||
grep_wrote 2 event # 1 commit, 1 tree
|
grep_wrote 2 event # 1 commit, 1 tree
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'push with negotiation proceeds anyway even if negotiation fails' '
|
test_expect_success 'push with negotiation proceeds anyway even if negotiation fails' '
|
||||||
rm event &&
|
|
||||||
mk_empty testrepo &&
|
mk_empty testrepo &&
|
||||||
git push testrepo $the_first_commit:refs/remotes/origin/first_commit &&
|
git push testrepo $the_first_commit:refs/remotes/origin/first_commit &&
|
||||||
test_commit -C testrepo unrelated_commit &&
|
test_commit -C testrepo unrelated_commit &&
|
||||||
git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit &&
|
git -C testrepo config receive.hideRefs refs/remotes/origin/first_commit &&
|
||||||
|
test_when_finished "rm event" &&
|
||||||
GIT_TEST_PROTOCOL_VERSION=0 GIT_TRACE2_EVENT="$(pwd)/event" \
|
GIT_TEST_PROTOCOL_VERSION=0 GIT_TRACE2_EVENT="$(pwd)/event" \
|
||||||
git -c push.negotiate=1 push testrepo refs/heads/main:refs/remotes/origin/main 2>err &&
|
git -c push.negotiate=1 push testrepo refs/heads/main:refs/remotes/origin/main 2>err &&
|
||||||
grep_wrote 5 event && # 2 commits, 2 trees, 1 blob
|
grep_wrote 5 event && # 2 commits, 2 trees, 1 blob
|
||||||
|
@ -667,7 +652,6 @@ test_expect_success 'push does not update local refs on failure' '
|
||||||
|
|
||||||
mk_test testrepo heads/main &&
|
mk_test testrepo heads/main &&
|
||||||
mk_child testrepo child &&
|
mk_child testrepo child &&
|
||||||
mkdir testrepo/.git/hooks &&
|
|
||||||
echo "#!/no/frobnication/today" >testrepo/.git/hooks/pre-receive &&
|
echo "#!/no/frobnication/today" >testrepo/.git/hooks/pre-receive &&
|
||||||
chmod +x testrepo/.git/hooks/pre-receive &&
|
chmod +x testrepo/.git/hooks/pre-receive &&
|
||||||
(
|
(
|
||||||
|
@ -1329,7 +1313,7 @@ done
|
||||||
|
|
||||||
test_expect_success 'fetch follows tags by default' '
|
test_expect_success 'fetch follows tags by default' '
|
||||||
mk_test testrepo heads/main &&
|
mk_test testrepo heads/main &&
|
||||||
rm -fr src dst &&
|
test_when_finished "rm -rf src" &&
|
||||||
git init src &&
|
git init src &&
|
||||||
(
|
(
|
||||||
cd src &&
|
cd src &&
|
||||||
|
@ -1339,6 +1323,7 @@ test_expect_success 'fetch follows tags by default' '
|
||||||
sed -n "p; s|refs/heads/main$|refs/remotes/origin/main|p" tmp1 |
|
sed -n "p; s|refs/heads/main$|refs/remotes/origin/main|p" tmp1 |
|
||||||
sort -k 3 >../expect
|
sort -k 3 >../expect
|
||||||
) &&
|
) &&
|
||||||
|
test_when_finished "rm -rf dst" &&
|
||||||
git init dst &&
|
git init dst &&
|
||||||
(
|
(
|
||||||
cd dst &&
|
cd dst &&
|
||||||
|
@ -1364,8 +1349,9 @@ test_expect_success 'peeled advertisements are not considered ref tips' '
|
||||||
|
|
||||||
test_expect_success 'pushing a specific ref applies remote.$name.push as refmap' '
|
test_expect_success 'pushing a specific ref applies remote.$name.push as refmap' '
|
||||||
mk_test testrepo heads/main &&
|
mk_test testrepo heads/main &&
|
||||||
rm -fr src dst &&
|
test_when_finished "rm -rf src" &&
|
||||||
git init src &&
|
git init src &&
|
||||||
|
test_when_finished "rm -rf dst" &&
|
||||||
git init --bare dst &&
|
git init --bare dst &&
|
||||||
(
|
(
|
||||||
cd src &&
|
cd src &&
|
||||||
|
@ -1388,8 +1374,9 @@ test_expect_success 'pushing a specific ref applies remote.$name.push as refmap'
|
||||||
|
|
||||||
test_expect_success 'with no remote.$name.push, it is not used as refmap' '
|
test_expect_success 'with no remote.$name.push, it is not used as refmap' '
|
||||||
mk_test testrepo heads/main &&
|
mk_test testrepo heads/main &&
|
||||||
rm -fr src dst &&
|
test_when_finished "rm -rf src" &&
|
||||||
git init src &&
|
git init src &&
|
||||||
|
test_when_finished "rm -rf dst" &&
|
||||||
git init --bare dst &&
|
git init --bare dst &&
|
||||||
(
|
(
|
||||||
cd src &&
|
cd src &&
|
||||||
|
@ -1410,8 +1397,9 @@ test_expect_success 'with no remote.$name.push, it is not used as refmap' '
|
||||||
|
|
||||||
test_expect_success 'with no remote.$name.push, upstream mapping is used' '
|
test_expect_success 'with no remote.$name.push, upstream mapping is used' '
|
||||||
mk_test testrepo heads/main &&
|
mk_test testrepo heads/main &&
|
||||||
rm -fr src dst &&
|
test_when_finished "rm -rf src" &&
|
||||||
git init src &&
|
git init src &&
|
||||||
|
test_when_finished "rm -rf dst" &&
|
||||||
git init --bare dst &&
|
git init --bare dst &&
|
||||||
(
|
(
|
||||||
cd src &&
|
cd src &&
|
||||||
|
@ -1439,8 +1427,9 @@ test_expect_success 'with no remote.$name.push, upstream mapping is used' '
|
||||||
|
|
||||||
test_expect_success 'push does not follow tags by default' '
|
test_expect_success 'push does not follow tags by default' '
|
||||||
mk_test testrepo heads/main &&
|
mk_test testrepo heads/main &&
|
||||||
rm -fr src dst &&
|
test_when_finished "rm -rf src" &&
|
||||||
git init src &&
|
git init src &&
|
||||||
|
test_when_finished "rm -rf dst" &&
|
||||||
git init --bare dst &&
|
git init --bare dst &&
|
||||||
(
|
(
|
||||||
cd src &&
|
cd src &&
|
||||||
|
@ -1462,8 +1451,9 @@ test_expect_success 'push does not follow tags by default' '
|
||||||
|
|
||||||
test_expect_success 'push --follow-tags only pushes relevant tags' '
|
test_expect_success 'push --follow-tags only pushes relevant tags' '
|
||||||
mk_test testrepo heads/main &&
|
mk_test testrepo heads/main &&
|
||||||
rm -fr src dst &&
|
test_when_finished "rm -rf src" &&
|
||||||
git init src &&
|
git init src &&
|
||||||
|
test_when_finished "rm -rf dst" &&
|
||||||
git init --bare dst &&
|
git init --bare dst &&
|
||||||
(
|
(
|
||||||
cd src &&
|
cd src &&
|
||||||
|
@ -1501,9 +1491,9 @@ EOF
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'pushing a tag pushes the tagged object' '
|
test_expect_success 'pushing a tag pushes the tagged object' '
|
||||||
rm -rf dst.git &&
|
|
||||||
blob=$(echo unreferenced | git hash-object -w --stdin) &&
|
blob=$(echo unreferenced | git hash-object -w --stdin) &&
|
||||||
git tag -m foo tag-of-blob $blob &&
|
git tag -m foo tag-of-blob $blob &&
|
||||||
|
test_when_finished "rm -rf dst.git" &&
|
||||||
git init --bare dst.git &&
|
git init --bare dst.git &&
|
||||||
git push dst.git tag-of-blob &&
|
git push dst.git tag-of-blob &&
|
||||||
# the receiving index-pack should have noticed
|
# the receiving index-pack should have noticed
|
||||||
|
@ -1514,7 +1504,7 @@ test_expect_success 'pushing a tag pushes the tagged object' '
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'push into bare respects core.logallrefupdates' '
|
test_expect_success 'push into bare respects core.logallrefupdates' '
|
||||||
rm -rf dst.git &&
|
test_when_finished "rm -rf dst.git" &&
|
||||||
git init --bare dst.git &&
|
git init --bare dst.git &&
|
||||||
git -C dst.git config core.logallrefupdates true &&
|
git -C dst.git config core.logallrefupdates true &&
|
||||||
|
|
||||||
|
@ -1532,7 +1522,7 @@ test_expect_success 'push into bare respects core.logallrefupdates' '
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'fetch into bare respects core.logallrefupdates' '
|
test_expect_success 'fetch into bare respects core.logallrefupdates' '
|
||||||
rm -rf dst.git &&
|
test_when_finished "rm -rf dst.git" &&
|
||||||
git init --bare dst.git &&
|
git init --bare dst.git &&
|
||||||
(
|
(
|
||||||
cd dst.git &&
|
cd dst.git &&
|
||||||
|
@ -1553,6 +1543,7 @@ test_expect_success 'fetch into bare respects core.logallrefupdates' '
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'receive.denyCurrentBranch = updateInstead' '
|
test_expect_success 'receive.denyCurrentBranch = updateInstead' '
|
||||||
|
mk_empty testrepo &&
|
||||||
git push testrepo main &&
|
git push testrepo main &&
|
||||||
(
|
(
|
||||||
cd testrepo &&
|
cd testrepo &&
|
||||||
|
@ -1655,7 +1646,7 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' '
|
||||||
) &&
|
) &&
|
||||||
|
|
||||||
# (5) push into void
|
# (5) push into void
|
||||||
rm -fr void &&
|
test_when_finished "rm -rf void" &&
|
||||||
git init void &&
|
git init void &&
|
||||||
(
|
(
|
||||||
cd void &&
|
cd void &&
|
||||||
|
@ -1677,15 +1668,13 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' '
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'updateInstead with push-to-checkout hook' '
|
test_expect_success 'updateInstead with push-to-checkout hook' '
|
||||||
rm -fr testrepo &&
|
test_when_finished "rm -rf testrepo" &&
|
||||||
git init testrepo &&
|
git init testrepo &&
|
||||||
(
|
git -C testrepo pull .. main &&
|
||||||
cd testrepo &&
|
git -C testrepo reset --hard HEAD^^ &&
|
||||||
git pull .. main &&
|
git -C testrepo tag initial &&
|
||||||
git reset --hard HEAD^^ &&
|
git -C testrepo config receive.denyCurrentBranch updateInstead &&
|
||||||
git tag initial &&
|
test_hook -C testrepo push-to-checkout <<-\EOF &&
|
||||||
git config receive.denyCurrentBranch updateInstead &&
|
|
||||||
write_script .git/hooks/push-to-checkout <<-\EOF
|
|
||||||
echo >&2 updating from $(git rev-parse HEAD)
|
echo >&2 updating from $(git rev-parse HEAD)
|
||||||
echo >&2 updating to "$1"
|
echo >&2 updating to "$1"
|
||||||
|
|
||||||
|
@ -1696,7 +1685,6 @@ test_expect_success 'updateInstead with push-to-checkout hook' '
|
||||||
exit $status
|
exit $status
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
) &&
|
|
||||||
|
|
||||||
# Try pushing into a pristine
|
# Try pushing into a pristine
|
||||||
git push testrepo main &&
|
git push testrepo main &&
|
||||||
|
@ -1739,12 +1727,10 @@ test_expect_success 'updateInstead with push-to-checkout hook' '
|
||||||
) &&
|
) &&
|
||||||
|
|
||||||
# push into void
|
# push into void
|
||||||
rm -fr void &&
|
test_when_finished "rm -rf void" &&
|
||||||
git init void &&
|
git init void &&
|
||||||
(
|
git -C void config receive.denyCurrentBranch updateInstead &&
|
||||||
cd void &&
|
test_hook -C void push-to-checkout <<-\EOF &&
|
||||||
git config receive.denyCurrentBranch updateInstead &&
|
|
||||||
write_script .git/hooks/push-to-checkout <<-\EOF
|
|
||||||
if git rev-parse --quiet --verify HEAD
|
if git rev-parse --quiet --verify HEAD
|
||||||
then
|
then
|
||||||
has_head=yes
|
has_head=yes
|
||||||
|
@ -1767,7 +1753,6 @@ test_expect_success 'updateInstead with push-to-checkout hook' '
|
||||||
exit $status
|
exit $status
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
) &&
|
|
||||||
|
|
||||||
git push void main &&
|
git push void main &&
|
||||||
(
|
(
|
||||||
|
|
Loading…
Reference in a new issue