1#!/bin/sh 2# 3# Copyright (c) 2006 Shawn O. Pearce 4# 5 6test_description='Test the update hook infrastructure.' 7. ./test-lib.sh 8 9test_expect_success setup ' 10 echo This is a test. >a && 11 git update-index --add a && 12 tree0=$(git write-tree) && 13 commit0=$(echo setup | git commit-tree $tree0) && 14 echo We hope it works. >a && 15 git update-index a && 16 tree1=$(git write-tree) && 17 commit1=$(echo modify | git commit-tree $tree1 -p $commit0) && 18 git update-ref refs/heads/main $commit0 && 19 git update-ref refs/heads/tofail $commit1 && 20 git clone --bare ./. victim.git && 21 GIT_DIR=victim.git git update-ref refs/heads/tofail $commit1 && 22 git update-ref refs/heads/main $commit1 && 23 git update-ref refs/heads/tofail $commit0 24' 25 26cat >victim.git/hooks/pre-receive <<'EOF' 27#!/bin/sh 28printf %s "$@" >>$GIT_DIR/pre-receive.args 29cat - >$GIT_DIR/pre-receive.stdin 30echo STDOUT pre-receive 31echo STDERR pre-receive >&2 32EOF 33chmod u+x victim.git/hooks/pre-receive 34 35cat >victim.git/hooks/update <<'EOF' 36#!/bin/sh 37echo "$@" >>$GIT_DIR/update.args 38read x; printf %s "$x" >$GIT_DIR/update.stdin 39echo STDOUT update $1 40echo STDERR update $1 >&2 41test "$1" = refs/heads/main || exit 42EOF 43chmod u+x victim.git/hooks/update 44 45cat >victim.git/hooks/post-receive <<'EOF' 46#!/bin/sh 47printf %s "$@" >>$GIT_DIR/post-receive.args 48cat - >$GIT_DIR/post-receive.stdin 49echo STDOUT post-receive 50echo STDERR post-receive >&2 51EOF 52chmod u+x victim.git/hooks/post-receive 53 54cat >victim.git/hooks/post-update <<'EOF' 55#!/bin/sh 56echo "$@" >>$GIT_DIR/post-update.args 57read x; printf %s "$x" >$GIT_DIR/post-update.stdin 58echo STDOUT post-update 59echo STDERR post-update >&2 60EOF 61chmod u+x victim.git/hooks/post-update 62 63test_expect_success push ' 64 test_must_fail git send-pack --force ./victim.git \ 65 main tofail >send.out 2>send.err 66' 67 68test_expect_success 'updated as expected' ' 69 test $(GIT_DIR=victim.git git rev-parse main) = $commit1 && 70 test $(GIT_DIR=victim.git git rev-parse tofail) = $commit1 71' 72 73test_expect_success 'hooks ran' ' 74 test -f victim.git/pre-receive.args && 75 test -f victim.git/pre-receive.stdin && 76 test -f victim.git/update.args && 77 test -f victim.git/update.stdin && 78 test -f victim.git/post-receive.args && 79 test -f victim.git/post-receive.stdin && 80 test -f victim.git/post-update.args && 81 test -f victim.git/post-update.stdin 82' 83 84test_expect_success 'pre-receive hook input' ' 85 (echo $commit0 $commit1 refs/heads/main && 86 echo $commit1 $commit0 refs/heads/tofail 87 ) | test_cmp - victim.git/pre-receive.stdin 88' 89 90test_expect_success 'update hook arguments' ' 91 (echo refs/heads/main $commit0 $commit1 && 92 echo refs/heads/tofail $commit1 $commit0 93 ) | test_cmp - victim.git/update.args 94' 95 96test_expect_success 'post-receive hook input' ' 97 echo $commit0 $commit1 refs/heads/main | 98 test_cmp - victim.git/post-receive.stdin 99' 100 101test_expect_success 'post-update hook arguments' ' 102 echo refs/heads/main | 103 test_cmp - victim.git/post-update.args 104' 105 106test_expect_success 'all hook stdin is /dev/null' ' 107 test_must_be_empty victim.git/update.stdin && 108 test_must_be_empty victim.git/post-update.stdin 109' 110 111test_expect_success 'all *-receive hook args are empty' ' 112 test_must_be_empty victim.git/pre-receive.args && 113 test_must_be_empty victim.git/post-receive.args 114' 115 116test_expect_success 'send-pack produced no output' ' 117 test_must_be_empty send.out 118' 119 120cat <<EOF >expect 121remote: STDOUT pre-receive 122remote: STDERR pre-receive 123remote: STDOUT update refs/heads/main 124remote: STDERR update refs/heads/main 125remote: STDOUT update refs/heads/tofail 126remote: STDERR update refs/heads/tofail 127remote: error: hook declined to update refs/heads/tofail 128remote: STDOUT post-receive 129remote: STDERR post-receive 130remote: STDOUT post-update 131remote: STDERR post-update 132EOF 133test_expect_success 'send-pack stderr contains hook messages' ' 134 grep ^remote: send.err | sed "s/ *\$//" >actual && 135 test_cmp expect actual 136' 137 138test_expect_success 'pre-receive hook that forgets to read its input' ' 139 write_script victim.git/hooks/pre-receive <<-\EOF && 140 exit 0 141 EOF 142 rm -f victim.git/hooks/update victim.git/hooks/post-update && 143 144 for v in $(test_seq 100 999) 145 do 146 git branch branch_$v main || return 147 done && 148 git push ./victim.git "+refs/heads/*:refs/heads/*" 149' 150 151test_done 152