summaryrefslogtreecommitdiff
path: root/commit
diff options
context:
space:
mode:
authorbfriesen <bfriesen>2004-09-14 14:26:21 +0000
committerbfriesen <bfriesen>2004-09-14 14:26:21 +0000
commit7dabffeae2a753847f6ad4a2187302e7f99cb8ea (patch)
tree7ab59bad7ebf351ea46e2a9187013b3f5f7bc96a /commit
parentd3d9064f6e397678b6a8310f732cd42bede10240 (diff)
downloadlibtiff-7dabffeae2a753847f6ad4a2187302e7f99cb8ea.tar.gz
* commit: Added a script to make it more convenient to commit
updates. The CVS commit message is extracted from this ChangeLog file.
Diffstat (limited to 'commit')
-rwxr-xr-xcommit233
1 files changed, 233 insertions, 0 deletions
diff --git a/commit b/commit
new file mode 100755
index 00000000..e52b40a9
--- /dev/null
+++ b/commit
@@ -0,0 +1,233 @@
+#! /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 <gvv@techie.com>
+# 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