t / t5401-update-hooks.shon commit git-svn: add tests for command-line usage of init and clone commands (41337e2)
   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 "$@" >>$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 "$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 "$@" >>$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 "$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_failure push '
  64        git-send-pack --force ./victim/.git master tofail >send.out 2>send.err
  65'
  66
  67test_expect_success 'updated as expected' '
  68        test $(GIT_DIR=victim/.git git rev-parse master) = $commit1 &&
  69        test $(GIT_DIR=victim/.git git rev-parse tofail) = $commit1
  70'
  71
  72test_expect_success 'hooks ran' '
  73        test -f victim/.git/pre-receive.args &&
  74        test -f victim/.git/pre-receive.stdin &&
  75        test -f victim/.git/update.args &&
  76        test -f victim/.git/update.stdin &&
  77        test -f victim/.git/post-receive.args &&
  78        test -f victim/.git/post-receive.stdin &&
  79        test -f victim/.git/post-update.args &&
  80        test -f victim/.git/post-update.stdin
  81'
  82
  83test_expect_success 'pre-receive hook input' '
  84        (echo $commit0 $commit1 refs/heads/master;
  85         echo $commit1 $commit0 refs/heads/tofail
  86        ) | git diff - victim/.git/pre-receive.stdin
  87'
  88
  89test_expect_success 'update hook arguments' '
  90        (echo refs/heads/master $commit0 $commit1;
  91         echo refs/heads/tofail $commit1 $commit0
  92        ) | git diff - victim/.git/update.args
  93'
  94
  95test_expect_success 'post-receive hook input' '
  96        echo $commit0 $commit1 refs/heads/master |
  97        git diff - victim/.git/post-receive.stdin
  98'
  99
 100test_expect_success 'post-update hook arguments' '
 101        echo refs/heads/master |
 102        git diff - victim/.git/post-update.args
 103'
 104
 105test_expect_success 'all hook stdin is /dev/null' '
 106        ! test -s victim/.git/update.stdin &&
 107        ! test -s victim/.git/post-update.stdin
 108'
 109
 110test_expect_success 'all *-receive hook args are empty' '
 111        ! test -s victim/.git/pre-receive.args &&
 112        ! test -s victim/.git/post-receive.args
 113'
 114
 115test_expect_failure 'send-pack produced no output' '
 116        test -s send.out
 117'
 118
 119cat <<EOF >expect
 120STDOUT pre-receive
 121STDERR pre-receive
 122STDOUT update refs/heads/master
 123STDERR update refs/heads/master
 124STDOUT update refs/heads/tofail
 125STDERR update refs/heads/tofail
 126STDOUT post-receive
 127STDERR post-receive
 128STDOUT post-update
 129STDERR post-update
 130EOF
 131test_expect_success 'send-pack stderr contains hook messages' '
 132        egrep ^STD send.err >actual &&
 133        git diff - actual <expect
 134'
 135
 136test_done