1
1
#! /bin/bash
2
2
3
3
# Copyright (c) 2022 - 2023 by Apex.AI Inc. All rights reserved.
4
+ # Copyright (c) 2023 by Mathias Kraus <elboberido@m-hias.de>. All rights reserved.
4
5
#
5
6
# Licensed under the Apache License, Version 2.0 (the "License");
6
7
# you may not use this file except in compliance with the License.
21
22
22
23
set -e
23
24
25
+ COLOR_OFF=' \033[0m'
26
+ COLOR_RED=' \033[1;31m'
27
+ COLOR_GREEN=' \033[1;32m'
28
+ COLOR_YELLOW=' \033[1;33m'
29
+
24
30
MODE=${1:- full} # Can be either `full` for all files or `hook` for formatting with git hooks
25
31
26
32
FILE_FILTER=" \.(h|hpp|inl|c|cpp)$"
27
33
28
34
fail () {
29
- printf " \033[1;31merror : %s: %s\033[0m \n" ${FUNCNAME[1]} " ${1:- " Unknown error" } "
35
+ printf " ${COLOR_RED} error : %s: %s${COLOR_OFF} \n" ${FUNCNAME[1]} " ${1:- " Unknown error" } "
30
36
exit 1
31
37
}
32
38
@@ -60,91 +66,145 @@ echo "Using clang-tidy version: $($CLANG_TIDY_CMD --version | sed -n "s/.*versio
60
66
61
67
noSpaceInSuppressions=$( git ls-files | grep -E " $FILE_FILTER " | xargs -I {} grep -h ' // NOLINTNEXTLINE (' {} || true)
62
68
if [[ -n " $noSpaceInSuppressions " ]]; then
63
- echo -e " \e[1;31mRemove space between NOLINTNEXTLINE and '('!\e[m "
69
+ echo -e " ${COLOR_RED} Remove space between NOLINTNEXTLINE and '('!${COLOR_OFF} "
64
70
echo " $noSpaceInSuppressions "
65
71
exit 1
66
72
fi
67
73
68
74
function scanWithFileList() {
69
75
FILE_WITH_SCAN_LIST=$1
70
- FILE_TO_SCAN =$2
76
+ FILES_TO_SCAN =$2
71
77
72
78
if ! test -f " $FILE_WITH_SCAN_LIST "
73
79
then
74
- echo " Scan list file '${FILE_WITH_SCAN_LIST} ' does not exist"
80
+ echo -e " ${COLOR_RED} Scan list file '${FILE_WITH_SCAN_LIST} ' does not exist! Aborting! ${COLOR_OFF} "
75
81
return 1
76
82
fi
77
83
84
+ SEPARATOR=' '
78
85
while IFS= read -r LINE
79
86
do
80
87
# add files until the comment section starts
81
88
if [[ " $( echo $LINE | grep " #" | wc -l) " == " 1" ]]; then
82
89
break
83
90
fi
84
- FILE_LIST=" ${FILE_LIST} $LINE "
91
+ SCAN_LIST_ENTRIES+=" ${SEPARATOR}${LINE} "
92
+ SEPARATOR=$' \n '
85
93
done < " $FILE_WITH_SCAN_LIST "
86
94
87
- if [[ -n $FILE_TO_SCAN ]]
95
+ if [[ -z $SCAN_LIST_ENTRIES ]]
88
96
then
89
- if ! test -f " $FILE_TO_SCAN "
90
- then
91
- echo " The file which should be scanned '${FILE_TO_SCAN} ' does not exist"
92
- return 1
93
- fi
97
+ echo -e " ${COLOR_YELLOW} '${FILE_WITH_SCAN_LIST} ' is empty skipping scan!${COLOR_OFF} "
98
+ return 0
99
+ fi
94
100
95
- if [[ $( find ${FILE_LIST} -type f | grep -E ${FILE_FILTER} | grep ${FILE_TO_SCAN} | wc -l) == " 0" ]]
96
- then
97
- echo " Skipping file '${FILE_TO_SCAN} ' since it is not part of '${FILE_WITH_SCAN_LIST} '"
98
- return 0
101
+ ALL_FILES_FROM_SCAN_LIST=$( find ${SCAN_LIST_ENTRIES} -type f | grep -E ${FILE_FILTER} | sort | uniq)
102
+
103
+ FILES_TO_SCAN_ARRAY=(${FILES_TO_SCAN} )
104
+ NUMBER_OF_FILES=${# FILES_TO_SCAN_ARRAY[@]}
105
+ if [[ ${NUMBER_OF_FILES} -gt 0 ]]
106
+ then
107
+ FILES=" "
108
+ SEPARATOR=' '
109
+ SKIP_MESSAGE_PRINTED=0
110
+ for FILE in ${FILES_TO_SCAN} ; do
111
+ if $( echo ${ALL_FILES_FROM_SCAN_LIST} | grep -q ${FILE} )
112
+ then
113
+ FILES+=" ${SEPARATOR}${FILE} "
114
+ SEPARATOR=$' \n '
115
+ else
116
+ if [[ ${SKIP_MESSAGE_PRINTED} -eq 0 ]]; then
117
+ echo -e " ${COLOR_YELLOW} Skipping files which are not part of '${FILE_WITH_SCAN_LIST} ' ...${COLOR_OFF} "
118
+ SKIP_MESSAGE_PRINTED=1
119
+ fi
120
+ echo -e " ${COLOR_YELLOW} [#]${COLOR_OFF} ${FILE} "
121
+ fi
122
+ done
123
+
124
+ if [[ ${SKIP_MESSAGE_PRINTED} -eq 1 ]]; then
125
+ echo -e " ${COLOR_YELLOW} ... end of list with skipped files!${COLOR_OFF} "
99
126
fi
127
+ scan " error" " $FILES "
128
+ else
129
+ echo " Performing full scan of all files in '${FILE_WITH_SCAN_LIST} '"
130
+ scan " error" " ${ALL_FILES_FROM_SCAN_LIST} "
131
+ fi
132
+ }
100
133
101
- echo " Scanning file: ${FILE_TO_SCAN} "
102
- $CLANG_TIDY_CMD --warnings-as-errors=* -p build $FILE_TO_SCAN
134
+ function scan() {
135
+ WARN_MODE=$1
136
+ FILES=$2
137
+ FILES_ARRAY=(${FILES} )
138
+ NUMBER_OF_FILES=${# FILES_ARRAY[@]}
139
+
140
+ if [[ $WARN_MODE == " warn" ]]; then
141
+ WARN_MODE_PARAM=" "
142
+ elif [[ $WARN_MODE == " error" ]]; then
143
+ WARN_MODE_PARAM=" --warnings-as-errors=*"
103
144
else
104
- if [[ -z $FILE_LIST ]]
105
- then
106
- echo " ' ${FILE_WITH_SCAN_LIST} ' is empty skipping folder scan. "
107
- return 0
108
- fi
109
- echo " Performing full scan of all folders in ' ${FILE_WITH_SCAN_LIST} ' "
110
- $CLANG_TIDY_CMD --warnings-as-errors= * -p build " $( find " ${FILE_LIST} " -type f | grep -E ${FILE_FILTER} ) "
145
+ echo " Invalid parameter! Must be either 'warn' or 'error' but got ' ${WARN_MODE} ' "
146
+ return 1
147
+ fi
148
+
149
+ if [[ ${NUMBER_OF_FILES} -eq 0 ]] ; then
150
+ echo -e " ${COLOR_YELLOW} -> nothing to do ${COLOR_OFF} "
151
+ return 0
111
152
fi
153
+
154
+ echo -e " ${COLOR_GREEN} Processing files ...${COLOR_OFF} "
155
+ MAX_CONCURRENT_EXECUTIONS=$( nproc)
156
+ CURRENT_CONCURRENT_EXECUTIONS=0
157
+ echo " Concurrency set to '${MAX_CONCURRENT_EXECUTIONS} '"
158
+ FILE_COUNTER=1
159
+ for FILE in $FILES ; do
160
+ # run multiple clang-tidy instances concurrently
161
+ if [[ ${CURRENT_CONCURRENT_EXECUTIONS} -ge ${MAX_CONCURRENT_EXECUTIONS} ]]; then
162
+ wait -n # wait for one of the background processes to finish
163
+ CURRENT_CONCURRENT_EXECUTIONS=$(( CURRENT_CONCURRENT_EXECUTIONS - 1 ))
164
+ fi
165
+
166
+ echo -e " ${COLOR_GREEN} [${FILE_COUNTER} /${NUMBER_OF_FILES} ]${COLOR_OFF} ${FILE} "
167
+ FILE_COUNTER=$(( FILE_COUNTER + 1 ))
168
+
169
+ if test -f " $FILE " ; then
170
+ ${CLANG_TIDY_CMD} ${WARN_MODE_PARAM} --quiet -p build ${FILE} &
171
+ CURRENT_CONCURRENT_EXECUTIONS=$(( CURRENT_CONCURRENT_EXECUTIONS + 1 ))
172
+ else
173
+ echo -e " ${COLOR_RED} File does not exist! Aborting!${COLOR_OFF} "
174
+ return 1
175
+ fi
176
+ done
177
+ # wait on each background process individually to abort script when a process exits with an error
178
+ while [[ ${CURRENT_CONCURRENT_EXECUTIONS} -ne 0 ]]; do
179
+ wait -n # wait for one of the background processes to finish
180
+ CURRENT_CONCURRENT_EXECUTIONS=$(( CURRENT_CONCURRENT_EXECUTIONS - 1 ))
181
+ done
182
+
183
+ echo -e " ${COLOR_GREEN} ... done!${COLOR_OFF} "
112
184
}
113
185
114
186
if [[ " $MODE " == " hook" * ]]; then
115
187
if [[ $2 ]]; then
116
188
FILE_WITH_SCAN_LIST=$2
117
189
fi
118
190
119
- FILES =$( git diff --cached --name-only --diff-filter=CMRT | grep -E " $FILE_FILTER " | cat)
120
- # List only added files
121
- ADDED_FILES= $( git diff --cached --name-only --diff-filter=A | grep -E " $FILE_FILTER " | cat )
122
- echo " Checking files with Clang-Tidy "
123
- echo " Number of modified files: $( echo " ${FILES} " | grep -v " ^$ " | wc -l ) "
124
- if [ -z " $FILES " ]; then
125
- echo " -> nothing to do "
191
+ MODIFIED_FILES =$( git diff --cached --name-only --diff-filter=CMRT | grep -E " $FILE_FILTER " | cat)
192
+ MODIFIED_FILES_ARRAY=( $MODIFIED_FILES )
193
+ NUMBER_OF_MODIFIED_FILES= ${ # MODIFIED_FILES_ARRAY[@]}
194
+ echo " "
195
+ echo " Checking modified files with Clang-Tidy "
196
+ if [[ $FILE_WITH_SCAN_LIST && ${NUMBER_OF_MODIFIED_FILES} -gt 0 ] ]; then
197
+ scanWithFileList " ${FILE_WITH_SCAN_LIST} " " ${MODIFIED_FILES} "
126
198
else
127
- echo " processing ..."
128
- if [[ $FILE_WITH_SCAN_LIST ]]; then
129
- for FILE_TO_SCAN in $FILES ; do
130
- echo " ${FILE_TO_SCAN} "
131
- scanWithFileList $FILE_WITH_SCAN_LIST $FILE_TO_SCAN
132
- done
133
- else
134
- $CLANG_TIDY_CMD -p build $FILES
135
- fi
136
- echo " ... done"
199
+ scan " warn" " ${MODIFIED_FILES} "
137
200
fi
138
201
139
- echo " "
140
- echo " Number of added files: $( echo " ${ADDED_FILES} " | grep -v " ^$" | wc -l) "
141
- if [ -z " $ADDED_FILES " ]; then
142
- echo " -> nothing to do"
143
- else
144
- echo " processing ..."
145
- $CLANG_TIDY_CMD --warnings-as-errors=* -p build $ADDED_FILES
146
- echo " ... done"
147
- fi
202
+ # List only added files
203
+ ADDED_FILES=$( git diff --cached --name-only --diff-filter=A | grep -E " $FILE_FILTER " | cat)
204
+ echo " "
205
+ echo " Checking added files with Clang-Tidy"
206
+ scan " error" " ${ADDED_FILES} "
207
+
148
208
exit
149
209
elif [[ " $MODE " == " full" * ]]; then
150
210
DIRECTORY_TO_SCAN=$2
@@ -153,26 +213,27 @@ elif [[ "$MODE" == "full"* ]]; then
153
213
then
154
214
if ! test -d " $DIRECTORY_TO_SCAN "
155
215
then
156
- echo " The directory which should be scanned '${DIRECTORY_TO_SCAN} ' does not exist"
216
+ echo " ${COLOR_RED} The directory which should be scanned '${DIRECTORY_TO_SCAN} ' does not exist! Aborting! ${COLOR_OFF} "
157
217
exit 1
158
218
fi
159
219
160
- echo " scanning all files in '${DIRECTORY_TO_SCAN} '"
161
- $CLANG_TIDY_CMD -p build $( find $DIRECTORY_TO_SCAN -type f | grep -E $FILE_FILTER )
220
+ echo " "
221
+ echo " Scanning all files in '${DIRECTORY_TO_SCAN} '"
222
+ FILES=$( find $DIRECTORY_TO_SCAN -type f | grep -E $FILE_FILTER )
223
+ scan " warn" " ${FILES} "
162
224
exit $?
163
225
else
164
- FILES=$( git ls-files | grep -E " $FILE_FILTER " )
226
+ FILES=$( find iceoryx_* tools/introspection -type f | grep -E " $FILE_FILTER " )
227
+ echo " "
165
228
echo " Checking all files with Clang-Tidy"
166
- echo " "
167
- echo $FILES
168
- $CLANG_TIDY_CMD -p build $FILES
229
+ scan " warn" " ${FILES} "
169
230
exit $?
170
231
fi
171
232
elif [[ " $MODE " == " scan_list" * ]]; then
172
233
FILE_WITH_SCAN_LIST=$2
173
- FILE_TO_SCAN =$3
234
+ FILES_TO_SCAN =$3 # if there is more than one file, they must be enclosed in quotes -> "file1 file2 file3"
174
235
175
- scanWithFileList $ FILE_WITH_SCAN_LIST $FILE_TO_SCAN
236
+ scanWithFileList " ${ FILE_WITH_SCAN_LIST} " " ${FILES_TO_SCAN} "
176
237
177
238
exit $?
178
239
else
0 commit comments