blob: c537a89b04144a56d438dc6da9f8d705fd0e5730 [file] [log] [blame]
#!/bin/bash
set -eu
readlink -f / &> /dev/null || readlink() { greadlink "$@" ; } # for MacOS
test_dir=$(dirname -- "$(readlink -f -- "$0")")
hook=$test_dir/tools/root/hooks/commit-msg
if [ -z "${TEST_TMPDIR-}" ] ; then
TEST_TMPDIR=$(mktemp -d)
trap cleanup EXIT
fi
function cleanup {
rm -rf "$TEST_TMPDIR"
}
cd $TEST_TMPDIR
function fail {
echo "FAIL: $1"
exit 1
}
function prereq_modern_git {
# "git interpret-trailers --where" was introduced in Git 2.15.0.
git interpret-trailers -h 2>&1 | grep -e --where > /dev/null
}
function test_nonexistent_argument {
rm -f input
if ${hook} input ; then
fail "must fail for non-existent input"
fi
}
function test_empty {
rm -f input
touch input
if ${hook} input ; then
fail "must fail on empty message"
fi
}
function test_empty_with_comments {
rm -f input
cat << EOF > input
# comment
# comment2
EOF
if ${hook} input ; then
fail "must fail on empty message"
fi
}
function test_empty_with_cutoff {
rm -f input
cat << EOF > input
# Please enter the commit message for your changes.
# ------------------------ >8 ------------------------
# Do not modify or remove the line above.
# Everything below it will be ignored.
diff --git a/file.txt b/file.txt
index 625fd613d9..03aeba3b21 100755
--- a/file.txt
+++ b/file.txt
@@ -38,6 +38,7 @@
context
line
+hello, world
context
line
EOF
if ${hook} input ; then
fail "must fail on empty message"
fi
}
function test_keep_cutoff_line {
if ! prereq_modern_git ; then
echo "old version of Git detected; skipping scissors test."
return 0
fi
rm -f input
cat << EOF > input
Do something nice
# Please enter the commit message for your changes.
# ------------------------ >8 ------------------------
# Do not modify or remove the line above.
# Everything below it will be ignored.
diff --git a/file.txt b/file.txt
index 625fd613d9..03aeba3b21 100755
--- a/file.txt
+++ b/file.txt
@@ -38,6 +38,7 @@
context
line
+hello, world
context
line
EOF
${hook} input || fail "failed hook execution"
grep '>8' input || fail "lost cut-off line"
sed -n -e '1,/>8/ p' input >top
grep '^Change-Id' top || fail "missing Change-Id above cut-off line"
}
# a Change-Id already set is preserved.
function test_preserve_changeid {
cat << EOF > input
bla bla
Change-Id: I123
EOF
${hook} input || fail "failed hook execution"
found=$(grep -c '^Change-Id' input) || :
if [[ "${found}" != "1" ]]; then
fail "got ${found} Change-Ids, want 1"
fi
found=$(grep -c '^Change-Id: I123' input) || :
if [[ "${found}" != "1" ]]; then
fail "got ${found} Change-Id: I123, want 1"
fi
}
# Change-Id should not be inserted if gerrit.createChangeId=false
function test_suppress_changeid {
cat << EOF > input
bla bla
EOF
git config gerrit.createChangeId false
${hook} input || fail "failed hook execution"
git config --unset gerrit.createChangeId
found=$(grep -c '^Change-Id' input) || :
if [[ "${found}" != "0" ]]; then
fail "got ${found} Change-Ids, want 0"
fi
}
function test_suppress_squash {
cat << EOF > input
squash! bla bla
EOF
${hook} input || fail "failed hook execution"
found=$(grep -c '^Change-Id' input || true)
if [[ "${found}" != "0" ]]; then
fail "got ${found} Change-Ids, want 0"
fi
}
# gerrit.reviewUrl causes us to create Link instead of Change-Id.
function test_link {
cat << EOF > input
bla bla
EOF
git config gerrit.reviewUrl https://myhost/
${hook} input || fail "failed hook execution"
git config --unset gerrit.reviewUrl
found=$(grep -c '^Change-Id' input) || :
if [[ "${found}" != "0" ]]; then
fail "got ${found} Change-Ids, want 0"
fi
found=$(grep -c '^Link: https://myhost/id/I' input) || :
if [[ "${found}" != "1" ]]; then
fail "got ${found} Link footers, want 1"
fi
}
function test_preserve_link {
cat << EOF > input
bla bla
Link: https://myhost/id/I1234567890123456789012345678901234567890
EOF
git config gerrit.reviewUrl https://myhost/
${hook} input || fail "failed hook execution"
git config --unset gerrit.reviewUrl
found=$(grep -c '^Change-Id' input) || :
if [[ "${found}" != "0" ]]; then
fail "got ${found} Change-Ids, want 0"
fi
found=$(grep -c '^Link: https://myhost/id/I' input) || :
if [[ "${found}" != "1" ]]; then
fail "got ${found} Link footers, want 1"
fi
found=$(grep -c '^Link: https://myhost/id/I1234567890123456789012345678901234567890$' input) || :
if [[ "${found}" != "1" ]]; then
fail "got ${found} Link: https://myhost/id/I123..., want 1"
fi
}
# Change-Id goes after existing trailers.
function test_at_end {
cat << EOF > input
bla bla
Bug: #123
EOF
${hook} input || fail "failed hook execution"
result=$(tail -1 input | grep ^Change-Id) || :
if [[ -z "${result}" ]] ; then
echo "after: "
cat input
fail "did not find Change-Id at end"
fi
}
# Change-Id goes before Signed-off-by trailers.
function test_before_signed_off_by {
cat << EOF > input
bla bla
Bug: #123
Signed-off-by: Joe User
EOF
${hook} input || fail "failed hook execution"
result=$(tail -2 input | head -1 | grep ^Change-Id) || :
if [[ -z "${result}" ]] ; then
echo "after: "
cat input
fail "did not find Change-Id before Signed-off-by"
fi
}
function test_dash_at_end {
if [[ ! -x /bin/dash ]] ; then
echo "/bin/dash not installed; skipping dash test."
return
fi
cat << EOF > input
bla bla
Bug: #123
EOF
/bin/dash ${hook} input || fail "failed hook execution"
result=$(tail -1 input | grep ^Change-Id) || :
if [[ -z "${result}" ]] ; then
echo "after: "
cat input
fail "did not find Change-Id at end"
fi
}
function test_preserve_dash_changeid {
if [[ ! -x /bin/dash ]] ; then
echo "/bin/dash not installed; skipping dash test."
return
fi
cat << EOF > input
bla bla
Change-Id: I123
EOF
/bin/dash ${hook} input || fail "failed hook execution"
found=$(grep -c '^Change-Id' input) || :
if [[ "${found}" != "1" ]]; then
fail "got ${found} Change-Ids, want 1"
fi
found=$(grep -c '^Change-Id: I123' input) || :
if [[ "${found}" != "1" ]]; then
fail "got ${found} Change-Id: I123, want 1"
fi
}
# Test driver.
git init
for func in $( declare -F | awk '{print $3;}' | sort); do
case ${func} in
test_*)
echo "=== testing $func"
${func}
echo "--- done $func"
;;
esac
done