Now that the "checkout" invoked internally from "rebase" knows to honor
GIT_REFLOG_ACTION, we can start to use it to write a better reflog
message when "rebase anotherbranch", "rebase --onto branch",
etc. internally checks out the new fork point.  We will write:

  rebase: checkout master

instead of the old

  rebase

The usage semantics of GIT_REFLOG_ACTION have changed; by appending to
GIT_REFLOG_ACTION directly, we risk appending to a prebuilt string like
"rebase: checkout mool" from a previous append, when we really intended
to append to the string "rebase".  Solve this problem by introducing a
base_reflog_action variable that is different from GIT_REFLOG_ACTION.

Signed-off-by: Ramkumar Ramachandra <artag...@gmail.com>
Signed-off-by: Junio C Hamano <gits...@pobox.com>
---
 git-am.sh         |  4 +++-
 git-rebase--am.sh |  7 +++++++
 git-rebase.sh     | 18 ++++++++++++++++--
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/git-am.sh b/git-am.sh
index 1cf3d1d..74ef9ca 100755
--- a/git-am.sh
+++ b/git-am.sh
@@ -46,6 +46,8 @@ set_reflog_action am
 require_work_tree
 cd_to_toplevel
 
+base_reflog_action="$GIT_REFLOG_ACTION"
+
 git var GIT_COMMITTER_IDENT >/dev/null ||
        die "$(gettext "You need to set your committer info first")"
 
@@ -884,7 +886,7 @@ did you forget to use 'git add'?"
                fi &&
                git commit-tree $tree ${parent:+-p} $parent 
<"$dotest/final-commit"
        ) &&
-       git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent 
||
+       git update-ref -m "$base_reflog_action: $FIRSTLINE" HEAD $commit 
$parent ||
        stop_here $this
 
        if test -f "$dotest/original-commit"; then
diff --git a/git-rebase--am.sh b/git-rebase--am.sh
index 34e3102..7fbeb35 100644
--- a/git-rebase--am.sh
+++ b/git-rebase--am.sh
@@ -5,11 +5,13 @@
 
 case "$action" in
 continue)
+       GIT_REFLOG_ACTION="$base_reflog_action"
        git am --resolved --resolvemsg="$resolvemsg" &&
        move_to_original_branch
        return
        ;;
 skip)
+       GIT_REFLOG_ACTION="$base_reflog_action"
        git am --skip --resolvemsg="$resolvemsg" &&
        move_to_original_branch
        return
@@ -40,9 +42,11 @@ else
                rm -f "$GIT_DIR/rebased-patches"
                case "$head_name" in
                refs/heads/*)
+                       GIT_REFLOG_ACTION="$base_reflog_action: checkout 
$head_name"
                        git checkout -q "$head_name"
                        ;;
                *)
+                       GIT_REFLOG_ACTION="$base_reflog_action: checkout 
$orig_head"
                        git checkout -q "$orig_head"
                        ;;
                esac
@@ -59,6 +63,9 @@ else
                return $?
        fi
 
+       # always reset GIT_REFLOG_ACTION before calling any external
+       # scripts; they have no idea about our base_reflog_action
+       GIT_REFLOG_ACTION="$base_reflog_action"
        git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" 
<"$GIT_DIR/rebased-patches"
        ret=$?
 
diff --git a/git-rebase.sh b/git-rebase.sh
index d0c11a9..6cdf9f8 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -47,6 +47,13 @@ set_reflog_action rebase
 require_work_tree_exists
 cd_to_toplevel
 
+# Should contain a base string like "rebase" (or "rebase -i (start)")
+# to which a more information like ": checkout foom" can be appended
+# to set the final GIT_REFLOG_ACTION.  If you append to
+# GIT_REFLOG_ACTION directly, you risk appending to a prebuilt string
+# like "rebase: checkout mool" from a previous append.
+base_reflog_action="$GIT_REFLOG_ACTION"
+
 LF='
 '
 ok_to_skip_pre_rebase=
@@ -336,7 +343,8 @@ then
        # Only interactive rebase uses detailed reflog messages
        if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
        then
-               GIT_REFLOG_ACTION="rebase -i ($action)"
+               GIT_REFLOG_ACTION="rebase -i ($1)"
+               base_reflog_action="$GIT_REFLOG_ACTION"
                export GIT_REFLOG_ACTION
        fi
 fi
@@ -543,7 +551,11 @@ then
        if test -z "$force_rebase"
        then
                # Lazily switch to the target branch if needed...
-               test -z "$switch_to" || git checkout "$switch_to" --
+               if test -n "$switch_to"
+               then
+                       GIT_REFLOG_ACTION="$base_reflog_action: checkout 
$switch_to"
+                       git checkout "$switch_to" --
+               fi
                say "$(eval_gettext "Current branch \$branch_name is up to 
date.")"
                exit 0
        else
@@ -568,6 +580,8 @@ test "$type" = interactive && run_specific_rebase
 
 # Detach HEAD and reset the tree
 say "$(gettext "First, rewinding head to replay your work on top of it...")"
+
+GIT_REFLOG_ACTION="$base_reflog_action: checkout $onto_name"
 git checkout -q "$onto^0" || die "could not detach HEAD"
 git update-ref ORIG_HEAD $orig_head
 
-- 
1.8.3.1.449.g41b32a4.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to