mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-06 06:20:55 -08:00
Problem reported by Ted Zlatanov in: http://lists.gnu.org/archive/html/emacs-devel/2014-12/msg01093.html * build-aux/git-hooks/commit-msg (space, non_space, non_print): New vars. Use them as approximations to POSIX bracket expressions, on implementations like mawk that do not support POSIX regexps.
122 lines
2.9 KiB
Bash
Executable file
122 lines
2.9 KiB
Bash
Executable file
#!/bin/sh
|
|
# Check the format of GNU Emacs change log entries.
|
|
|
|
# Copyright 2014 Free Software Foundation, Inc.
|
|
|
|
# This file is part of GNU Emacs.
|
|
|
|
# GNU Emacs is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
# GNU Emacs is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Written by Paul Eggert.
|
|
|
|
# Prefer gawk if available, as it handles NUL bytes properly.
|
|
if type gawk >/dev/null 2>&1; then
|
|
awk=gawk
|
|
else
|
|
awk=awk
|
|
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
|
|
`
|
|
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
|
|
`
|
|
if test "$at_sign" = @; then
|
|
LC_ALL=en_US.UTF-8; export LC_ALL
|
|
fi
|
|
fi
|
|
|
|
# Check the log entry.
|
|
exec $awk '
|
|
BEGIN {
|
|
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]"
|
|
}
|
|
}
|
|
|
|
/^#/ { next }
|
|
|
|
!/^.*$/ {
|
|
print "Invalid character (not UTF-8) in commit message"
|
|
status = 1
|
|
}
|
|
|
|
nlines == 0 && $0 !~ non_space { next }
|
|
|
|
{ nlines++ }
|
|
|
|
nlines == 1 {
|
|
# Ignore special markers used by "git rebase --autosquash".
|
|
if (! sub(/^fixup! /, ""))
|
|
sub(/^squash! /, "")
|
|
|
|
if ($0 ~ "^" space) {
|
|
print "White space at start of commit message'\''s first line"
|
|
status = 1
|
|
}
|
|
}
|
|
|
|
nlines == 2 && $0 ~ non_space {
|
|
print "Nonempty second line in commit message"
|
|
status = 1
|
|
}
|
|
|
|
72 < length && $0 ~ space {
|
|
print "Line longer than 72 characters in commit message"
|
|
status = 1
|
|
}
|
|
|
|
140 < length {
|
|
print "Word longer than 140 characters in commit message"
|
|
status = 1
|
|
}
|
|
|
|
/^Signed-off-by: / {
|
|
print "'\''Signed-off-by:'\'' in commit message"
|
|
status = 1
|
|
}
|
|
|
|
$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"
|
|
}
|
|
status = 1
|
|
}
|
|
|
|
END {
|
|
if (nlines == 0) {
|
|
print "Empty commit message"
|
|
status = 1
|
|
}
|
|
exit status
|
|
}
|
|
' <"$1"
|