t / t7504-commit-msg-hook.shon commit Merge branch 'sb/submodule-parallel-update' (4add209)
   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
  22
  23## Not using test_set_editor here so we can easily ensure the editor variable
  24## is only set for the editor tests
  25FAKE_EDITOR="$(pwd)/fake-editor"
  26export FAKE_EDITOR
  27
  28test_expect_success 'with no hook (editor)' '
  29
  30        echo "more foo" >> file &&
  31        git add file &&
  32        echo "more foo" > FAKE_MSG &&
  33        GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit
  34
  35'
  36
  37test_expect_success '--no-verify with no hook' '
  38
  39        echo "bar" > file &&
  40        git add file &&
  41        git commit --no-verify -m "bar"
  42
  43'
  44
  45test_expect_success '--no-verify with no hook (editor)' '
  46
  47        echo "more bar" > file &&
  48        git add file &&
  49        echo "more bar" > FAKE_MSG &&
  50        GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify
  51
  52'
  53
  54# now install hook that always succeeds
  55HOOKDIR="$(git rev-parse --git-dir)/hooks"
  56HOOK="$HOOKDIR/commit-msg"
  57mkdir -p "$HOOKDIR"
  58cat > "$HOOK" <<EOF
  59#!/bin/sh
  60exit 0
  61EOF
  62chmod +x "$HOOK"
  63
  64test_expect_success 'with succeeding hook' '
  65
  66        echo "more" >> file &&
  67        git add file &&
  68        git commit -m "more"
  69
  70'
  71
  72test_expect_success 'with succeeding hook (editor)' '
  73
  74        echo "more more" >> file &&
  75        git add file &&
  76        echo "more more" > FAKE_MSG &&
  77        GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit
  78
  79'
  80
  81test_expect_success '--no-verify with succeeding hook' '
  82
  83        echo "even more" >> file &&
  84        git add file &&
  85        git commit --no-verify -m "even more"
  86
  87'
  88
  89test_expect_success '--no-verify with succeeding hook (editor)' '
  90
  91        echo "even more more" >> file &&
  92        git add file &&
  93        echo "even more more" > FAKE_MSG &&
  94        GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify
  95
  96'
  97
  98# now a hook that fails
  99cat > "$HOOK" <<EOF
 100#!/bin/sh
 101exit 1
 102EOF
 103
 104test_expect_success 'with failing hook' '
 105
 106        echo "another" >> file &&
 107        git add file &&
 108        test_must_fail git commit -m "another"
 109
 110'
 111
 112test_expect_success 'with failing hook (editor)' '
 113
 114        echo "more another" >> file &&
 115        git add file &&
 116        echo "more another" > FAKE_MSG &&
 117        ! (GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit)
 118
 119'
 120
 121test_expect_success '--no-verify with failing hook' '
 122
 123        echo "stuff" >> file &&
 124        git add file &&
 125        git commit --no-verify -m "stuff"
 126
 127'
 128
 129test_expect_success '--no-verify with failing hook (editor)' '
 130
 131        echo "more stuff" >> file &&
 132        git add file &&
 133        echo "more stuff" > FAKE_MSG &&
 134        GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify
 135
 136'
 137
 138chmod -x "$HOOK"
 139test_expect_success POSIXPERM 'with non-executable hook' '
 140
 141        echo "content" >> file &&
 142        git add file &&
 143        git commit -m "content"
 144
 145'
 146
 147test_expect_success POSIXPERM 'with non-executable hook (editor)' '
 148
 149        echo "content again" >> file &&
 150        git add file &&
 151        echo "content again" > FAKE_MSG &&
 152        GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -m "content again"
 153
 154'
 155
 156test_expect_success POSIXPERM '--no-verify with non-executable hook' '
 157
 158        echo "more content" >> file &&
 159        git add file &&
 160        git commit --no-verify -m "more content"
 161
 162'
 163
 164test_expect_success POSIXPERM '--no-verify with non-executable hook (editor)' '
 165
 166        echo "even more content" >> file &&
 167        git add file &&
 168        echo "even more content" > FAKE_MSG &&
 169        GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify
 170
 171'
 172
 173# now a hook that edits the commit message
 174cat > "$HOOK" <<'EOF'
 175#!/bin/sh
 176echo "new message" > "$1"
 177exit 0
 178EOF
 179chmod +x "$HOOK"
 180
 181commit_msg_is () {
 182        test "$(git log --pretty=format:%s%b -1)" = "$1"
 183}
 184
 185test_expect_success 'hook edits commit message' '
 186
 187        echo "additional" >> file &&
 188        git add file &&
 189        git commit -m "additional" &&
 190        commit_msg_is "new message"
 191
 192'
 193
 194test_expect_success 'hook edits commit message (editor)' '
 195
 196        echo "additional content" >> file &&
 197        git add file &&
 198        echo "additional content" > FAKE_MSG &&
 199        GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit &&
 200        commit_msg_is "new message"
 201
 202'
 203
 204test_expect_success "hook doesn't edit commit message" '
 205
 206        echo "plus" >> file &&
 207        git add file &&
 208        git commit --no-verify -m "plus" &&
 209        commit_msg_is "plus"
 210
 211'
 212
 213test_expect_success "hook doesn't edit commit message (editor)" '
 214
 215        echo "more plus" >> file &&
 216        git add file &&
 217        echo "more plus" > FAKE_MSG &&
 218        GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify &&
 219        commit_msg_is "more plus"
 220
 221'
 222
 223# set up fake editor to replace `pick` by `reword`
 224cat > reword-editor <<'EOF'
 225#!/bin/sh
 226mv "$1" "$1".bup &&
 227sed 's/^pick/reword/' <"$1".bup >"$1"
 228EOF
 229chmod +x reword-editor
 230REWORD_EDITOR="$(pwd)/reword-editor"
 231export REWORD_EDITOR
 232
 233test_expect_success 'hook is called for reword during `rebase -i`' '
 234
 235        GIT_SEQUENCE_EDITOR="\"$REWORD_EDITOR\"" git rebase -i HEAD^ &&
 236        commit_msg_is "new message"
 237
 238'
 239
 240test_done