branch: allow -f with -m and -d
[gitweb.git] / contrib / examples / git-commit.sh
index 485339754ca3567c86b824af656700654c68e173..934505bab9e6cf04a3536010ac31b1795c852c9f 100755 (executable)
@@ -51,7 +51,7 @@ run_status () {
                export GIT_INDEX_FILE
        fi
 
-       if test "$status_only" = "t" -o "$use_status_color" = "t"; then
+       if test "$status_only" = "t" || test "$use_status_color" = "t"; then
                color=
        else
                color=--nocolor
@@ -74,6 +74,7 @@ trap '
 
 all=
 also=
+allow_empty=f
 interactive=
 only=
 logfile=
@@ -90,7 +91,7 @@ signoff=
 force_author=
 only_include_assumed=
 untracked_files=
-templatefile="`git config commit.template`"
+templatefile="$(git config commit.template)"
 while test $# != 0
 do
        case "$1" in
@@ -114,6 +115,10 @@ do
        -a|--a|--al|--all)
                all=t
                ;;
+       --allo|--allow|--allow-|--allow-e|--allow-em|--allow-emp|\
+       --allow-empt|--allow-empty)
+               allow_empty=t
+               ;;
        --au=*|--aut=*|--auth=*|--autho=*|--author=*)
                force_author="${1#*=}"
                ;;
@@ -275,7 +280,7 @@ case "$#,$also,$only,$amend" in
 0,,,*)
        ;;
 *,,,*)
-       only_include_assumed="# Explicit paths specified without -i nor -o; assuming --only paths..."
+       only_include_assumed="# Explicit paths specified without -i or -o; assuming --only paths..."
        also=
        ;;
 esac
@@ -291,7 +296,7 @@ t,,,[1-9]*)
        die "No paths with -i does not make sense." ;;
 esac
 
-if test ! -z "$templatefile" -a -z "$log_given"
+if test ! -z "$templatefile" && test -z "$log_given"
 then
        if test ! -f "$templatefile"
        then
@@ -345,7 +350,7 @@ t,)
                TMP_INDEX="$GIT_DIR/tmp-index$$"
                W=
                test -z "$initial_commit" && W=--with-tree=HEAD
-               commit_only=`git ls-files --error-unmatch $W -- "$@"` || exit
+               commit_only=$(git ls-files --error-unmatch $W -- "$@") || exit
 
                # Build a temporary index and update the real index
                # the same way.
@@ -438,7 +443,7 @@ fi | git stripspace >"$GIT_DIR"/COMMIT_EDITMSG
 
 case "$signoff" in
 t)
-       sign=$(git-var GIT_COMMITTER_IDENT | sed -e '
+       sign=$(git var GIT_COMMITTER_IDENT | sed -e '
                s/>.*/>/
                s/^/Signed-off-by: /
                ')
@@ -470,8 +475,8 @@ then
 fi
 if test '' != "$force_author"
 then
-       GIT_AUTHOR_NAME=`expr "z$force_author" : 'z\(.*[^ ]\) *<.*'` &&
-       GIT_AUTHOR_EMAIL=`expr "z$force_author" : '.*\(<.*\)'` &&
+       GIT_AUTHOR_NAME=$(expr "z$force_author" : 'z\(.*[^ ]\) *<.*') &&
+       GIT_AUTHOR_EMAIL=$(expr "z$force_author" : '.*\(<.*\)') &&
        test '' != "$GIT_AUTHOR_NAME" &&
        test '' != "$GIT_AUTHOR_EMAIL" ||
        die "malformed --author parameter"
@@ -484,7 +489,7 @@ then
        rloga='commit'
        if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
                rloga='commit (merge)'
-               PARENTS="-p HEAD "`sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD"`
+               PARENTS="-p HEAD "$(sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD")
        elif test -n "$amend"; then
                rloga='commit (amend)'
                PARENTS=$(git cat-file commit HEAD |
@@ -515,18 +520,23 @@ else
        # we need to check if there is anything to commit
        run_status >/dev/null
 fi
-if [ "$?" != "0" -a ! -f "$GIT_DIR/MERGE_HEAD" ]
-then
+case "$allow_empty,$?,$PARENTS" in
+t,* | ?,0,* | ?,*,-p' '?*-p' '?*)
+       # an explicit --allow-empty, or a merge commit can record the
+       # same tree as its parent.  Otherwise having commitable paths
+       # is required.
+       ;;
+*)
        rm -f "$GIT_DIR/COMMIT_EDITMSG" "$GIT_DIR/SQUASH_MSG"
        use_status_color=t
        run_status
        exit 1
-fi
+esac
 
 case "$no_edit" in
 '')
-       git-var GIT_AUTHOR_IDENT > /dev/null  || die
-       git-var GIT_COMMITTER_IDENT > /dev/null  || die
+       git var GIT_AUTHOR_IDENT > /dev/null  || die
+       git var GIT_COMMITTER_IDENT > /dev/null  || die
        git_editor "$GIT_DIR/COMMIT_EDITMSG"
        ;;
 esac
@@ -621,7 +631,7 @@ then
        if test -z "$quiet"
        then
                commit=`git diff-tree --always --shortstat --pretty="format:%h: %s"\
-                      --summary --root HEAD --`
+                      --abbrev --summary --root HEAD --`
                echo "Created${initial_commit:+ initial} commit $commit"
        fi
 fi