diff options
Diffstat (limited to '')
-rwxr-xr-x | t/t5571-pre-push-hook.sh | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/t/t5571-pre-push-hook.sh b/t/t5571-pre-push-hook.sh new file mode 100755 index 0000000..448134c --- /dev/null +++ b/t/t5571-pre-push-hook.sh @@ -0,0 +1,142 @@ +#!/bin/sh + +test_description='check pre-push hooks' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +TEST_PASSES_SANITIZE_LEAK=true +. ./test-lib.sh + +test_expect_success 'setup' ' + test_hook pre-push <<-\EOF && + cat >actual + EOF + + git config push.default upstream && + git init --bare repo1 && + git remote add parent1 repo1 && + test_commit one && + cat >expect <<-EOF && + HEAD $(git rev-parse HEAD) refs/heads/foreign $(test_oid zero) + EOF + + test_when_finished "rm actual" && + git push parent1 HEAD:foreign && + test_cmp expect actual +' + +COMMIT1="$(git rev-parse HEAD)" +export COMMIT1 + +test_expect_success 'push with failing hook' ' + test_hook pre-push <<-\EOF && + cat >actual && + exit 1 + EOF + + test_commit two && + cat >expect <<-EOF && + HEAD $(git rev-parse HEAD) refs/heads/main $(test_oid zero) + EOF + + test_when_finished "rm actual" && + test_must_fail git push parent1 HEAD && + test_cmp expect actual +' + +test_expect_success '--no-verify bypasses hook' ' + git push --no-verify parent1 HEAD && + test_path_is_missing actual +' + +COMMIT2="$(git rev-parse HEAD)" +export COMMIT2 + +test_expect_success 'push with hook' ' + test_hook --setup pre-push <<-\EOF && + echo "$1" >actual + echo "$2" >>actual + cat >>actual + EOF + + cat >expect <<-EOF && + parent1 + repo1 + refs/heads/main $COMMIT2 refs/heads/foreign $COMMIT1 + EOF + + git push parent1 main:foreign && + test_cmp expect actual +' + +test_expect_success 'add a branch' ' + git checkout -b other parent1/foreign && + test_commit three +' + +COMMIT3="$(git rev-parse HEAD)" +export COMMIT3 + +test_expect_success 'push to default' ' + cat >expect <<-EOF && + parent1 + repo1 + refs/heads/other $COMMIT3 refs/heads/foreign $COMMIT2 + EOF + git push && + test_cmp expect actual +' + +test_expect_success 'push non-branches' ' + cat >expect <<-EOF && + parent1 + repo1 + refs/tags/one $COMMIT1 refs/tags/tag1 $ZERO_OID + HEAD~ $COMMIT2 refs/heads/prev $ZERO_OID + EOF + + git push parent1 one:tag1 HEAD~:refs/heads/prev && + test_cmp expect actual +' + +test_expect_success 'push delete' ' + cat >expect <<-EOF && + parent1 + repo1 + (delete) $ZERO_OID refs/heads/prev $COMMIT2 + EOF + + git push parent1 :prev && + test_cmp expect actual +' + +test_expect_success 'push to URL' ' + cat >expect <<-EOF && + repo1 + repo1 + HEAD $COMMIT3 refs/heads/other $ZERO_OID + EOF + + git push repo1 HEAD && + test_cmp expect actual +' + +test_expect_success 'set up many-ref tests' ' + { + nr=1000 && + while test $nr -lt 2000 + do + nr=$(( $nr + 1 )) && + echo "create refs/heads/b/$nr $COMMIT3" || return 1 + done + } | git update-ref --stdin +' + +test_expect_success 'sigpipe does not cause pre-push hook failure' ' + test_hook --clobber pre-push <<-\EOF && + exit 0 + EOF + git push parent1 "refs/heads/b/*:refs/heads/b/*" +' + +test_done |