#! /bin/sh

# commit version 0.9.2

# Copyright (C) 1999, Free Software Foundation

# This script is Free Software, and it can be copied, distributed and
# modified as defined in the GNU General Public License.  A copy of
# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html

# Originally by Gary V. Vaughan <gvaughan@oranda.demon.co.uk>
# Heavily modified by Alexandre Oliva <oliva@dcc.unicamp.br>

# This scripts 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
# the local ChangeLog 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.

# usage: commit [-v] [-h] [-f] [-l] [-n] [-q] [-z N]
#               [-m msg|-F msg_file] [--] [file|dir ...]

# -f      --fast        don't check (unless *followed* by -n), and just 
#         --force       display commit message instead of running $PAGER
# -l      --local       don't descend into subdirectories
# -m msg  --message=msg set commit message
#         --msg=msg     same as -m
# -F file --file=file   read commit message from file
# -n      --dry-run     don't commit anything
# -q      --quiet       run cvs in quiet mode
# -zN     --compress=N  set compression level (0-9, 0=none, 9=max)
# -v      --version     print version information
# -h,-?   --help        print short or long help message

name=commit
cvsopt=
updateopt=
commitopt=
dry_run=false
commit=:
update=:
log_file="${TMPDIR-/tmp}/commitlog.$$"

rm -f "$log_file"
trap 'rm -f "$log_file"; exit 1' 1 2 15

# this just eases exit handling
main_repeat=":"
while $main_repeat; do

repeat="test $# -gt 0"
while $repeat; do
    case "$1" in
    -f|--force|--fast)
	update=false
	PAGER=cat
	shift
	;;
    -l|--local)
	updateopt="$updateopt -l"
	commitopt="$commitopt -l"
	shift
	;;
    -m|--message|--msg)
	if test $# = 1; then
	    echo "$name: missing argument for $1" >&2
	    break
	fi
	if test -f "$log_file"; then
	    echo "$name: you can have at most one of -m and -F" >&2
	    break
	fi
	shift
	echo "$1" > "$log_file"
	shift
	;;
    -F|--file)
	if test -f "$log_file"; then
	    echo "$name: you can have at most one of -m and -F" >&2
	    break
	fi
	if test $# = 1; then
	    echo "$name: missing argument for $1" >&2
	    break
	fi
	shift
	if cat < "$1" > "$log_file"; then :; else
	    break
	fi
	shift
	;;
    -n|--dry-run)
	commit=false
	update=true
	shift
	;;
    -q|--quiet)
	cvsopt="$cvsopt -q"
	shift
	;;
    -z|--compress)
	if test $# = 1; then
	    echo "$name: missing argument for $1" >&2
	    break
	fi
	case "$2" in
	[0-9]) :;;
	*)  echo "$name: invalid argument for $1" >&2
	    break
	    ;;
	esac
	cvsopt="$cvsopt -z$2"
	shift
	shift
	;;

    -m*|-F*|-z*)
	opt=`echo "$1" | sed '1s/^\(..\).*$/\1/;q'`
	arg=`echo "$1" | sed '1s/^-[a-zA-Z0-9]//'`
	shift
	set -- "$opt" "$arg" ${1+"$@"}
	;;
    --message=*|--msg=*|--file=*|--compress=*)
	opt=`echo "$1" | sed '1s/^\(--[^=]*\)=.*/\1/;q'`
    	arg=`echo "$1" | sed '1s/^--[^=]*=//'`
	shift
	set -- "$opt" "$arg" ${1+"$@"}
	;;

    -v|--version)
	sed '/^# '$name' version /,/^# Heavily modified by/ { s/^# //; p; }; d' < $0
	exit 0
	;;
    -\?|-h)
	sed '/^# usage:/,/# -h/ { s/^# //; p; }; d' < $0 &&
	echo
	echo "run \`$name --help | more' for full usage"
	exit 0
	;;
    --help)
	sed '/^# '$name' version /,/^[^#]/ { /^[^#]/ d; s/^# //; p; }; d' < $0
	exit 0
	;;
    --)
	shift
	repeat=false
	;;
    -*)
	echo "$name: invalid flag $1" >&2
	break
	;;
    *)
	repeat=false
	;;
    esac
done
# might have used break 2 within the previous loop, but so what
$repeat && break

$update && \
if echo "$name: checking for conflicts..." >&2
   (cvs $cvsopt -q -n update $updateopt ${1+"$@"} 2>/dev/null \
    | while read line; do
	echo "$line"
	echo "$line" >&3
      done | grep '^C') 3>&1 >/dev/null; then
  echo "$name: some conflicts were found, aborting..." >&2
  break
fi

if test ! -f "$log_file"; then
  echo "$name: checking commit message..." >&2
  cvs $cvsopt diff -u ChangeLog \
  | while read line; do
      case "$line" in
      "--- ChangeLog"*) :;;
      "-"*)
	echo "$name: *** Warning: the following line in ChangeLog diff is suspicious:" >&2
	echo "$line" | sed 's/^.//' >&2;;
      "+ "*)
	echo "$name: *** Warning: lines should start with tabs, not spaces; ignoring line:" >&2
	echo "$line" | sed 's/^.//' >&2;;
      "+") echo;;
      "+	"*) echo "$line";;
      esac
    done \
  | sed -e 's,\+	,,' -e '/./p' -e '/./d' -e '1d' -e '$d' > "$log_file" \
  || break
# 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

if grep '[^ 	]' < "$log_file" > /dev/null; then :; else
  echo "$name: empty commit message, aborting" >&2
  break
fi

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

${PAGER-more} "$log_file" || break

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

# 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 $commit; then
  cvs $cvsopt commit $commitopt -F $log_file ${1+"$@"} || break
fi

main_repeat=false
done

rm -f "$log_file"

# if main_repeat was not set to `false', we failed
$main_repeat && exit 1
exit 0
