]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
maint: commit-msg: compute UTF-8-aware line-length
authorJim Meyering <meyering@fb.com>
Mon, 20 Dec 2021 01:19:01 +0000 (17:19 -0800)
committerJim Meyering <meyering@fb.com>
Mon, 20 Dec 2021 18:46:11 +0000 (10:46 -0800)
* 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

index 9c80406d990b8470a6a748013ac7cc9c1aee35a6..7a99e45aafb043f7d0a1e6bc654852b86dc7eda5 100755 (executable)
@@ -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 = <LOG>;
   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;