#!/bin/sh test_description='check pre-push hooks' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh # Setup hook that always succeeds HOOKDIR="$(git rev-parse --git-dir)/hooks" HOOK="$HOOKDIR/pre-push" mkdir -p "$HOOKDIR" write_script "$HOOK" <actual exit 0 EOF test_expect_success 'setup' ' 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 ' write_script "$HOOK" <actual exit 1 EOF COMMIT1="$(git rev-parse HEAD)" export COMMIT1 test_expect_success 'push with failing hook' ' 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 write_script "$HOOK" <<'EOF' echo "$1" >actual echo "$2" >>actual cat >>actual EOF test_expect_success 'push with hook' ' 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' ' echo "exit 0" | write_script "$HOOK" && git push parent1 "refs/heads/b/*:refs/heads/b/*" ' test_done