t / t5401-update-hooks.shon commit symbolic ref: refuse non-ref targets in HEAD (afe5d3d)
   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/master $commit0 &&
  19        git update-ref refs/heads/tofail $commit1 &&
  20        git clone ./. victim &&
  21        GIT_DIR=victim/.git git update-ref refs/heads/tofail $commit1 &&
  22        git update-ref refs/heads/master $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/master || 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                master tofail >send.out 2>send.err
  66'
  67
  68test_expect_success 'updated as expected' '
  69        test $(GIT_DIR=victim/.git git rev-parse master) = $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/master;
  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/master $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/master |
  98        test_cmp - victim/.git/post-receive.stdin
  99'
 100
 101test_expect_success 'post-update hook arguments' '
 102        echo refs/heads/master |
 103        test_cmp - victim/.git/post-update.args
 104'
 105
 106test_expect_success 'all hook stdin is /dev/null' '
 107        ! test -s victim/.git/update.stdin &&
 108        ! test -s victim/.git/post-update.stdin
 109'
 110
 111test_expect_success 'all *-receive hook args are empty' '
 112        ! test -s victim/.git/pre-receive.args &&
 113        ! test -s victim/.git/post-receive.args
 114'
 115
 116test_expect_success 'send-pack produced no output' '
 117        ! test -s send.out
 118'
 119
 120cat <<EOF >expect
 121STDOUT pre-receive
 122STDERR pre-receive
 123STDOUT update refs/heads/master
 124STDERR update refs/heads/master
 125STDOUT update refs/heads/tofail
 126STDERR update refs/heads/tofail
 127STDOUT post-receive
 128STDERR post-receive
 129STDOUT post-update
 130STDERR post-update
 131EOF
 132test_expect_success 'send-pack stderr contains hook messages' '
 133        grep ^STD send.err >actual &&
 134        test_cmp - actual <expect
 135'
 136
 137test_done