#!/bin/sh # Check the format of GNU Emacs change log entries. # Copyright 2014-2015 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 . # 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; see 'CONTRIBUTE'" 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; see 'CONTRIBUTE'" status = 1 } } nlines == 2 && $0 ~ non_space { print "Nonempty second line in commit message; see 'CONTRIBUTE'" status = 1 } { # 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; see 'CONTRIBUTE'" status = 1 } 140 < length { print "Word longer than 140 characters in commit message; see 'CONTRIBUTE'" status = 1 } /^Signed-off-by: / { print "'\''Signed-off-by:'\'' in commit message; see 'CONTRIBUTE'" status = 1 } $0 ~ non_print { print "Unprintable character in commit message; see 'CONTRIBUTE'" status = 1 } END { if (nlines == 0) { print "Empty commit message; see 'CONTRIBUTE'" status = 1 } exit status } ' <"$1"