diff options
-rwxr-xr-x | util/gitconfig/test/commit-message-hook.sh | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/util/gitconfig/test/commit-message-hook.sh b/util/gitconfig/test/commit-message-hook.sh new file mode 100755 index 0000000000..a2c53eccde --- /dev/null +++ b/util/gitconfig/test/commit-message-hook.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +## +## This file is part of the coreboot project. +## +## Copyright (C) 2003-2018 Alex Thiessen <alex.thiessen.de+coreboot@gmail.com> +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; version 3 or later of the License. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## SPDX-License-Identifier: GPL-3.0-or-later +## <https://spdx.org/licenses/GPL-3.0-or-later.html> +## + +set -o errexit +set -o nounset + +# static analysis +if command -v shellcheck 1>/dev/null; then + shellcheck --exclude=1090,1091 \ + "${BASH_SOURCE[0]}" \ + "$(dirname "${BASH_SOURCE[0]}")/helpers.sh" +else + echo "shellcheck not found, running unchecked" >&2 +fi + +# dependency check +dependencies=(dirname git make mktemp rm timeout) +for dependency in "${dependencies[@]}"; do + if ! command -v "${dependency}" 1>/dev/null; then + echo "missing ${dependency}, test skipped" >&2 + exit 0 + fi +done + +source "$(dirname "${BASH_SOURCE[0]}")/helpers.sh" + +# setup +base_dir="$(mktemp --directory --tmpdir \ + "test-$(basename "${BASH_SOURCE[0]}" .sh)-XXXXXXXX")" +clone_dir="${base_dir}/coreboot" +git clone "$(git rev-parse --show-toplevel)" "${clone_dir}" \ + 1>"${base_dir}/clone.log" 2>&1 + +( + set -o errexit + set -o nounset + + clone_submodules "${clone_dir}" "${base_dir}" + git config user.name "John Doe" + git config user.email "john.doe@example.com" + make gitconfig + + # test + echo "good case..." + log_file="${base_dir}/good_case.log" + echo "this is a test" >> README + timeout 4m git commit --all --signoff --message="good case" \ + 1>"${log_file}" 2>&1 \ + || check_exit_code positive "${log_file}" + git reset --hard --quiet HEAD^ + git clean -d --force --quiet -x + + echo "bad case..." + log_file="${base_dir}/bad_case.log" + # Goal here is to verify whether a failing `util/lint` test will prevent + # a commit. It's a bit tricky because `checkpatch.pl` is run just after + # the lint tests and will cover many of those too. So we need a case + # that fails with `util/lint` but succeeds with `checkpatch.pl`. I found + # that `lint-stable-009-old-licenses` does the job quite well. + printf "You should have received a copy of the %s\n" "GNU" > src/test.c + git add src/test.c + timeout 4m git commit --signoff --message="bad case" \ + 1>"${log_file}" 2>&1 \ + && check_exit_code negative "${log_file}" + git rm --force --quiet src/test.c + git clean -d --force --quiet -x +) + +# teardown +rm --force --recursive "${base_dir}" |