From 9914de503bd39b5a8b55a472d7cee6832a72e61d Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Fri, 21 Apr 2023 10:06:49 -0700 Subject: [PATCH] Improve the logic of the file entry Git hooks to support more cases In addition to starting with a "*", file entries now need a ":" somewhere in them. This helps reduce false positives with bulleted lists. Also, support multiple files separated by commas after a "*". * build-aux/git-hooks/commit-msg-files.awk (check_commit_msg_files): Accumulate file entries over multiple lines to support the above. --- build-aux/git-hooks/commit-msg-files.awk | 31 ++++++++++++++++++------ 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/build-aux/git-hooks/commit-msg-files.awk b/build-aux/git-hooks/commit-msg-files.awk index 3856e474d3e..2117681343f 100644 --- a/build-aux/git-hooks/commit-msg-files.awk +++ b/build-aux/git-hooks/commit-msg-files.awk @@ -59,15 +59,28 @@ function check_commit_msg_files(commit_sha, verbose, changes, good, \ if (verbose && ! msg) msg = $0 - # Find lines that reference files. We look at any line starting - # with "*" (possibly prefixed by "; ") where the file part starts - # with an alphanumeric character. The file part ends if we - # encounter any of the following characters: [ ( < { : - if (/^(; )?\*[ \t]+[[:alnum:]]/ && match($0, /[[:alnum:]][^[(<{:]*/)) { - # There might be multiple files listed on this line, separated + # Find file entries in the commit message. We look at any line + # starting with "*" (possibly prefixed by "; ") followed by a ":", + # possibly on a different line. If we encounter a blank line + # without seeing a ":", then we don't treat that as a file entry. + + # Accumulate the contents of a (possible) file entry. + if (/^[ \t]*$/) + filenames_str = "" + else if (/^(; )?\*[ \t]+[[:alnum:]]/) + filenames_str = $0 + else if (filenames_str) + filenames_str = (filenames_str $0) + + # We have a file entry; analyze it. + if (filenames_str && /:/) { + # Delete the leading "*" and any trailing information. + sub(/^(; )?\*[ \t]+/, "", filenames_str) + sub(/[ \t]*[[(<:].*$/, "", filenames_str) + + # There might be multiple files listed in this entry, separated # by spaces (and possibly a comma). Iterate over each of them. - split(substr($0, RSTART, RLENGTH), filenames, ",?([[:blank:]]+|$)") - + split(filenames_str, filenames, ",[ \t]+") for (i in filenames) { # Remove trailing slashes from any directory entries. sub(/\/$/, "", filenames[i]) @@ -83,6 +96,8 @@ function check_commit_msg_files(commit_sha, verbose, changes, good, \ good = 0 } } + + filenames_str = "" } } close(cmd) -- 2.39.2