mirror of
https://github.com/git/git.git
synced 2024-12-01 05:54:16 +08:00
7dfe8ad600
When lying the author name via GIT_AUTHOR_NAME environment variable to "git commit", the hooks run by the command saw it and could act on the name that will be recorded in the final commit. When the user uses the "--author" option from the command line, the command should give the same information to the hook, and back when "git command" was a scripted Porcelain, it did set the environment variable and hooks can learn the author name from it. However, when the command was reimplemented in C, the rewritten code was not very faithful to the original, and hooks stopped getting the authorship information given with "--author". Fix this by exporting the necessary environment variables. Signed-off-by: Junio C Hamano <gitster@pobox.com>
140 lines
2.5 KiB
Bash
Executable File
140 lines
2.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='pre-commit hook'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'with no hook' '
|
|
|
|
echo "foo" > file &&
|
|
git add file &&
|
|
git commit -m "first"
|
|
|
|
'
|
|
|
|
test_expect_success '--no-verify with no hook' '
|
|
|
|
echo "bar" > file &&
|
|
git add file &&
|
|
git commit --no-verify -m "bar"
|
|
|
|
'
|
|
|
|
# now install hook that always succeeds
|
|
HOOKDIR="$(git rev-parse --git-dir)/hooks"
|
|
HOOK="$HOOKDIR/pre-commit"
|
|
mkdir -p "$HOOKDIR"
|
|
cat > "$HOOK" <<EOF
|
|
#!/bin/sh
|
|
exit 0
|
|
EOF
|
|
chmod +x "$HOOK"
|
|
|
|
test_expect_success 'with succeeding hook' '
|
|
|
|
echo "more" >> file &&
|
|
git add file &&
|
|
git commit -m "more"
|
|
|
|
'
|
|
|
|
test_expect_success '--no-verify with succeeding hook' '
|
|
|
|
echo "even more" >> file &&
|
|
git add file &&
|
|
git commit --no-verify -m "even more"
|
|
|
|
'
|
|
|
|
# now a hook that fails
|
|
cat > "$HOOK" <<EOF
|
|
#!/bin/sh
|
|
exit 1
|
|
EOF
|
|
|
|
test_expect_success 'with failing hook' '
|
|
|
|
echo "another" >> file &&
|
|
git add file &&
|
|
test_must_fail git commit -m "another"
|
|
|
|
'
|
|
|
|
test_expect_success '--no-verify with failing hook' '
|
|
|
|
echo "stuff" >> file &&
|
|
git add file &&
|
|
git commit --no-verify -m "stuff"
|
|
|
|
'
|
|
|
|
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 '--no-verify with non-executable hook' '
|
|
|
|
echo "more content" >> file &&
|
|
git add file &&
|
|
git commit --no-verify -m "more content"
|
|
|
|
'
|
|
chmod +x "$HOOK"
|
|
|
|
# a hook that checks $GIT_PREFIX and succeeds inside the
|
|
# success/ subdirectory only
|
|
cat > "$HOOK" <<EOF
|
|
#!/bin/sh
|
|
test \$GIT_PREFIX = success/
|
|
EOF
|
|
|
|
test_expect_success 'with hook requiring GIT_PREFIX' '
|
|
|
|
echo "more content" >> file &&
|
|
git add file &&
|
|
mkdir success &&
|
|
(
|
|
cd success &&
|
|
git commit -m "hook requires GIT_PREFIX = success/"
|
|
) &&
|
|
rmdir success
|
|
'
|
|
|
|
test_expect_success 'with failing hook requiring GIT_PREFIX' '
|
|
|
|
echo "more content" >> file &&
|
|
git add file &&
|
|
mkdir fail &&
|
|
(
|
|
cd fail &&
|
|
test_must_fail git commit -m "hook must fail"
|
|
) &&
|
|
rmdir fail &&
|
|
git checkout -- file
|
|
'
|
|
|
|
test_expect_success 'check the author in hook' '
|
|
write_script "$HOOK" <<-\EOF &&
|
|
test "$GIT_AUTHOR_NAME" = "New Author" &&
|
|
test "$GIT_AUTHOR_EMAIL" = "newauthor@example.com"
|
|
EOF
|
|
test_must_fail git commit --allow-empty -m "by a.u.thor" &&
|
|
(
|
|
GIT_AUTHOR_NAME="New Author" &&
|
|
GIT_AUTHOR_EMAIL="newauthor@example.com" &&
|
|
export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
|
|
git commit --allow-empty -m "by new.author via env" &&
|
|
git show -s
|
|
) &&
|
|
git commit --author="New Author <newauthor@example.com>" \
|
|
--allow-empty -m "by new.author via command line" &&
|
|
git show -s
|
|
'
|
|
|
|
test_done
|