#! /bin/sh

# clcommit (GNU cvs-utils) version 0.11
# Written by Gary V. Vaughan <gary@gnu.org>
# and Alexandre Oliva <aoliva@redhat.com>

# Copyright (C) 1999, 2000, 2004 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.

# This program 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.
#
# This program 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, a copy can be downloaded from
# http://www.gnu.org/copyleft/gpl.html, or by writing to the Free
# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
# MA 02111-1307, USA.

# Usage: $progname [-v] [-h] [-f] [-l] [-n] [-q] [-z N] [-C ChangeLog_file]
#          [-m msg|-F msg_file|-1] [-s addr [--from addr]] [--] [file|dir ...]

# -C file --changelog=file   extract commit message from specified ChangeLog
# -zN     --compress=N       set compression level (0-9, 0=none, 9=max)
# -n      --dry-run          don't commit anything
#         --fast             same as --force --first
# -F file --file=file        read commit message from file
# -1      --first            extract first entry from ChangeLog, no cvs diff
# -f      --force            don't check (unless *followed* by -n), and just
#                            display commit message instead of running $PAGER
#         --from=addr        override default from address in commit email
# -l      --local            don't descend into subdirectories
# -m msg  --message=msg      set commit message
#         --msg=msg          same as -m
# -q      --quiet            run cvs in quiet mode
# -s addr --sendmail=addr    send a commit email of the differences to ADDR
#         --signature[=file] add FILE to the end of the email (~/.signature)
# -v      --version          print version information
# -h,-?   --help             print short or long help message

# This script eases checking in changes to CVS-maintained projects
# with ChangeLog files.  It will check that there have been no
# conflicting commits in the CVS repository and print which files it
# is going to commit to stderr.  A list of files to compare and to
# check in can be given in the command line.  If it is not given, all
# files in the current directory (and below, unless `-l' is given) are
# considered for check in.

# The commit message will be extracted from the differences between a
# file named ChangeLog* in the commit list, or named after -C, and the
# one in the repository (unless a message was specified with `-m' or
# `-F').  An empty message is not accepted (but a blank line is).  If
# the message is acceptable, it will be presented for verification
# (and possible edition) using the $PAGER environment variable (or
# `more', if it is not set, or `cat', if the `-f' switch is given).
# If $PAGER exits successfully, the modified files (at that moment)
# are checked in, unless `-n' was specified, in which case nothing is
# checked in.

# Report bugs to <gary@gnu.org>

: ${CVS="cvs"}
: ${MAILNOTIFY="./mailnotify"}
: ${MKSTAMP="./mkstamp"}
: ${MV="mv -f"}
: ${RM="rm -f"}
: ${SED="sed"}

SHELL="/bin/sh"

dirname="s,/[^/]*$,,"
basename="s,^.*/,,g"

# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
# is ksh but when the shell is invoked as "sh" and the current value of
# the _XPG environment variable is not equal to 1 (one), the special
# positional parameter $0, within a function call, is the name of the
# function.
progpath="$0"

# The name of this program:
progname=`echo "$progpath" | $SED $basename`
PROGRAM=clcommit

# Global variables:
EXIT_SUCCESS=0
EXIT_FAILURE=1

cvs_flags=
update_flags=
commit_flags=
opt_commit=:
opt_update=:
opt_first=false

sendmail_to="Libtool Commit <libtool-commit@gnu.org>"
sendmail_from=
exit_cmd=:

# Locations for important files
signature_file=
log_file="${TMPDIR-/tmp}/commitlog.$$"

$RM "${log_file}*"
trap '$RM "${log_file}*"; exit $EXIT_FAILURE' 1 2 15

set -e


# func_echo arg...
# Echo program name prefixed message.
func_echo ()
{
    echo $progname: ${1+"$@"}
}

# func_error arg...
# Echo program name prefixed message to standard error.
func_error ()
{
    echo $progname: ${1+"$@"} 1>&2
}

# func_fatal_error arg...
# Echo program name prefixed message to standard error, and exit.
func_fatal_error ()
{
    func_error ${1+"$@"}
    exit $EXIT_FAILURE
}

# func_verbose arg...
# Echo program name prefixed message in verbose mode only.
func_verbose ()
{
    $opt_verbose && func_error ${1+"$@"}
}

# func_fatal_help arg...
# Echo program name prefixed message to standard error, followed by
# a help hint, and exit.
func_fatal_help ()
{
    func_error ${1+"$@"}
    func_fatal_error "Try \`$progname --help' for more information."
}

# func_missing_arg argname
# Echo program name prefixed message to standard error and set global
# exit_cmd.
func_missing_arg ()
{
   func_error "missing argument for $1"
   exit_cmd=exit
}

# func_usage
# Echo short help message to standard output and exit.
func_usage ()
{
    $SED '/^# Usage:/,/# -h/ {
        s/^# //; s/^# *$//;
	s/\$progname/'$progname'/;
	p;
    }; d' < "$progpath"
    echo
    echo "run \`$progname --help | more' for full usage"
    exit $EXIT_SUCCESS
}

