Remove old changelog
[KDIS.git] / scripts / check.sh
blob8729d01cd5e70a8d976dcf9c6eaf60a748e61ba3
1 #!/usr/bin/env sh
3 # Fail on error
4 set -o errexit
5 # Disable wildcard character expansion
6 set -o noglob
7 # Disable uninitialized variable usage
8 set -o nounset
9 # Disable error masking in pipe
10 # shellcheck disable=SC3040
11 if (set -o pipefail > /dev/null 2>&1); then
12 set -o pipefail
15 # ================
16 # LOGGER
17 # ================
18 # Error log level. Cause exit failure
19 LOG_LEVEL_ERROR=100
20 # Warning log level
21 LOG_LEVEL_WARN=200
22 # Informational log level
23 LOG_LEVEL_INFO=300
24 # Debug log level
25 LOG_LEVEL_DEBUG=400
26 # Log level
27 LOG_LEVEL=$LOG_LEVEL_INFO
28 # Log color flag
29 LOG_COLOR_ENABLE=true
31 # Convert log level to equivalent name
32 # @param $1 Log level
33 log_level_name() {
34 _log_level=${1:-LOG_LEVEL}
35 _log_level_name=
37 case $_log_level in
38 "$LOG_LEVEL_ERROR") _log_level_name=error ;;
39 "$LOG_LEVEL_WARN") _log_level_name=warn ;;
40 "$LOG_LEVEL_INFO") _log_level_name=info ;;
41 "$LOG_LEVEL_DEBUG") _log_level_name=debug ;;
42 *) ERROR "Unknown log level '$_log_level'" ;;
43 esac
45 printf '%s\n' "$_log_level_name"
48 # Check if log level is enabled
49 # @param $1 Log level
50 log_is_enabled() {
51 [ "$1" -le "$LOG_LEVEL" ]
54 # Print log message
55 # @param $1 Log level
56 # @param $2 Message
57 _log_print_message() {
58 _log_level=${1:-LOG_LEVEL_ERROR}
59 shift
60 _log_level_name=
61 _log_message=${*:-}
62 _log_prefix=
63 _log_suffix="\033[0m"
65 # Check log level
66 log_is_enabled "$_log_level" || return 0
68 case $_log_level in
69 "$LOG_LEVEL_ERROR")
70 _log_level_name=ERROR
71 _log_prefix="\033[1;31m"
73 "$LOG_LEVEL_WARN")
74 _log_level_name=WARN
75 _log_prefix="\033[1;33m"
77 "$LOG_LEVEL_INFO")
78 _log_level_name=INFO
79 _log_prefix="\033[1;37m"
81 "$LOG_LEVEL_DEBUG")
82 _log_level_name=DEBUG
83 _log_prefix="\033[1;34m"
85 esac
87 # Check color flag
88 if [ "$LOG_COLOR_ENABLE" = false ]; then
89 _log_prefix=
90 _log_suffix=
93 # Log
94 printf '%b[%-5s] %b%b\n' "$_log_prefix" "$_log_level_name" "$_log_message" "$_log_suffix"
97 # Error log message
98 # @param $1 Message
99 ERROR() {
100 _log_print_message "$LOG_LEVEL_ERROR" "$1" >&2
101 exit 1
103 # Warning log message
104 # @param $1 Message
105 WARN() { _log_print_message "$LOG_LEVEL_WARN" "$1" >&2; }
106 # Informational log message
107 # @param $1 Message
108 INFO() { _log_print_message "$LOG_LEVEL_INFO" "$1"; }
109 # Debug log message
110 # @param $1 Message
111 DEBUG() { _log_print_message "$LOG_LEVEL_DEBUG" "$1"; }
113 # ================
114 # FUNCTIONS
115 # ================
116 # Assert command is installed
117 # @param $1 Command name
118 assert_cmd() {
119 check_cmd "$1" || ERROR "Command '$1' not found"
120 DEBUG "Command '$1' found at '$(command -v "$1")'"
123 # Check command is installed
124 # @param $1 Command name
125 check_cmd() {
126 command -v "$1" > /dev/null 2>&1
129 # Show help message
130 show_help() {
131 cat << EOF
132 Usage: $(basename "$0")
133 [--disable-color] [--help] [--log-level <LEVEL>] [--root-dir <DIR>]
135 DAG checker.
137 Options:
138 --disable-color Disable color
140 --help Show this help message and exit
142 --log-level <LEVEL> Logger level
143 Default: $(log_level_name "$LOG_LEVEL")
144 Values:
145 error Error level
146 warn Warning level
147 info Informational level
148 debug Debug level
150 --root-dir <DIR> Root directory
151 Default: $ROOTDIR
155 # Assert argument has a value
156 # @param $1 Argument name
157 # @param $2 Argument value
158 _parse_args_assert_value() {
159 [ -n "${2+x}" ] || ERROR "Argument '$1' requires a non-empty value"
162 # Parse command line arguments
163 # @param $@ Arguments
164 parse_args() {
165 while [ $# -gt 0 ]; do
166 case $1 in
167 --disable-color)
168 # Disable color
169 LOG_COLOR_ENABLE=false
170 shift
172 --help)
173 # Display help message and exit
174 show_help
175 exit 0
177 --log-level)
178 # Log level
179 _parse_args_assert_value "$@"
180 case $2 in
181 error) LOG_LEVEL=$LOG_LEVEL_ERROR ;;
182 warn) LOG_LEVEL=$LOG_LEVEL_WARN ;;
183 info) LOG_LEVEL=$LOG_LEVEL_INFO ;;
184 debug) LOG_LEVEL=$LOG_LEVEL_DEBUG ;;
185 *) ERROR "Value '$2' of argument '$1' is invalid" ;;
186 esac
187 shift
188 shift
190 --root-dir)
191 # Root directory
192 _parse_args_assert_value "$@"
193 ROOTDIR=$2
194 shift
195 shift
198 # Unknown argument
199 WARN "Unknown argument '$1' is ignored"
200 shift
203 # No argument
204 WARN "Skipping argument '$1'"
205 shift
207 esac
208 done
211 # Verify system
212 verify_system() {
213 assert_cmd clang-format
214 assert_cmd cmake-format
215 assert_cmd cmake-lint
217 [ -d "$ROOTDIR" ] || ERROR "Root directory '$ROOTDIR' does not exists"
220 # CMake Format
221 cmake_format() {
222 INFO "CMake Format"
223 find "$ROOTDIR" \
224 -not -path "$ROOTDIR/build/*" \
225 -not -path "$ROOTDIR/cmake/CPM.cmake" \
226 -type f \( -name 'CMakeLists.txt' -o -name '*.cmake' -o -name '*.cmake.in' \) \
227 -print0 \
228 | xargs -0 -n 1 \
229 cmake-format \
230 --check
233 # CMake Lint
234 cmake_lint() {
235 INFO "CMake Lint"
236 find "$ROOTDIR" \
237 -not -path "$ROOTDIR/build/*" \
238 -not -path "$ROOTDIR/cmake/CPM.cmake" \
239 -type f \( -name 'CMakeLists.txt' -o -name '*.cmake' -o -name '*.cmake.in' \) \
240 -print0 \
241 | xargs -0 -n 1 \
242 cmake-lint
245 # Clang Format
246 clang_format() {
247 INFO "Clang Format"
248 find "$ROOTDIR" \
249 -not -path "$ROOTDIR/build/*" \
250 -not -path "$ROOTDIR/include/KDIS/KExport.hpp" \
251 -type f \( -name '*.hpp' -o -name '*.hpp.in' -o -name '*.cpp' \) \
252 -print0 \
253 | xargs -0 -n 1 \
254 clang-format \
255 --Werror \
256 --dry-run \
257 --style 'file'
260 # Clang Tidy
261 clang_tidy() {
262 INFO "Clang Tidy"
263 # TODO(carlocorradini)
266 # CppLint
267 cpplint() {
268 INFO "CppLint"
269 # TODO(carlocorradini)
272 # CppCheck
273 cppcheck() {
274 INFO "CppCheck"
275 # TODO(carlocorradini)
278 # ================
279 # CONFIGURATION
280 # ================
281 # Log level
282 LOG_LEVEL=$LOG_LEVEL_INFO
283 # Log color flag
284 LOG_COLOR_ENABLE=true
285 # Root directory
286 # shellcheck disable=SC1007
287 ROOTDIR="$(readlink -f "$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)/..")"
289 # ================
290 # MAIN
291 # ================
293 parse_args "$@"
294 verify_system
295 cmake_format
296 cmake_lint
297 clang_format
298 clang_tidy
299 cpplint
300 cppcheck