]> asedeno.scripts.mit.edu Git - git.git/blobdiff - git-rebase--interactive.sh
Merge branch 'mh/rebase-fixup' (early part)
[git.git] / git-rebase--interactive.sh
index 1560e84bd5d06345dd3976ed55c1cfb8af51b41e..d0b59c96c4cba1cd645f834818b5d613ca059ca3 100755 (executable)
@@ -302,7 +302,10 @@ nth_string () {
 
 make_squash_message () {
        if test -f "$SQUASH_MSG"; then
-               COUNT=$(($(sed -n "s/^# This is [^0-9]*\([1-9][0-9]*\).*/\1/p" \
+               # We want to be careful about matching only the commit
+               # message comment lines generated by this function.
+               # "[snrt][tdh]" matches the nth_string endings.
+               COUNT=$(($(sed -n "s/^# Th[^0-9]*\([1-9][0-9]*\)[snrt][tdh] commit message.*:/\1/p" \
                        < "$SQUASH_MSG" | sed -ne '$p')+1))
                echo "# This is a combination of $COUNT commits."
                sed -e 1d -e '2,/^./{
@@ -315,10 +318,23 @@ make_squash_message () {
                echo
                git cat-file commit HEAD | sed -e '1,/^$/d'
        fi
-       echo
-       echo "# This is the $(nth_string $COUNT) commit message:"
-       echo
-       git cat-file commit $1 | sed -e '1,/^$/d'
+       case $1 in
+       squash)
+               echo
+               echo "# This is the $(nth_string $COUNT) commit message:"
+               echo
+               git cat-file commit $2 | sed -e '1,/^$/d'
+               ;;
+       fixup)
+               echo
+               echo "# The $(nth_string $COUNT) commit message will be skipped:"
+               echo
+               # Comment the lines of the commit message out using
+               # "#    " rather than "# " to make them less likely to
+               # confuse the sed regexp above.
+               git cat-file commit $2 | sed -e '1,/^$/d' -e 's/^/#     /'
+               ;;
+       esac
 }
 
 peek_next_command () {
@@ -367,20 +383,28 @@ do_next () {
                warn
                exit 0
                ;;
-       squash|s)
-               comment_for_reflog squash
+       squash|s|fixup|f)
+               case "$command" in
+               squash|s)
+                       squash_style=squash
+                       ;;
+               fixup|f)
+                       squash_style=fixup
+                       ;;
+               esac
+               comment_for_reflog $squash_style
 
                test -f "$DONE" && has_action "$DONE" ||
-                       die "Cannot 'squash' without a previous commit"
+                       die "Cannot '$squash_style' without a previous commit"
 
                mark_action_done
-               make_squash_message $sha1 > "$MSG"
+               make_squash_message $squash_style $sha1 > "$MSG"
                failed=f
                author_script=$(get_author_ident_from_commit HEAD)
                output git reset --soft HEAD^
                pick_one -n $sha1 || failed=t
                case "$(peek_next_command)" in
-               squash|s)
+               squash|s|fixup|f)
                        USE_OUTPUT=output
                        MSG_OPT=-F
                        EDIT_OR_FILE="$MSG"
@@ -787,6 +811,7 @@ first and then run 'git rebase --continue' again."
 #  r, reword = use commit, but edit the commit message
 #  e, edit = use commit, but stop for amending
 #  s, squash = use commit, but meld into previous commit
+#  f, fixup = like "squash", but discard this commit's log message
 #
 # If you remove a line here THAT COMMIT WILL BE LOST.
 # However, if you remove everything, the rebase will be aborted.