@@ -127,77 +127,135 @@ function regenerate_public_rbac_multi_cluster() {
127
127
}
128
128
129
129
function update_licenses() {
130
- echo ' regenerating licenses'
131
- time scripts/evergreen/update_licenses.sh 2>&1 | prepend " update_licenses"
132
- git add LICENSE-THIRD-PARTY
130
+ if [[ " ${MDB_UPDATE_LICENSES:- " " } " == " true" ]]; then
131
+ echo ' regenerating licenses'
132
+ time scripts/evergreen/update_licenses.sh 2>&1 | prepend " update_licenses"
133
+ git add LICENSE-THIRD-PARTY
134
+ fi
133
135
}
134
136
135
137
function check_erroneous_kubebuilder_annotations() {
136
138
# Makes sure there are not erroneous kubebuilder annotations that can
137
139
# end up in CRDs as descriptions.
138
140
if grep " // kubebuilder" ./* -r --exclude-dir=vendor --include=\* .go; then
139
- echo " Found an erroneous kubebuilder annotation"
141
+ echo -e " ${RED} Found an erroneous kubebuilder annotation${NO_COLOR} "
140
142
exit 1
141
143
fi
142
144
}
143
145
144
146
function check_incorrect_makefile_variable_brackets() {
145
147
if find . -name " Makefile" | grep -v vendor | xargs grep " \$ {" ; then
146
- echo ' ERROR: Makefiles should NEVER contain curly brackets variables'
148
+ echo -e " ${RED} ERROR: Makefiles should NEVER contain curly brackets variables${NO_COLOR} "
147
149
exit 1
148
150
fi
149
151
}
150
152
153
+ function validate_snippets() {
154
+ echo scripts/code_snippets/validate_snippets.py
155
+ }
156
+
157
+ # Helper function to capture background job PID with job name
158
+ capture_bg_job () {
159
+ local job_name=" $1 "
160
+ local job_pid=$!
161
+ bg_job_pids+=(" ${job_pid} " )
162
+ bg_job_pids_with_names+=(" ${job_pid} :${job_name} " )
163
+ echo " Started ${job_name} with PID: ${job_pid} "
164
+ }
165
+
166
+ get_job_name () {
167
+ local search_pid=" $1 "
168
+ local match
169
+ match=$( printf ' %s\n' " ${bg_job_pids_with_names[@]} " | grep " ^${search_pid} :" )
170
+ echo " ${match#*: } " # Remove everything up to and including the colon
171
+ }
172
+
151
173
function pre_commit() {
152
- if [[ " ${MDB_UPDATE_LICENSES:- " " } " == " true" ]]; then
153
- ( (time update_licenses) 2>&1 | prepend " update_licenses" ) &
154
- fi
155
- ( (time scripts/evergreen/lint_code.sh) 2>&1 | prepend " lint_code.sh" ) &
156
- ( (time start_shellcheck) 2>&1 | prepend " shellcheck" ) &
174
+ # Array to store background job PIDs
175
+ # IMPORTANT: ensure each task is executed in it's own subshell following the pattern:
176
+ # time new_check 2>&1 | prepend "new_check" &
177
+ # capture_bg_job "new_check"
178
+
179
+ # those bg_job_ vars are global and capture_bg_job is appending to them on each call
180
+ bg_job_pids=()
181
+ bg_job_pids_with_names=()
182
+
183
+ {
184
+ # Update release.json first in case there is a newer version
185
+ time update_release_json
186
+ # We need to generate the values files first
187
+ time update_values_yaml_files
188
+ # The values files are used for generating the standalone yaml
189
+ time generate_standalone_yaml
190
+ } 2>&1 | prepend " update_jobs" &
191
+ capture_bg_job " update_jobs"
192
+
193
+ time update_licenses 2>&1 | prepend " update_licenses" &
194
+ capture_bg_job " update_licenses"
195
+
196
+ time scripts/evergreen/lint_code.sh 2>&1 | prepend " lint_code.sh" &
197
+ capture_bg_job " lint_code.sh"
157
198
158
- # Update release.json first in case there is a newer version
159
- (time update_release_json) 2>&1 | prepend " update_release_json"
160
- # We need to generate the values files first
161
- (time update_values_yaml_files) 2>&1 | prepend " update_values_yaml_files"
162
- # The values files are used for generating the standalone yaml
163
- (time generate_standalone_yaml) 2>&1 | prepend " generate_standalone_yaml"
199
+ time start_shellcheck 2>&1 | prepend " shellcheck" &
200
+ capture_bg_job " shellcheck"
164
201
165
- ( (time regenerate_public_rbac_multi_cluster) 2>&1 | prepend " regenerate_public_rbac_multi_cluster" ) &
202
+ time validate_snippets 2>&1 | prepend " validate_snippets" &
203
+ capture_bg_job " validate_snippets"
204
+
205
+ time regenerate_public_rbac_multi_cluster 2>&1 | prepend " regenerate_public_rbac_multi_cluster" &
206
+ capture_bg_job " regenerate_public_rbac_multi_cluster"
166
207
167
208
# Run black and isort on python files that have changed
168
- ( (time python_formatting) 2>&1 | prepend " python_formatting" ) &
209
+ time python_formatting 2>&1 | prepend " python_formatting" &
210
+ capture_bg_job " python_formatting"
211
+
212
+ time check_erroneous_kubebuilder_annotations 2>&1 | prepend " check_erroneous_kubebuilder_annotations" &
213
+ capture_bg_job " check_erroneous_kubebuilder_annotations"
214
+
215
+ # add any other checks above
169
216
170
- ( (time check_erroneous_kubebuilder_annotations) 2>&1 | prepend " check_erroneous_kubebuilder_annotations" ) &
217
+ # Wait for all background jobs and check their exit codes
218
+ failures=()
219
+ for pid in " ${bg_job_pids[@]} " ; do
220
+ wait " ${pid} " || {
221
+ job_name=$( get_job_name " ${pid} " )
222
+ failures+=(" ${RED}${job_name} (PID ${pid} )${NO_COLOR} " )
223
+ }
224
+ done
171
225
172
- wait
226
+ if [[ ${# failures[@]} -gt 0 ]]; then
227
+ echo -e " ${RED} Some checks have failed:${NO_COLOR} "
228
+ for failure in " ${failures[@]} " ; do
229
+ echo -e " $failure "
230
+ done
231
+ echo -e " ${RED} To see the details look for the job's logs by it's prefixed name (e.g. \" shellcheck:\" ).${NO_COLOR} "
232
+ exit 1
233
+ fi
234
+
235
+ echo -e " ${GREEN} pre-commit: All checks passed!${NO_COLOR} "
173
236
}
174
237
175
238
# Function to run shellcheck on a single file
176
239
run_shellcheck () {
177
240
local file=" $1 "
178
241
echo " Running shellcheck on $file "
179
242
if ! shellcheck --color=always -x " $file " -e SC2154 -e SC1091 -e SC1090 -e SC2148 -o require-variable-braces -P " scripts" ; then
180
- echo " shellcheck failed on $file "
243
+ echo -e " ${RED} shellcheck failed on $file ${NO_COLOR} "
181
244
exit 1
182
245
fi
183
246
}
247
+ # Export function so it's available in subshells
248
+ export -f run_shellcheck
184
249
185
250
start_shellcheck () {
186
- files_1=$( find scripts -type f -name " *.sh" )
187
- files_2=$( find scripts/dev/contexts -type f | grep -v private-context)
188
- files_3=$( find scripts/funcs -type f)
189
- files_4=$( find public/architectures -type f -name " *.sh" )
190
- files=$( echo -e " $files_1 \n$files_2 \n$files_3 \n$files_4 " )
191
- # Process each file in parallel
192
- for file in $files ; do
193
- run_shellcheck " $file " &
194
- done
195
-
196
- # Wait for all background jobs
197
- for job in $( jobs -p) ; do
198
- wait " $job " || exit 1
199
- done
200
-
251
+ # shellcheck disable=SC2016
252
+ {
253
+ find scripts -type f -name " *.sh"
254
+ find scripts/dev/contexts -type f | grep -v private-context
255
+ find scripts/funcs -type f
256
+ find public/architectures -type f -name " *.sh"
257
+ find docs/ -type f -name " *.sh"
258
+ } | xargs -I {} -P 20 bash -c ' run_shellcheck "$1"' _ {}
201
259
}
202
260
203
261
cmd=${1:- " pre-commit" }
0 commit comments