#!/bin/sh setvar test_description = ''commit-msg hook'' source ./test-lib.sh test_expect_success 'with no hook' ' echo "foo" > file && git add file && git commit -m "first" ' # set up fake editor for interactive editing cat > fake-editor <<< ''' #!/bin/sh cp FAKE_MSG "$1" exit 0 ''' chmod +x fake-editor ## Not using test_set_editor here so we can easily ensure the editor variable ## is only set for the editor tests setvar FAKE_EDITOR = ""$(pwd)/fake-editor"" export FAKE_EDITOR test_expect_success 'with no hook (editor)' ' echo "more foo" >> file && git add file && echo "more foo" > FAKE_MSG && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit ' test_expect_success '--no-verify with no hook' ' echo "bar" > file && git add file && git commit --no-verify -m "bar" ' test_expect_success '--no-verify with no hook (editor)' ' echo "more bar" > file && git add file && echo "more bar" > FAKE_MSG && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify ' # now install hook that always succeeds setvar HOOKDIR = ""$(git rev-parse --git-dir)/hooks"" setvar HOOK = ""$HOOKDIR/commit-msg"" mkdir -p $HOOKDIR cat > "$HOOK" <<< """ #!/bin/sh exit 0 """ chmod +x $HOOK test_expect_success 'with succeeding hook' ' echo "more" >> file && git add file && git commit -m "more" ' test_expect_success 'with succeeding hook (editor)' ' echo "more more" >> file && git add file && echo "more more" > FAKE_MSG && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit ' test_expect_success '--no-verify with succeeding hook' ' echo "even more" >> file && git add file && git commit --no-verify -m "even more" ' test_expect_success '--no-verify with succeeding hook (editor)' ' echo "even more more" >> file && git add file && echo "even more more" > FAKE_MSG && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify ' # now a hook that fails cat > "$HOOK" <<< """ #!/bin/sh exit 1 """ test_expect_success 'with failing hook' ' echo "another" >> file && git add file && test_must_fail git commit -m "another" ' test_expect_success 'with failing hook (editor)' ' echo "more another" >> file && git add file && echo "more another" > FAKE_MSG && ! (GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit) ' test_expect_success '--no-verify with failing hook' ' echo "stuff" >> file && git add file && git commit --no-verify -m "stuff" ' test_expect_success '--no-verify with failing hook (editor)' ' echo "more stuff" >> file && git add file && echo "more stuff" > FAKE_MSG && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify ' chmod -x $HOOK test_expect_success POSIXPERM 'with non-executable hook' ' echo "content" >> file && git add file && git commit -m "content" ' test_expect_success POSIXPERM 'with non-executable hook (editor)' ' echo "content again" >> file && git add file && echo "content again" > FAKE_MSG && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -m "content again" ' test_expect_success POSIXPERM '--no-verify with non-executable hook' ' echo "more content" >> file && git add file && git commit --no-verify -m "more content" ' test_expect_success POSIXPERM '--no-verify with non-executable hook (editor)' ' echo "even more content" >> file && git add file && echo "even more content" > FAKE_MSG && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify ' # now a hook that edits the commit message cat > "$HOOK" <<< ''' #!/bin/sh echo "new message" > "$1" exit 0 ''' chmod +x $HOOK proc commit_msg_is { test $(git log --pretty=format:%s%b -1) = $1 } test_expect_success 'hook edits commit message' ' echo "additional" >> file && git add file && git commit -m "additional" && commit_msg_is "new message" ' test_expect_success 'hook edits commit message (editor)' ' echo "additional content" >> file && git add file && echo "additional content" > FAKE_MSG && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit && commit_msg_is "new message" ' test_expect_success "hook doesn't edit commit message" ' echo "plus" >> file && git add file && git commit --no-verify -m "plus" && commit_msg_is "plus" ' test_expect_success "hook doesn't edit commit message (editor)" ' echo "more plus" >> file && git add file && echo "more plus" > FAKE_MSG && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify && commit_msg_is "more plus" ' test_done