git-commit: log parameter updates.

While moving '-m' to make room for CVS compatible "here is the
log message", enhance source of log parameters.

  -m 'message': a command line parameter.
  -F <file>   : a file (use '-' to read from stdin).
  -C <commit> : message in existing commit.
  -c <commit> : message in existing commit (allows further editing).

Longer option names for these options are also available.

While we are at it, get rid of shell array bashism.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2005-08-08 17:03:14 -07:00
parent 5ccfb758b0
commit 0c091296c0
3 changed files with 107 additions and 24 deletions

View File

@ -23,7 +23,7 @@ The output is intended to be used as:
while read commit
do
GIT_EXTERNAL_DIFF=git-apply-patch-script git-diff-tree -p "$commit" &&
git-commit-script -m "$commit"
git-commit-script -C "$commit"
done
'

View File

@ -6,44 +6,105 @@
. git-sh-setup-script || die "Not a git archive"
usage () {
die 'git commit [--all] [-m existing-commit] [<path>...]'
die 'git commit [-a] [-m <message>] [-F <logfile>] [(-C|-c) <commit>] [<path>...]'
}
files=()
all= logfile= use_commit= no_edit= log_given= log_message=
while case "$#" in 0) break;; esac
do
case "$1" in
-m) shift
case "$#" in
0) usage ;;
*) use_commit=`git-rev-parse --verify "$1"` ||
exit ;;
esac
;;
--all)
files=($(git-diff-files --name-only))\
;;
*) break
;;
esac
-a|--a|--al|--all)
all=t
shift ;;
-F=*|--f=*|--fi=*|--fil=*|--file=*)
log_given=t$log_given
logfile=`expr "$1" : '-[^=]*=\(.*\)'`
no_edit=t
shift ;;
-F|--f|--fi|--fil|--file)
case "$#" in 1) usage ;; esac; shift
log_given=t$log_given
logfile="$1"
no_edit=t
shift ;;
-m=*|--m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*)
log_given=t$log_given
log_message=`expr "$1" : '-[^=]*=\(.*\)'`
no_edit=t
shift ;;
-m|--m|--me|--mes|--mess|--messa|--messag|--message)
case "$#" in 1) usage ;; esac; shift
log_given=t$log_given
log_message="$1"
no_edit=t
shift ;;
-c=*|--ree=*|--reed=*|--reedi=*|--reedit=*|--reedit-=*|--reedit-m=*|\
--reedit-me=*|--reedit-mes=*|--reedit-mess=*|--reedit-messa=*|\
--reedit-messag=*|--reedit-message=*)
log_given=t$log_given
use_commit=`expr "$1" : '-[^=]*=\(.*\)'`
shift ;;
-c|--ree|--reed|--reedi|--reedit|--reedit-|--reedit-m|--reedit-me|\
--reedit-mes|--reedit-mess|--reedit-messa|--reedit-messag|--reedit-message)
case "$#" in 1) usage ;; esac; shift
log_given=t$log_given
use_commit="$1"
shift ;;
-C=*|--reu=*|--reus=*|--reuse=*|--reuse-=*|--reuse-m=*|--reuse-me=*|\
--reuse-mes=*|--reuse-mess=*|--reuse-messa=*|--reuse-messag=*|\
--reuse-message=*)
log_given=t$log_given
use_commit=`expr "$1" : '-[^=]*=\(.*\)'`
no_edit=t
shift ;;
-C|--reu|--reus|--reuse|--reuse-|--reuse-m|--reuse-me|--reuse-mes|\
--reuse-mess|--reuse-messa|--reuse-messag|--reuse-message)
case "$#" in 1) usage ;; esac; shift
log_given=t$log_given
use_commit="$1"
no_edit=t
shift ;;
--)
shift
break ;;
-*)
usage ;;
*)
break ;;
esac
done
git-update-cache -q --refresh -- "$@" "${files[@]}" || exit 1
case "$log_given" in
tt*)
die "Only one of -c/-C/-F/-m can be used." ;;
esac
case "$all" in
t)
git-diff-files --name-only -z |
xargs -0 git-update-cache -q -- || exit 1 ;;
esac
git-update-cache -q --refresh -- "$@" || exit 1
PARENTS="-p HEAD"
if [ ! -r "$GIT_DIR/HEAD" ]; then
if [ -z "$(git-ls-files)" ]; then
echo Nothing to commit 1>&2
exit 1
fi
(
{
echo "#"
echo "# Initial commit"
case "$no_edit" in
t) echo "# (ignoring your commit message for initial commit)"
no_edit=
esac
echo "#"
git-ls-files | sed 's/^/# New file: /'
echo "#"
) > .editmsg
} >.editmsg
PARENTS=""
no_edit=
else
if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
echo "#"
@ -51,8 +112,25 @@ else
echo "# If this is not correct, please remove the file"
echo "# $GIT_DIR/MERGE_HEAD"
echo "# and try again"
case "$no_edit" in
t) echo "# (ignoring your commit message for merge commit)"
no_edit=
esac
echo "#"
PARENTS="-p HEAD -p MERGE_HEAD"
elif test "$log_message" != ''
then
echo "$log_message"
elif test "$logfile" != ""
then
if test "$logfile" = -
then
test -t 0 &&
echo >&2 "(reading log message from standard input)"
cat
else
cat <"$logfile"
fi
elif test "$use_commit" != ""
then
pick_author_script='
@ -92,17 +170,22 @@ then
rm .editmsg
exit 1
fi
case "$use_commit" in
case "$no_edit" in
'')
${VISUAL:-${EDITOR:-vi}} .editmsg
;;
esac
grep -v '^#' < .editmsg | git-stripspace > .cmitmsg
[ -s .cmitmsg ] &&
if test -s .cmitmsg
then
tree=$(git-write-tree) &&
commit=$(cat .cmitmsg | git-commit-tree $tree $PARENTS) &&
echo $commit > "$GIT_DIR/HEAD" &&
rm -f -- "$GIT_DIR/MERGE_HEAD"
else
echo >&2 "* no commit message? aborting commit."
false
fi
ret="$?"
rm -f .cmitmsg .editmsg
exit "$ret"

View File

@ -37,7 +37,7 @@ do
esac
S=`cat "$GIT_DIR/HEAD"` &&
GIT_EXTERNAL_DIFF=git-apply-patch-script git-diff-tree -p $commit &&
git-commit-script -m "$commit" || {
git-commit-script -C "$commit" || {
echo $commit >>$fail
git-read-tree --reset -u $S
}