Subject: Re: [PATCH] Offer to print changes while running git-mergetool

From: Junio C Hamano <[email-masked]>
Date: Sat, 07 Feb 2009 00:11:06 -0800

Jonathan del Strother <[email-masked]> writes:

> Add a "Show changes" option to each prompt in mergetool. This prints the
> conflicted changes on the current file, using 'git log -p --merge
> <file>'

I think the patch should look like this, given the recent conversation I
had with you.  It seems that the script thinks the unit of indentation is
4-places, and case arms are indented from case/esac (neither of which is
the standard git shell script convention), and I tried to match that style
used in the existing code.

No, I didn't test it.

Charles volunteered to take over mergetool, so he is on the Cc: list.

 git-mergetool.sh |   60 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 47 insertions(+), 13 deletions(-)

diff --git c/git-mergetool.sh w/git-mergetool.sh
index 87fa88a..b8604d6 100755
--- c/git-mergetool.sh
+++ w/git-mergetool.sh
@@ -14,6 +14,13 @@ OPTIONS_SPEC=
 . git-sh-setup
 require_work_tree
 
+if test -f "$GIT_DIR/MERGE_HEAD"
+then
+    in_merge=t show_changes=", (s)how changes"
+else
+    in_merge=f show_changes=
+fi
+
 # Returns true if the mode reflects a symlink
 is_symlink () {
     test "$1" = 120000
@@ -62,22 +69,28 @@ describe_file () {
 
 resolve_symlink_merge () {
     while true; do
-	printf "Use (l)ocal or (r)emote, or (a)bort? "
+	printf "Use (l)ocal or (r)emote$show_changes, or (a)bort? "
 	read ans
-	case "$ans" in
-	    [lL]*)
+	case "$in_merge,$ans" in
+	    ?,[lL]*)
 		git checkout-index -f --stage=2 -- "$MERGED"
 		git add -- "$MERGED"
 		cleanup_temp_files --save-backup
 		return 0
 		;;
-	    [rR]*)
+	    ?,[rR]*)
 		git checkout-index -f --stage=3 -- "$MERGED"
 		git add -- "$MERGED"
 		cleanup_temp_files --save-backup
 		return 0
 		;;
-	    [aA]*)
+	    t,[sS]*)
+		git log -p --merge "$MERGED"
+		printf "\n"
+		resolve_symlink_merge
+		return
+		;;
+	    ?,[aA]*)
 		return 1
 		;;
 	    esac
@@ -87,23 +100,29 @@ resolve_symlink_merge () {
 resolve_deleted_merge () {
     while true; do
 	if base_present; then
-	    printf "Use (m)odified or (d)eleted file, or (a)bort? "
+	    printf "Use (m)odified or (d)eleted file$show_changes, or (a)bort? "
 	else
-	    printf "Use (c)reated or (d)eleted file, or (a)bort? "
+	    printf "Use (c)reated or (d)eleted file$show changes, or (a)bort? "
 	fi
 	read ans
-	case "$ans" in
-	    [mMcC]*)
+	case "$in_merge,$ans" in
+	    ?,[mMcC]*)
 		git add -- "$MERGED"
 		cleanup_temp_files --save-backup
 		return 0
 		;;
-	    [dD]*)
+	    ?,[dD]*)
 		git rm -- "$MERGED" > /dev/null
 		cleanup_temp_files
 		return 0
 		;;
-	    [aA]*)
+	    t,[sS]*)
+		git log -p --merge "$MERGED"
+		printf "\n"
+		resolve_deleted_merge
+		return
+		;;
+	    ?,[aA]*)
 		return 1
 		;;
 	    esac
@@ -184,8 +203,23 @@ merge_file () {
     describe_file "$local_mode" "local" "$LOCAL"
     describe_file "$remote_mode" "remote" "$REMOTE"
     if "$prompt" = true; then
-	printf "Hit return to start merge resolution tool (%s): " "$merge_tool"
-	read ans
+	while true; do
+	    case $in_merge in
+		t)	msg_head="(S)how changes, or h" ;;
+		f)	msg_head="H" ;;
+	    esac
+	    print "${msg_head}it return to start merge resolution tool (%s): " "$merge_tool"
+	    read ans
+	    case "$in_merge,$ans" in
+	        t,[sS]*)
+		    git log -p --merge "$MERGED"
+		    printf "\n"
+		    ;;
+		?,*)
+		    break
+		    ;;
+	    esac
+        done
     fi
 
     case "$merge_tool" in