# func_help
# Echo long help message to standard output and exit.
func_help ()
{
    $SED '/^# Usage:/,/# Report bugs to/ {
        s/^# //; s/^# *$//;
	s/\$progname/'$progname'/;
	p;
     }; d' < "$progpath"
    exit $EXIT_SUCCESS
}

# func_version
# Echo version message to standard output and exit.
func_version ()
{
    $SED '/^# '$PROGRAM' (GNU /,/# warranty; / {
        s/^# //; s/^# *$//;
        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/;
        p;
     }; d' < "$progpath"
     exit $EXIT_SUCCESS
}

# Parse options once, thoroughly.  This comes as soon as possible in
# the script to make things like `libtoolize --version' happen quickly.
{
  # sed scripts:
  my_sed_single_opt='1s/^\(..\).*$/\1/;q'
  my_sed_single_rest='1s/^..\(.*\)$/\1/;q'
  my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
  my_sed_long_arg='1s/^--[^=]*=//'

  # this just eases exit handling
  while test $# -gt 0; do
    opt="$1"
    shift
    case $opt in

      --fast)		set -- --force --first ${1+"$@"}	;;

      -f|--force)	opt_update=false; PAGER=cat		;;

      --from)		test $# = 0 && func_missing_arg $opt && break
			sendmail_from="$1"
			shift
			;;

      -l|--local)	update_flags="$update_flags -l"
			commit_flags="$commit_flags -l"
			;;

      -m|--message|--msg)
			test $# = 0 && func_missing_arg $opt && break
			if $opt_first || test -f "$log_file"; then
			  func_error "you can have at most one of -m, -F and -1"
			  break
			fi
			echo "$1" > "$log_file"
			shift
			;;

      -F|--file)	test $# = 0 && func_missing_arg $opt && break
			if $opt_first || test -f "$log_file"; then
			  func_error "you can have at most one of -m, -F and -1"
			  break
			fi
			if cat < "$1" > "$log_file"; then :; else
			  break
			fi
			shift
			;;

      -1|--first)       if test -f "$log_File"; then
	    		  func_error "you can have at most one of -m, -F and -1"
			  break
			fi
			opt_first=:
			;;

      -C|--[cC]hange[lL]og)
			test $# = 0 && func_missing_arg $opt && break
			if test -f "$1"; then :; else
			  func_error "ChangeLog file \`$1' does not exist"
			  break
			fi
			ChangeLog="$1"
			shift
			;;

      -n|--dry-run)	opt_commit=false; opt_update=:		;;

      -q|--quiet)	cvs_flags="$cvs_flags -q"		;;

      -s|--sendmail)	test $# = 0 && func_missing_arg $opt && break
      			sendmail_to="$1"
			shift
			;;

    --signature)	test $# = 0 && func_missing_arg $opt && break
    			signature_file="$HOME/.signature"
			case $1 in
			  -*) ;;
			  *)  signature_file="$1"; shift ;;
			esac
			if test -f "$signature_file"; then :; else
			  func_error "\`$signature_file': file not found"
			  break
			fi
			;;

      -z|--compress)
			test $# = 0 && func_missing_arg $opt && break
			case "$1" in
			  [0-9]) :;;
			  *)  func_error "invalid argument for $opt"
			      break
			      ;;
			esac
			cvs_flags="$cvs_flags -z$1"
			shift
			;;

      # Separate optargs to long options:
      --message=*|--msg=*|--from=*|--file=*|--[Cc]hange[Ll]og=*|--compress=*|--sendmail=*|--signature=*)
			arg=`echo "$opt" | $SED "$my_sed_long_arg"`
			opt=`echo "$opt" | $SED "$my_sed_long_opt"`
			set -- "$opt" "$arg" ${1+"$@"}
			;;

      # Separate optargs to short options:
      -m*|-F*|-C*|-s*|-z*)
			arg=`echo "$opt" |$SED "$my_sed_single_rest"`
			opt=`echo "$opt" |$SED "$my_sed_single_opt"`
			set -- "$opt" "$arg" ${1+"$@"}
			;;

      # Separate non-argument short options:
      -f*|-1*|-n*|-q*)
			rest=`echo "$opt" |$SED "$my_sed_single_rest"`
			opt=`echo "$opt" |$SED "$my_sed_single_opt"`
			set -- "$opt" "-$rest" ${1+"$@"}
			;;

      -\?|-h)		func_usage					;;
      --help)		func_help					;;
      --version)	func_version					;;
      --)		break						;;
      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
      *)		set -- "$opt" ${1+"$@"};	break		;;
    esac
  done

  if test -z "$sendmail_to"; then

    # can't have a from address without a destination address
    test -n "$sendmail_from" &&
      func_error "can't use --from without --sendmail." && exit_cmd=exit

    # can't use a signature file without a destination address
    test -n "$signature_file" &&
      func_error "can't use --signature without --sendmail." && exit_cmd=exit
  fi

  # Bail if the options were screwed
  $exit_cmd $EXIT_FAILURE
}


