summaryrefslogtreecommitdiff
path: root/util/gitconfig/test/commit-message-hook.sh
blob: a2c53eccdedb3adbe830633be82e140350cc25ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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}"