2020-12-14 20:12:57 +03:00
|
|
|
#!/bin/sh
|
2020-09-09 14:03:27 +03:00
|
|
|
|
2020-12-14 20:12:57 +03:00
|
|
|
set -e -f -u
|
2020-07-15 12:49:08 +03:00
|
|
|
|
2023-02-21 17:07:12 +03:00
|
|
|
# This comment is used to simplify checking local copies of the script.
|
|
|
|
# Bump this number every time a significant change is made to this
|
|
|
|
# script.
|
|
|
|
#
|
2024-02-08 20:39:18 +03:00
|
|
|
# AdGuard-Project-Version: 2
|
|
|
|
|
|
|
|
# TODO(a.garipov): Add pre-merge-commit.
|
2023-02-21 17:07:12 +03:00
|
|
|
|
|
|
|
# Only show interactive prompts if there a terminal is attached to
|
|
|
|
# stdout. While this technically doesn't guarantee that reading from
|
|
|
|
# /dev/tty works, this should work reasonably well on all of our
|
|
|
|
# supported development systems and in most terminal emulators.
|
2021-12-13 15:28:12 +03:00
|
|
|
is_tty='0'
|
2023-02-21 17:07:12 +03:00
|
|
|
if [ -t '1' ]
|
2021-12-13 15:28:12 +03:00
|
|
|
then
|
|
|
|
is_tty='1'
|
|
|
|
fi
|
|
|
|
readonly is_tty
|
|
|
|
|
|
|
|
# prompt is a helper that prompts the user for interactive input if that
|
|
|
|
# can be done. If there is no terminal attached, it sleeps for two
|
|
|
|
# seconds, giving the programmer some time to react, and returns with
|
|
|
|
# a zero exit code.
|
|
|
|
prompt() {
|
|
|
|
if [ "$is_tty" -eq '0' ]
|
|
|
|
then
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
while true
|
|
|
|
do
|
|
|
|
printf 'commit anyway? y/[n]: '
|
|
|
|
read -r ans < /dev/tty
|
|
|
|
|
|
|
|
case "$ans"
|
|
|
|
in
|
|
|
|
('y'|'Y')
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
(''|'n'|'N')
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
(*)
|
|
|
|
continue
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
# Warn the programmer about unstaged changes and untracked files, but do
|
|
|
|
# not fail the commit, because those changes might be temporary or for
|
|
|
|
# a different branch.
|
|
|
|
awk_prog='substr($2, 2, 1) != "." { print $9; } $1 == "?" { print $2; }'
|
|
|
|
readonly awk_prog
|
|
|
|
|
|
|
|
unstaged="$( git status --porcelain=2 | awk "$awk_prog" )"
|
|
|
|
readonly unstaged
|
|
|
|
|
|
|
|
if [ "$unstaged" != "" ]
|
|
|
|
then
|
|
|
|
printf 'WARNING: you have unstaged changes:\n\n%s\n\n' "$unstaged"
|
|
|
|
prompt
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Warn the programmer about temporary todos, but do not fail the commit,
|
|
|
|
# because the commit could be in a temporary branch.
|
|
|
|
temp_todos="$( git grep -e 'TODO.*!!' -- ':!scripts/hooks/pre-commit' || : )"
|
|
|
|
readonly temp_todos
|
|
|
|
|
|
|
|
if [ "$temp_todos" != "" ]
|
|
|
|
then
|
|
|
|
printf 'WARNING: you have temporary todos:\n\n%s\n\n' "$temp_todos"
|
|
|
|
prompt
|
|
|
|
fi
|
2021-07-29 17:40:31 +03:00
|
|
|
|
|
|
|
verbose="${VERBOSE:-0}"
|
|
|
|
readonly verbose
|
2021-06-28 18:24:33 +03:00
|
|
|
|
2021-05-19 20:31:20 +03:00
|
|
|
if [ "$( git diff --cached --name-only -- 'client/*.js' )" ]
|
2020-12-14 20:12:57 +03:00
|
|
|
then
|
2021-07-29 17:40:31 +03:00
|
|
|
make VERBOSE="$verbose" js-lint js-test
|
2020-07-15 12:49:08 +03:00
|
|
|
fi
|
|
|
|
|
2021-05-19 20:31:20 +03:00
|
|
|
if [ "$( git diff --cached --name-only -- '*.go' '*.mod' '*.sh' 'Makefile' )" ]
|
2020-12-14 20:12:57 +03:00
|
|
|
then
|
2021-07-29 17:40:31 +03:00
|
|
|
make VERBOSE="$verbose" go-os-check go-lint go-test
|
2020-12-14 20:12:57 +03:00
|
|
|
fi
|
2021-01-14 13:48:52 +03:00
|
|
|
|
2023-04-06 14:21:46 +03:00
|
|
|
if [ "$( git diff --cached --name-only -- '*.md' '*.txt' '*.yaml' '*.yml' )" ]
|
2021-05-19 20:31:20 +03:00
|
|
|
then
|
2021-07-29 17:40:31 +03:00
|
|
|
make VERBOSE="$verbose" txt-lint
|
2021-05-19 20:31:20 +03:00
|
|
|
fi
|
|
|
|
|
|
|
|
if [ "$( git diff --cached --name-only -- './openapi/openapi.yaml' )" ]
|
2021-01-14 13:48:52 +03:00
|
|
|
then
|
2021-07-29 17:40:31 +03:00
|
|
|
make VERBOSE="$verbose" openapi-lint
|
2021-01-14 13:48:52 +03:00
|
|
|
fi
|