| #!/bin/sh |
| |
| # An example hook script for catching duplicate or malformed Co-authored-by |
| # or Copyright-paperwork-exempt lines in the commit message. |
| # Written by Gary V. Vaughan <gary@gnu.org>, 2011 |
| |
| # Copyright (C) 2011-2019, 2021-2025 Free Software Foundation, Inc. |
| # This is free software; see the source for copying conditions. There is NO |
| # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| |
| # Libtoolize 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 2 of the License, or |
| # (at your option) any later version. |
| # |
| # Libtoolize 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 this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| |
| : ${SED="sed"} |
| test "${ECHO+set}" = set || ECHO='printf %s\n' |
| |
| basename='s|^.*/||' |
| |
| nl=' |
| ' |
| |
| progpath=$0 |
| progname=`$ECHO "$progpath" |$SED -e "$basename"` |
| |
| log_file=$1 |
| export log_file |
| |
| fn_error () |
| { |
| prefix="$progname: error: " |
| |
| save_IFS=$IFS |
| IFS=$nl |
| for line in $*; do |
| IFS=$save_IFS |
| $ECHO "$prefix$line" 1>&2 |
| prefix="$progname: " |
| done |
| IFS=$save_IFS |
| } |
| |
| fn_re_edit () |
| { |
| $ECHO 'Press return to edit. Ctrl-C to abort...' >&2 |
| read v |
| ${EDITOR-'vi'} "$log_file" |
| } |
| |
| fn_rewrite () |
| { |
| # Output once to stderr |
| fn_error "$*" |
| |
| # And again as a comment in the log_file ready for re-editing |
| $ECHO "$*" |$SED 's|^|# |' |
| echo |
| cat "$log_file" |
| } |
| |
| fn_check_msg () |
| { |
| return_status=0 |
| |
| CAB_re='^Co-authored-by: ' |
| CPR_re='^Copyright-paperwork-exempt: ' |
| |
| # Flag duplicated Co-authored-by lines. |
| dups=`grep "$CAB_re" "$log_file" 2>/dev/null \ |
| |sort |uniq -c |sed -e '/^[ ]*1[ ]/d'` |
| |
| test -n "$dups" && { |
| $ECHO 'Duplicate Co-authored-by lines: |
| '"$dups" |
| return_status=1 |
| } |
| |
| # Make sure each Co-authored-by line contains a valid email. |
| email_re='<.*@.*\..*>' |
| |
| grep "$CAB_re" "$log_file" 2>/dev/null \ |
| |while read CAB; do |
| test 0 -eq `expr "$CAB" : ".*$email_re"` && { |
| echo "Malformed or missing email in '$CAB'" |
| return_status=1 |
| } |
| done |
| |
| # Flag duplicated Copyright-paperwork-exempt lines. |
| count=`grep "$CPR_re" "$log_file" 2>/dev/null \ |
| |wc |sed -e 's|^[ ]*||;s|[ ].*$||'` |
| |
| test 2 -gt "$count" || { |
| $ECHO 'More than one Copyright-paperwork-exempt line.' |
| return_status=1 |
| } |
| |
| # Make sure Copyright-paperwork-exempt line is valid. |
| if grep "$CPR_re[Nn]" "$log_file" >/dev/null 2>&1; then |
| $ECHO "\ |
| 'Copyright-paperwork-exempt: No' is redundant, please remove." |
| return_status=1 |
| else |
| not_yes=`grep "$CPR_re" "$log_file" 2>/dev/null \ |
| |grep -v "${CPR_re}Yes\$"` |
| |
| test -n "$not_yes" && { |
| $ECHO "'Copyright-paperwork-exempt' setting must be 'Yes'." |
| return_status=1 |
| } |
| fi |
| |
| return $return_status |
| } |
| |
| while :; do |
| err=`fn_check_msg` && break |
| fn_rewrite "$err" > "${log_file}T" && mv "${log_file}T" "$log_file" |
| fn_re_edit |
| done |