t / t7503-pre-commit-hook.shon commit Merge branch 'sb/pack-protocol-doc-nak' (10881f0)
   1#!/bin/sh
   2
   3test_description='pre-commit hook'
   4
   5. ./test-lib.sh
   6
   7test_expect_success 'with no hook' '
   8
   9        echo "foo" > file &&
  10        git add file &&
  11        git commit -m "first"
  12
  13'
  14
  15test_expect_success '--no-verify with no hook' '
  16
  17        echo "bar" > file &&
  18        git add file &&
  19        git commit --no-verify -m "bar"
  20
  21'
  22
  23# now install hook that always succeeds
  24HOOKDIR="$(git rev-parse --git-dir)/hooks"
  25HOOK="$HOOKDIR/pre-commit"
  26mkdir -p "$HOOKDIR"
  27cat > "$HOOK" <<EOF
  28#!/bin/sh
  29exit 0
  30EOF
  31chmod +x "$HOOK"
  32
  33test_expect_success 'with succeeding hook' '
  34
  35        echo "more" >> file &&
  36        git add file &&
  37        git commit -m "more"
  38
  39'
  40
  41test_expect_success '--no-verify with succeeding hook' '
  42
  43        echo "even more" >> file &&
  44        git add file &&
  45        git commit --no-verify -m "even more"
  46
  47'
  48
  49# now a hook that fails
  50cat > "$HOOK" <<EOF
  51#!/bin/sh
  52exit 1
  53EOF
  54
  55test_expect_success 'with failing hook' '
  56
  57        echo "another" >> file &&
  58        git add file &&
  59        test_must_fail git commit -m "another"
  60
  61'
  62
  63test_expect_success '--no-verify with failing hook' '
  64
  65        echo "stuff" >> file &&
  66        git add file &&
  67        git commit --no-verify -m "stuff"
  68
  69'
  70
  71chmod -x "$HOOK"
  72test_expect_success POSIXPERM 'with non-executable hook' '
  73
  74        echo "content" >> file &&
  75        git add file &&
  76        git commit -m "content"
  77
  78'
  79
  80test_expect_success POSIXPERM '--no-verify with non-executable hook' '
  81
  82        echo "more content" >> file &&
  83        git add file &&
  84        git commit --no-verify -m "more content"
  85
  86'
  87chmod +x "$HOOK"
  88
  89# a hook that checks $GIT_PREFIX and succeeds inside the
  90# success/ subdirectory only
  91cat > "$HOOK" <<EOF
  92#!/bin/sh
  93test \$GIT_PREFIX = success/
  94EOF
  95
  96test_expect_success 'with hook requiring GIT_PREFIX' '
  97
  98        echo "more content" >> file &&
  99        git add file &&
 100        mkdir success &&
 101        (
 102                cd success &&
 103                git commit -m "hook requires GIT_PREFIX = success/"
 104        ) &&
 105        rmdir success
 106'
 107
 108test_expect_success 'with failing hook requiring GIT_PREFIX' '
 109
 110        echo "more content" >> file &&
 111        git add file &&
 112        mkdir fail &&
 113        (
 114                cd fail &&
 115                test_must_fail git commit -m "hook must fail"
 116        ) &&
 117        rmdir fail &&
 118        git checkout -- file
 119'
 120
 121test_expect_success 'check the author in hook' '
 122        write_script "$HOOK" <<-\EOF &&
 123        test "$GIT_AUTHOR_NAME" = "New Author" &&
 124        test "$GIT_AUTHOR_EMAIL" = "newauthor@example.com"
 125        EOF
 126        test_must_fail git commit --allow-empty -m "by a.u.thor" &&
 127        (
 128                GIT_AUTHOR_NAME="New Author" &&
 129                GIT_AUTHOR_EMAIL="newauthor@example.com" &&
 130                export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
 131                git commit --allow-empty -m "by new.author via env" &&
 132                git show -s
 133        ) &&
 134        git commit --author="New Author <newauthor@example.com>" \
 135                --allow-empty -m "by new.author via command line" &&
 136        git show -s
 137'
 138
 139test_done