$opt_update && {
   func_error "$progname: checking for conflicts..."
   if ( $CVS $cvs_flags -q -n update $update_flags ${1+"$@"} |
          while read line; do
	    echo "$line"
	    echo "$line" >&3
          done | grep '^C'
      ) 3>&1 >/dev/null; then
    func_fatal_error "some conflicts were found, aborting..."
  fi
}

if test -f "$log_file"; then :; else
  if test -z "$ChangeLog"; then
    for f in ${1+"$@"}; do
      case "$f" in
        ChangeLog* | */ChangeLog*)
          if test -z "$ChangeLog"; then
	    ChangeLog="$f"
	  else
	    func_fatal_error "multiple ChangeLog files: $ChangeLog and $f"
	  fi
	;;
      esac
    done
  fi

  func_error "$progname: checking commit message..."
  if $opt_first; then
    skipping=:
    sed 's,^,+,' < ${ChangeLog-ChangeLog} |
      while read line; do
        case "$line" in
          "+") if $skipping; then skipping=false; else break; fi;;
          "+ "*)
	    func_error "*** Warning: lines should start with tabs, not spaces; ignoring line:"
	    echo "$line" | sed 's/^.//' >&2;;
          "+	"*)
            $skipping || echo "$line" ;;
        esac
      done |
        sed 's,^\+	,,' > "$log_file" || exit $EXIT_FAILURE
  else
    $CVS $cvs_flags diff -u ${ChangeLog-ChangeLog} |
      while read line; do
        case $line in
          "--- "*) :;;
          "-"*)
	    func_error "*** Warning: the following line in ChangeLog diff is suspicious:"
	    echo "$line" | sed 's/^.//' >&2;;
          "+ "*)
	    func_error "*** Warning: lines should start with tabs, not spaces; ignoring line:"
	    echo "$line" | sed 's/^.//' >&2;;
          "+") echo ;;
          "+	"*) echo "$line";;
        esac
      done |
        sed -e 's,\+	,,' -e '/./p' -e '/./d' -e '1d' -e '$d' > "$log_file" \
    || exit $EXIT_FAILURE
  fi
  # The sed script above removes "+TAB" from the beginning of a line, then
  # deletes the first and/or the last line, when they happen to be empty
fi

grep '[^ 	]' < "$log_file" > /dev/null ||
  func_fatal_error "empty commit message, aborting"

if grep '^$' < "$log_file" > /dev/null; then
  func_error "*** Warning: blank lines should not appear within commit messages."
  func_error "*** They should be used to separate distinct commits."
fi

${PAGER-more} "$log_file" || exit $EXIT_FAILURE

sleep 1 # give the user some time for a ^C

filelist=`cvs -nq up 2>/dev/null | grep '^[MAD] ' | sed 's/^. //'`

# Do not check for empty $log_file again, even though the user might have
# zeroed it out.  If s/he did, it was probably intentional.

if $opt_commit; then
  $CVS $cvs_flags commit $commit_flags -F $log_file ${1+"$@"} || exit $EXIT_FAILURE
fi

# Send a copy of the log_file if sendmail_to was set:
if test -n "$sendmail_to"; then
  notify_file="${log_file}.2"
  func_error "Mailing commit notification to $sendmail_to"
  test $# -gt 0 && filelist="$@"

  {
    test -f CVS/Root &&
        echo "CVSROOT:	`sed -e 's,.*:,,g' CVS/Root`"
    test -f $MKSTAMP &&
        echo "TIMESTAMP:	`$SHELL $MKSTAMP < ./ChangeLog`"
    test -f CVS/Repository &&
        echo "Module name:	`cat CVS/Repository`"
    test -f CVS/Tag &&
        echo "Branch:		`sed -e 's,^T,,;1q' CVS/Tag`"
    test -f CVS/Root &&
        echo "Changes by:	`sed -e 's,:.*$,,g;s,^.*:,,' CVS/Root`"
    echo ""
    echo "Log Message:"
    sed -e 's,^,	,' "$log_file"
    test -f "$signature_file" && cat "$signature_file"
  } > "$notify_file"

  if test -n "$sendmail_from"; then
    $SHELL $MAILNOTIFY -F "$sendmail_from" -s "`echo $filelist`" -f "$notify_file" -m "text/plain" "$sendmail_to"
  else
    $SHELL $MAILNOTIFY -s "`echo $filelist`" -f "$notify_file" -m "text/plain" "$sendmail_to"
  fi
fi

$RM "${log_file}*"

exit $EXIT_SUCCESS

# Local Variables:
# mode:shell-script
# sh-indentation:2
# End:
