t / t7504-commit-msg-hook.shon commit Documentation/git-checkout: Update summary to reflect current abilities (76ce946)
   1#!/bin/sh
   2
   3test_description='commit-msg 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
  15# set up fake editor for interactive editing
  16cat > fake-editor <<'EOF'
  17#!/bin/sh
  18cp FAKE_MSG "$1"
  19exit 0
  20EOF
  21chmod +x fake-editor
  22FAKE_EDITOR="$(pwd)/fake-editor"
  23export FAKE_EDITOR
  24
  25test_expect_success 'with no hook (editor)' '
  26
  27        echo "more foo" >> file &&
  28        git add file &&
  29        echo "more foo" > FAKE_MSG &&
  30        GIT_EDITOR="$FAKE_EDITOR" git commit
  31
  32'
  33
  34test_expect_success '--no-verify with no hook' '
  35
  36        echo "bar" > file &&
  37        git add file &&
  38        git commit --no-verify -m "bar"
  39
  40'
  41
  42test_expect_success '--no-verify with no hook (editor)' '
  43
  44        echo "more bar" > file &&
  45        git add file &&
  46        echo "more bar" > FAKE_MSG &&
  47        GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify
  48
  49'
  50
  51# now install hook that always succeeds
  52HOOKDIR="$(git rev-parse --git-dir)/hooks"
  53HOOK="$HOOKDIR/commit-msg"
  54mkdir -p "$HOOKDIR"
  55cat > "$HOOK" <<EOF
  56#!/bin/sh
  57exit 0
  58EOF
  59chmod +x "$HOOK"
  60
  61test_expect_success 'with succeeding hook' '
  62
  63        echo "more" >> file &&
  64        git add file &&
  65        git commit -m "more"
  66
  67'
  68
  69test_expect_success 'with succeeding hook (editor)' '
  70
  71        echo "more more" >> file &&
  72        git add file &&
  73        echo "more more" > FAKE_MSG &&
  74        GIT_EDITOR="$FAKE_EDITOR" git commit
  75
  76'
  77
  78test_expect_success '--no-verify with succeeding hook' '
  79
  80        echo "even more" >> file &&
  81        git add file &&
  82        git commit --no-verify -m "even more"
  83
  84'
  85
  86test_expect_success '--no-verify with succeeding hook (editor)' '
  87
  88        echo "even more more" >> file &&
  89        git add file &&
  90        echo "even more more" > FAKE_MSG &&
  91        GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify
  92
  93'
  94
  95# now a hook that fails
  96cat > "$HOOK" <<EOF
  97#!/bin/sh
  98exit 1
  99EOF
 100
 101test_expect_success 'with failing hook' '
 102
 103        echo "another" >> file &&
 104        git add file &&
 105        ! git commit -m "another"
 106
 107'
 108
 109test_expect_success 'with failing hook (editor)' '
 110
 111        echo "more another" >> file &&
 112        git add file &&
 113        echo "more another" > FAKE_MSG &&
 114        ! (GIT_EDITOR="$FAKE_EDITOR" git commit)
 115
 116'
 117
 118test_expect_success '--no-verify with failing hook' '
 119
 120        echo "stuff" >> file &&
 121        git add file &&
 122        git commit --no-verify -m "stuff"
 123
 124'
 125
 126test_expect_success '--no-verify with failing hook (editor)' '
 127
 128        echo "more stuff" >> file &&
 129        git add file &&
 130        echo "more stuff" > FAKE_MSG &&
 131        GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify
 132
 133'
 134
 135chmod -x "$HOOK"
 136test_expect_success 'with non-executable hook' '
 137
 138        echo "content" >> file &&
 139        git add file &&
 140        git commit -m "content"
 141
 142'
 143
 144test_expect_success 'with non-executable hook (editor)' '
 145
 146        echo "content again" >> file &&
 147        git add file &&
 148        echo "content again" > FAKE_MSG &&
 149        GIT_EDITOR="$FAKE_EDITOR" git commit -m "content again"
 150
 151'
 152
 153test_expect_success '--no-verify with non-executable hook' '
 154
 155        echo "more content" >> file &&
 156        git add file &&
 157        git commit --no-verify -m "more content"
 158
 159'
 160
 161test_expect_success '--no-verify with non-executable hook (editor)' '
 162
 163        echo "even more content" >> file &&
 164        git add file &&
 165        echo "even more content" > FAKE_MSG &&
 166        GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify
 167
 168'
 169
 170# now a hook that edits the commit message
 171cat > "$HOOK" <<'EOF'
 172#!/bin/sh
 173echo "new message" > "$1"
 174exit 0
 175EOF
 176chmod +x "$HOOK"
 177
 178commit_msg_is () {
 179        test "`git log --pretty=format:%s%b -1`" = "$1"
 180}
 181
 182test_expect_success 'hook edits commit message' '
 183
 184        echo "additional" >> file &&
 185        git add file &&
 186        git commit -m "additional" &&
 187        commit_msg_is "new message"
 188
 189'
 190
 191test_expect_success 'hook edits commit message (editor)' '
 192
 193        echo "additional content" >> file &&
 194        git add file &&
 195        echo "additional content" > FAKE_MSG &&
 196        GIT_EDITOR="$FAKE_EDITOR" git commit &&
 197        commit_msg_is "new message"
 198
 199'
 200
 201test_expect_success "hook doesn't edit commit message" '
 202
 203        echo "plus" >> file &&
 204        git add file &&
 205        git commit --no-verify -m "plus" &&
 206        commit_msg_is "plus"
 207
 208'
 209
 210test_expect_success "hook doesn't edit commit message (editor)" '
 211
 212        echo "more plus" >> file &&
 213        git add file &&
 214        echo "more plus" > FAKE_MSG &&
 215        GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify &&
 216        commit_msg_is "more plus"
 217
 218'
 219
 220test_done