From a2b21e910509f58a5d8c9976d46d7cd63d068ecc Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sun, 19 Dec 2021 17:19:01 -0800 Subject: [PATCH] maint: commit-msg: compute UTF-8-aware line-length * scripts/git-hooks/commit-msg: Count UTF-8 characters rather than bytes to avoid erroneously rejecting as "longer than 72" a log message line like the UTF-8 one for id.c just prior. It has 77 bytes but only 67 characters. (check_msg): Read in "utf8" mode. Also include actual length in the diagnostic. (main): Don't loop when stdout is redirected, as it is when invoked via vc-dwim. Paul Eggert reported privately both the error of counting bytes rather than chars and the re_edit loop when failing via vc-dwim. --- scripts/git-hooks/commit-msg | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/git-hooks/commit-msg b/scripts/git-hooks/commit-msg index 9c80406d9..7a99e45aa 100755 --- a/scripts/git-hooks/commit-msg +++ b/scripts/git-hooks/commit-msg @@ -87,7 +87,7 @@ sub check_msg($$) my ($log_file, $line_ref) = @_; local *LOG; - open LOG, '<', $log_file + open LOG, '<:utf8', $log_file or return "failed to open for reading: $!"; @$line_ref = ; close LOG; @@ -117,10 +117,12 @@ sub check_msg($$) and return 'second line must be empty'; # Limit line length to allow for the ChangeLog's leading TAB. + my $max_len = 72; foreach my $line (@line) { - 72 < length $line && $line =~ /^[^#]/ - and return 'line longer than 72'; + my $len = length $line; + $max_len < $len && $line =~ /^[^#]/ + and return "line length ($len) greater than than max: $max_len"; } my $buf = join ("\n", @line) . "\n"; @@ -149,6 +151,7 @@ sub check_msg($$) $err eq '' and last; $err = "$ME: $err\n"; + -t STDOUT or die $err; warn $err; # Insert the diagnostic as a comment on the first line of $log_file. rewrite $log_file, $err, \@line;