rebase: do not munge commit log message
authorJunio C Hamano <gitster@pobox.com>
Wed, 16 Apr 2008 19:50:48 +0000 (12:50 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 16 Apr 2008 19:50:48 +0000 (12:50 -0700)
Traditionally git-rebase was implemented in terms of "format-patch" piped
to "am -3", to strike balance between speed (because it avoids a rather
expensive read-tree/merge-recursive machinery most of the time) and
flexibility (the magic "-3" allows it to fall back to 3-way merge as
necessary).  However, this combination has one flaw when dealing with a
nonstandard commit log message format that has more than one lines in the
first paragraph.

This teaches "git am --rebasing" to take advantage of the fact that the
mbox message "git rebase" prepares for it records the original commit
object name, to get the log message from the original commit object
instead.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-am.sh
t/t3408-rebase-multi-line.sh [new file with mode: 0755]

index 245e1db1fc30c9446f42ae6b4626de854062afc7..5a7695efae14fa3a0551bbed86a6184716dd7045 100755 (executable)
--- a/git-am.sh
+++ b/git-am.sh
@@ -327,11 +327,20 @@ do
                        echo "Patch is empty.  Was it split wrong?"
                        stop_here $this
                }
-               SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$dotest/info")"
-               case "$keep_subject" in -k)  SUBJECT="[PATCH] $SUBJECT" ;; esac
-
-               (echo "$SUBJECT" ; echo ; cat "$dotest/msg") |
-                       git stripspace > "$dotest/msg-clean"
+               if test -f "$dotest/rebasing" &&
+                       commit=$(sed -e 's/^From \([0-9a-f]*\) .*/\1/' \
+                               -e q "$dotest/$msgnum") &&
+                       test "$(git cat-file -t "$commit")" = commit
+               then
+                       git cat-file commit "$commit" |
+                       sed -e '1,/^$/d' >"$dotest/msg-clean"
+               else
+                       SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$dotest/info")"
+                       case "$keep_subject" in -k)  SUBJECT="[PATCH] $SUBJECT" ;; esac
+
+                       (echo "$SUBJECT" ; echo ; cat "$dotest/msg") |
+                               git stripspace > "$dotest/msg-clean"
+               fi
                ;;
        esac
 
diff --git a/t/t3408-rebase-multi-line.sh b/t/t3408-rebase-multi-line.sh
new file mode 100755 (executable)
index 0000000..e12cd57
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+test_description='rebasing a commit with multi-line first paragraph.'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+
+       >file &&
+       git add file &&
+       test_tick &&
+       git commit -m initial &&
+
+       echo hello >file &&
+       test_tick &&
+       git commit -a -m "A sample commit log message that has a long
+summary that spills over multiple lines.
+
+But otherwise with a sane description."
+
+       git branch side &&
+
+       git reset --hard HEAD^ &&
+       >elif &&
+       git add elif &&
+       test_tick &&
+       git commit -m second
+
+'
+
+test_expect_success rebase '
+
+       git checkout side &&
+       git rebase master &&
+       git cat-file commit HEAD | sed -e "1,/^$/d" >actual &&
+       git cat-file commit side@{1} | sed -e "1,/^$/d" >expect &&
+       test_cmp expect actual
+
+'
+
+test_done