@@ -124,6 +124,41 @@ read_commit_message() {
124
124
done < $COMMIT_MSG_FILE
125
125
}
126
126
127
+ # Get positions (line, column) for each target word in a multiline string.
128
+ # Output format: "target: line"
129
+ get_all_match_positions () {
130
+ local text=" $1 "
131
+ local targets=" $2 "
132
+ local start_line=1
133
+ local start_col=1
134
+
135
+ while IFS= read -r target; do
136
+ # search for the target string
137
+ local result
138
+ result=$(
139
+ awk -v t=" $target " -v sl=" $start_line " -v sc=" $start_col " ' {
140
+ if (NR < sl) next
141
+ pos = index(NR == sl ? substr($0, sc) : $0, t)
142
+ if (pos) {
143
+ print NR, (NR == sl ? pos + sc - 1 : pos)
144
+ exit
145
+ }
146
+ }' <<< " $text"
147
+ )
148
+
149
+ # skip if the target is not found
150
+ [ -z " $result " ] && continue
151
+
152
+ # output and update states
153
+ local line col
154
+ read -r line col <<< " $result"
155
+ echo " $target : $line "
156
+ start_line=" $line "
157
+ start_col=$(( col + 1 ))
158
+
159
+ done <<< " $targets"
160
+ }
161
+
127
162
#
128
163
# Validate the contents of the commmit msg agains the good commit guidelines.
129
164
#
@@ -348,8 +383,10 @@ done
348
383
# 12. Avoid abusive language in commit message content
349
384
# ------------------------------------------------------------------------------
350
385
351
- FULL_COMMIT_MSG=$( sed ' /^#/d;/^[[:space:]]*$/d;/^[[:space:]]*Change-Id:/d' " $COMMIT_MSG_FILE " | \
352
- sed -E " s@${URL_REGEX# ^} @@g" )
386
+ FULL_COMMIT_MSG_WITH_SPACE=$( sed ' /^#/d;/^[[:space:]]*Change-Id:/d' " $COMMIT_MSG_FILE " | \
387
+ sed -E " s@${URL_REGEX# ^} @@g" )
388
+ FULL_COMMIT_MSG=$( echo " $FULL_COMMIT_MSG_WITH_SPACE " | sed ' /^[[:space:]]*$/d' )
389
+
353
390
# Extended list of abusive words (case-insensitive).
354
391
# Adjust the list as needed.
355
392
ABUSIVE_WORDS_REGEX=' \b(fuck|fucking|dick|shit|bitch|asshole|cunt|motherfucker|damn|crap|dumbass|piss)\b'
@@ -367,16 +404,20 @@ done
367
404
add_warning 1 " Commit message appears to be written in Chinese: $MISSPELLED_WORDS "
368
405
fi
369
406
370
- # Remove quoted text and commit hashes from $FULL_COMMIT_MSG for spell checking.
371
- # Handles commit references like "commit 7d05741" (short) or full 40-char hashes.
372
- MSG_FOR_SPELLCHECK=$( echo " $FULL_COMMIT_MSG " | sed -E \
407
+ MSG_FOR_SPELLCHECK_LINE_FINDING=$( echo " $FULL_COMMIT_MSG_WITH_SPACE " | sed -E \
373
408
-e " s/(['\" ][^'\" ]*['\" ])//g" \
374
409
-e " s/\bcommit[[:space:]]+[0-9a-fA-F]{7,40}\b/commit/g" )
375
-
410
+ MSG_FOR_SPELLCHECK=$( echo " $MSG_FOR_SPELLCHECK_LINE_FINDING " | sed ' /^[[:space:]]*$/d' )
411
+
412
+
376
413
# Use aspell to list misspelled words according to American English, ignoring quoted text.
377
414
MISSPELLED_WORDS=$( echo " $MSG_FOR_SPELLCHECK " | $ASPELL --lang=en --list --home-dir=scripts --personal=aspell-pws)
378
415
if [ -n " $MISSPELLED_WORDS " ]; then
379
- add_warning 1 " Avoid using non-American English words"
416
+ results=$( get_all_match_positions " $MSG_FOR_SPELLCHECK_LINE_FINDING " " $MISSPELLED_WORDS " )
417
+
418
+ while read -r result; do
419
+ add_warning " ${result#*: } " " Avoid using non-American English words: ${result%%:* } "
420
+ done <<< " $results"
380
421
fi
381
422
}
382
423
0 commit comments