| #!/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 <https://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 |