summaryrefslogtreecommitdiffstats
path: root/t/t5571-pre-push-hook.sh
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xt/t5571-pre-push-hook.sh141
1 files changed, 141 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..a11b20e
--- /dev/null
+++ b/t/t5571-pre-push-hook.sh
@@ -0,0 +1,141 @@
+#!/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
+
+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