X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/75b4857ef040863b4d53ea2a27993fdd8370f7af..adb69ddff05ce770261e03d249f2e31e75c098af:/build-aux/git-hooks/commit-msg diff --git a/build-aux/git-hooks/commit-msg b/build-aux/git-hooks/commit-msg index 5eb994c6fe..96613765d3 100755 --- a/build-aux/git-hooks/commit-msg +++ b/build-aux/git-hooks/commit-msg @@ -1,7 +1,7 @@ #!/bin/sh # Check the format of GNU Emacs change log entries. -# Copyright 2014 Free Software Foundation, Inc. +# Copyright 2014-2015 Free Software Foundation, Inc. # This file is part of GNU Emacs. @@ -29,38 +29,52 @@ fi # Use a UTF-8 locale if available, so that the UTF-8 check works. # Use U+00A2 CENT SIGN to test whether the locale works. -cent_sign_utf8_octal='\302\242' -at_sign=` - printf "${cent_sign_utf8_octal}@" | - $awk '{print substr($0, 2)}' 2>/dev/null -` +cent_sign_utf8_format='\302\242\n' +cent_sign=`printf "$cent_sign_utf8_format"` +print_at_sign='BEGIN {print substr("'$cent_sign'@", 2)}' +at_sign=`$awk "$print_at_sign" /dev/null` if test "$at_sign" != @; then - at_sign=` - printf "${cent_sign_utf8_octal}@" | - LC_ALL=en_US.UTF-8 $awk '{print substr($0, 2)}' 2>/dev/null - ` + at_sign=`LC_ALL=en_US.UTF-8 $awk "$print_at_sign" /dev/null` if test "$at_sign" = @; then - LC_ALL=en_US.UTF-8; export LC_ALL + LC_ALL=en_US.UTF-8 + else + LC_ALL=C fi + export LC_ALL fi # Check the log entry. -exec $awk ' +exec $awk -v at_sign="$at_sign" -v cent_sign="$cent_sign" ' BEGIN { + # These regular expressions assume traditional Unix unibyte behavior. + # They are needed for old or broken versions of awk, e.g., + # mawk 1.3.3 (1996), or gawk on MSYS (2015), and/or for systems that + # cannot use UTF-8 as the codeset for the locale. + space = "[ \f\n\r\t\v]" + non_space = "[^ \f\n\r\t\v]" + # The non_print below rejects control characters and surrogates + # UTF-8 for: 0x01-0x1f 0x7f 0x80-0x9f 0xd800-0xdbff 0xdc00-0xdfff + non_print = "[\1-\37\177]|\302[\200-\237]|\355[\240-\277][\200-\277]" + + # Prefer POSIX regular expressions if available, as they do a + # better job of checking. Similarly, prefer POSIX negated + # expressions if UTF-8 also works. if (" " ~ /[[:space:]]/) { space = "[[:space:]]" - non_space = "[^[:space:]]" - non_print = "[^[:print:]]" - } else { - # mawk 1.3.3 does not support POSIX bracket expressions. - # Approximate them as best we can. - space = "[ \f\n\r\t\v]" - non_space = "[^ \f\n\r\t\v]" - non_print = "[\1-\37\177]" + if (at_sign == "@" && cent_sign ~ /^[[:print:]]$/) { + non_space = "[^[:space:]]" + non_print = "[^[:print:]]" + } } } - /^#/ { next } + /^#/ { + # Ignore every line after a scissors line. + if (/^# *---* *(>[8%]|[8%]<) *---* *$/) { exit } + + # Ignore comment lines. + next + } !/^.*$/ { print "Invalid character (not UTF-8) in commit message" @@ -87,8 +101,17 @@ exec $awk ' status = 1 } - 72 < length && $0 ~ space { - print "Line longer than 72 characters in commit message" + { + # Expand tabs to spaces for length calculations etc. + while (match($0, /\t/)) { + before_tab = substr($0, 1, RSTART - 1) + after_tab = substr($0, RSTART + 1) + $0 = sprintf("%s%*s%s", before_tab, 8 - (RSTART - 1) % 8, "", after_tab) + } + } + + 78 < length && $0 ~ space { + print "Line longer than 78 characters in commit message" status = 1 } @@ -103,12 +126,7 @@ exec $awk ' } $0 ~ non_print { - if (gsub(/\t/, "")) { - print "Tab in commit message; please use spaces instead" - } - if ($0 ~ non_print) { - print "Unprintable character in commit message" - } + print "Unprintable character in commit message" status = 1 } @@ -117,6 +135,9 @@ exec $awk ' print "Empty commit message" status = 1 } + if (status != 0) { + print "Commit aborted; please see the file 'CONTRIBUTE'" + } exit status } ' <"$1"