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