git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: markus.heidelberg@web.de
Cc: David Aguilar <davvid@gmail.com>,
	gitster@pobox.com, git@vger.kernel.org, charles@hashpling.org
Subject: Re: [PATCH v4 14/14] difftool/mergetool: refactor commands to use git-mergetool--lib
Date: Tue, 07 Apr 2009 23:09:36 -0700	[thread overview]
Message-ID: <7vtz4zr80v.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <200904080733.01030.markus.heidelberg@web.de> (Markus Heidelberg's message of "Wed, 8 Apr 2009 07:33:00 +0200")

Markus Heidelberg <markus.heidelberg@web.de> writes:

>> +	fi
>> +	if echo "${VISUAL:-$EDITOR}" | grep emacs > /dev/null 2>&1; then
>> +		# $EDITOR is emacs so add emerge as a candidate
>> +		tools="$tools emerge vimdiff"
>> +	elif echo "${VISUAL:-$EDITOR}" | grep vim > /dev/null 2>&1; then
>> +		# $EDITOR is vim so add vimdiff as a candidate
>> +		tools="$tools vimdiff emerge"
>> +	else
>> +		tools="$tools emerge vimdiff"
>> +	fi
>> +	tools="$(echo "$tools" | sed -e 's/ +/ /g')"
>
> Doesn't work for me. For me 's/ \+/ /g' works.
> ...like this: 's/[ 	]\+/ /g' (space and tab)

Pleae don't.  "s/  */ /g' should be the most portable (the point being "do
not use one-or-more +").

> Looks good to me, after these last 2 issues are adjusted.
> Maybe resend the whole series then, so that Junio can apply them easily?

Thanks.  I've replaced the series with the following applied on top of the
'master', but I won't be merging them to 'next' for tonight, I guess.

[PATCH 01/14] doc/merge-config: list ecmerge as a built-in merge
[PATCH 02/14] git-mergetool/difftool: make (g)vimdiff workable under
[PATCH 03/14] git-mergetool: add new merge tool TortoiseMerge
[PATCH 04/14] difftool: remove merge options for opendiff, tkdiff,
[PATCH 05/14] difftool: remove the backup file feature
[PATCH 06/14] difftool: use perl built-ins when testing for msys
[PATCH v2 07/14] difftool: add a -y shortcut for --no-prompt
[PATCH 08/14] difftool/mergetool: add diffuse as merge and diff tool
[PATCH v2 09/14] difftool: move 'git-difftool' out of contrib
[PATCH v3 10/14] difftool: add various git-difftool tests
[PATCH v2 11/14] difftool: add support for a difftool.prompt config variable
[PATCH 12/14] bash completion: add git-difftool
[PATCH 13/14] mergetool: use $( ... ) instead of `backticks`
[PATCH v4 14/14] difftool/mergetool: refactor commands to use git-mergetool--lib

It appears that, assuming that up to 13/14 above is what you two expected
me to pick up, we would perhaps need to only replace 14/14?

As the final sanity check, please eyeball the attached interdiff, created
this way:

 $ git checkout master^0
 $ git am -s ./+da-fourteen-patches
 $ A=$(git rev-parse HEAD)
 $ git reset --hard master
 $ git merge da/difftool ;# old series
 $ git diff --stat -p HEAD $A ;# what's new in the new series?

 Documentation/config.txt               |    3 +-
 Documentation/git-mergetool.txt        |    2 +-
 Documentation/merge-config.txt         |    6 +-
 command-list.txt                       |    1 -
 contrib/completion/git-completion.bash |    2 +-
 git-mergetool--lib.sh                  |  237 ++++++++++++++++++--------------
 t/t7800-difftool.sh                    |    4 +-
 7 files changed, 144 insertions(+), 111 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 6e29623..d427daf 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -670,7 +670,8 @@ diff.suppressBlankEmpty::
 diff.tool::
 	Controls which diff tool is used.  `diff.tool` overrides
 	`merge.tool` when used by linkgit:git-difftool[1] and has
-	the same valid values as `merge.tool`.
+	the same valid values as `merge.tool` minus "tortoisemerge"
+	and plus "kompare".
 
 difftool.<tool>.path::
 	Override the path for the given tool.  This is useful in case
diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt
index c3a8092..ff9700d 100644
--- a/Documentation/git-mergetool.txt
+++ b/Documentation/git-mergetool.txt
@@ -27,7 +27,7 @@ OPTIONS
 	Use the merge resolution program specified by <tool>.
 	Valid merge tools are:
 	kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge,
-	diffuse and opendiff
+	diffuse, tortoisemerge and opendiff
 +
 If a merge resolution program is not specified, 'git-mergetool'
 will use the configuration variable `merge.tool`.  If the
diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt
index c4fc3eb..4832bc7 100644
--- a/Documentation/merge-config.txt
+++ b/Documentation/merge-config.txt
@@ -23,9 +23,9 @@ merge.tool::
 	Controls which merge resolution program is used by
 	linkgit:git-mergetool[1].  Valid built-in values are: "kdiff3",
 	"tkdiff", "meld", "xxdiff", "emerge", "vimdiff", "gvimdiff",
-	"diffuse" and "opendiff".  Any other value is treated as a custom
-	merge tool and there must be a corresponding mergetool.<tool>.cmd
-	option.
+	"diffuse", "ecmerge", "tortoisemerge", and
+	"opendiff".  Any other value is treated is custom merge tool
+	and there must be a corresponding mergetool.<tool>.cmd option.
 
 merge.verbosity::
 	Controls the amount of output shown by the recursive merge
diff --git a/command-list.txt b/command-list.txt
index fd66395..fb03a2e 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -69,7 +69,6 @@ git-merge-file                          plumbingmanipulators
 git-merge-index                         plumbingmanipulators
 git-merge-one-file                      purehelpers
 git-mergetool                           ancillarymanipulators
-git-mergetool--lib                      purehelpers
 git-merge-tree                          ancillaryinterrogators
 git-mktag                               plumbingmanipulators
 git-mktree                              plumbingmanipulators
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 6f96d75..069e19e 100755
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1192,7 +1192,7 @@ _git_mergetool ()
 	local cur="${COMP_WORDS[COMP_CWORD]}"
 	case "$cur" in
 	--tool=*)
-		__gitcomp "$__git_mergetools_common" "" "${cur##--tool=}"
+		__gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
 		return
 		;;
 	--*)
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index 3d3edda..95cc355 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -1,10 +1,10 @@
 # git-mergetool--lib is a library for common merge tool functions
 diff_mode() {
-	test $TOOL_MODE = "diff"
+	test "$TOOL_MODE" = diff
 }
 
 merge_mode() {
-	test $TOOL_MODE = "merge"
+	test "$TOOL_MODE" = merge
 }
 
 translate_merge_tool_path () {
@@ -30,36 +30,36 @@ translate_merge_tool_path () {
 }
 
 check_unchanged () {
-	if merge_mode; then
-		if test "$MERGED" -nt "$BACKUP"; then
-			status=0
-		else
-			while true; do
-				echo "$MERGED seems unchanged."
-				printf "Was the merge successful? [y/n] "
-				read answer < /dev/tty
-				case "$answer" in
-				y*|Y*) status=0; break ;;
-				n*|N*) status=1; break ;;
-				esac
-			done
-		fi
-	else
+	if test "$MERGED" -nt "$BACKUP"; then
 		status=0
+	else
+		while true; do
+			echo "$MERGED seems unchanged."
+			printf "Was the merge successful? [y/n] "
+			read answer < /dev/tty
+			case "$answer" in
+			y*|Y*) status=0; break ;;
+			n*|N*) status=1; break ;;
+			esac
+		done
 	fi
-	return $status
 }
 
 valid_tool () {
 	case "$1" in
-	kdiff3 | kompare | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | ecmerge | diffuse | tortoisemerge)
-		if test "$1" = "kompare" && ! diff_mode; then
+	kdiff3 | tkdiff | xxdiff | meld | opendiff | \
+	emerge | vimdiff | gvimdiff | ecmerge | diffuse)
+		;; # happy
+	tortoisemerge)
+		if ! merge_mode; then
 			return 1
 		fi
-		if test "$1" = "tortoisemerge" && ! merge_mode; then
+		;;
+	kompare)
+		if ! diff_mode; then
 			return 1
 		fi
-		;; # happy
+		;;
 	*)
 		if test -z "$(get_merge_tool_cmd "$1")"; then
 			return 1
@@ -79,160 +79,182 @@ get_merge_tool_cmd () {
 
 run_merge_tool () {
 	base_present="$2"
-	if diff_mode; then
-		base_present="false"
-	fi
-	if test -z "$base_present"; then
-		base_present="true"
-	fi
+	status=0
 
 	case "$1" in
 	kdiff3)
-		if $base_present; then
-			("$merge_tool_path" --auto \
-			 --L1 "$MERGED (Base)" --L2 "$MERGED (Local)" --L3 "$MERGED (Remote)" \
-			 -o "$MERGED" "$BASE" "$LOCAL" "$REMOTE" > /dev/null 2>&1)
-		else
-			if merge_mode; then
+		if merge_mode; then
+			if $base_present; then
 				("$merge_tool_path" --auto \
-				 --L1 "$MERGED (Local)" \
-				 --L2 "$MERGED (Remote)" \
-				 -o "$MERGED" "$LOCAL" "$REMOTE" \
+					--L1 "$MERGED (Base)" \
+					--L2 "$MERGED (Local)" \
+					--L3 "$MERGED (Remote)" \
+					-o "$MERGED" \
+					"$BASE" "$LOCAL" "$REMOTE" \
 				> /dev/null 2>&1)
 			else
 				("$merge_tool_path" --auto \
-				 --L1 "$MERGED (A)" \
-				 --L2 "$MERGED (B)" \
-				 "$LOCAL" "$REMOTE" \
+					--L1 "$MERGED (Local)" \
+					--L2 "$MERGED (Remote)" \
+					-o "$MERGED" \
+					"$LOCAL" "$REMOTE" \
 				> /dev/null 2>&1)
 			fi
+			status=$?
+		else
+			("$merge_tool_path" --auto \
+			 --L1 "$MERGED (A)" \
+			 --L2 "$MERGED (B)" "$LOCAL" "$REMOTE" \
+			 > /dev/null 2>&1)
 		fi
-		status=$?
 		;;
 	kompare)
 		"$merge_tool_path" "$LOCAL" "$REMOTE"
-		status=$?
 		;;
 	tkdiff)
-		if $base_present; then
-			"$merge_tool_path" -a "$BASE" -o "$MERGED" "$LOCAL" "$REMOTE"
-		else
-			if merge_mode; then
-				"$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE"
+		if merge_mode; then
+			if $base_present; then
+				"$merge_tool_path" -a "$BASE" \
+					-o "$MERGED" "$LOCAL" "$REMOTE"
 			else
-				"$merge_tool_path" "$LOCAL" "$REMOTE"
+				"$merge_tool_path" \
+					-o "$MERGED" "$LOCAL" "$REMOTE"
 			fi
+			status=$?
+		else
+			"$merge_tool_path" "$LOCAL" "$REMOTE"
 		fi
-		status=$?
 		;;
 	meld)
 		if merge_mode; then
 			touch "$BACKUP"
 			"$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE"
+			check_unchanged
 		else
 			"$merge_tool_path" "$LOCAL" "$REMOTE"
 		fi
-		check_unchanged
 		;;
 	diffuse)
 		if merge_mode; then
 			touch "$BACKUP"
-		fi
-		if $base_present; then
-			"$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" "$BASE" | cat
-		else
-			if merge_mode; then
-				"$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" | cat
+			if $base_present; then
+				"$merge_tool_path" \
+					"$LOCAL" "$MERGED" "$REMOTE" \
+					"$BASE" | cat
 			else
-				"$merge_tool_path" "$LOCAL" "$REMOTE" | cat
+				"$merge_tool_path" \
+					"$LOCAL" "$MERGED" "$REMOTE" | cat
 			fi
+			check_unchanged
+		else
+			"$merge_tool_path" "$LOCAL" "$REMOTE" | cat
 		fi
-		check_unchanged
 		;;
 	vimdiff)
 		if merge_mode; then
 			touch "$BACKUP"
-			"$merge_tool_path" -d -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"
+			"$merge_tool_path" -d -c "wincmd l" \
+				"$LOCAL" "$MERGED" "$REMOTE"
 			check_unchanged
 		else
-			"$merge_tool_path" -d -c "wincmd l" "$LOCAL" "$REMOTE"
+			"$merge_tool_path" -d -c "wincmd l" \
+				"$LOCAL" "$REMOTE"
 		fi
 		;;
 	gvimdiff)
 		if merge_mode; then
 			touch "$BACKUP"
-			"$merge_tool_path" -d -c "wincmd l" -f "$LOCAL" "$MERGED" "$REMOTE"
+			"$merge_tool_path" -d -c "wincmd l" -f \
+				"$LOCAL" "$MERGED" "$REMOTE"
 			check_unchanged
 		else
-			"$merge_tool_path" -d -c "wincmd l" -f "$LOCAL" "$REMOTE"
+			"$merge_tool_path" -d -c "wincmd l" -f \
+				"$LOCAL" "$REMOTE"
 		fi
 		;;
 	xxdiff)
 		if merge_mode; then
 			touch "$BACKUP"
-		fi
-		if $base_present; then
-			"$merge_tool_path" -X --show-merged-pane \
-			    -R 'Accel.SaveAsMerged: "Ctrl-S"' \
-			    -R 'Accel.Search: "Ctrl+F"' \
-			    -R 'Accel.SearchForward: "Ctrl-G"' \
-			    --merged-file "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
-		else
-			if merge_mode; then
-				"$merge_tool_path" -X $extra \
+			if $base_present; then
+				"$merge_tool_path" -X --show-merged-pane \
 					-R 'Accel.SaveAsMerged: "Ctrl-S"' \
 					-R 'Accel.Search: "Ctrl+F"' \
 					-R 'Accel.SearchForward: "Ctrl-G"' \
-					--merged-file "$MERGED" "$LOCAL" "$REMOTE"
+					--merged-file "$MERGED" \
+					"$LOCAL" "$BASE" "$REMOTE"
 			else
-				"$merge_tool_path" \
+				"$merge_tool_path" -X $extra \
+					-R 'Accel.SaveAsMerged: "Ctrl-S"' \
 					-R 'Accel.Search: "Ctrl+F"' \
 					-R 'Accel.SearchForward: "Ctrl-G"' \
+					--merged-file "$MERGED" \
 					"$LOCAL" "$REMOTE"
 			fi
+			check_unchanged
+		else
+			"$merge_tool_path" \
+				-R 'Accel.Search: "Ctrl+F"' \
+				-R 'Accel.SearchForward: "Ctrl-G"' \
+				"$LOCAL" "$REMOTE"
 		fi
-		check_unchanged
 		;;
 	opendiff)
-		merge_mode && touch "$BACKUP"
-		if $base_present; then
-			"$merge_tool_path" "$LOCAL" "$REMOTE" \
-				-ancestor "$BASE" -merge "$MERGED" | cat
-		else
-			if merge_mode; then
+		if merge_mode; then
+			touch "$BACKUP"
+			if $base_present; then
 				"$merge_tool_path" "$LOCAL" "$REMOTE" \
+					-ancestor "$BASE" \
 					-merge "$MERGED" | cat
 			else
-				"$merge_tool_path" "$LOCAL" "$REMOTE" | cat
+				"$merge_tool_path" "$LOCAL" "$REMOTE" \
+					-merge "$MERGED" | cat
 			fi
+			check_unchanged
+		else
+			"$merge_tool_path" "$LOCAL" "$REMOTE" | cat
 		fi
-		check_unchanged
 		;;
 	ecmerge)
-		merge_mode && touch "$BACKUP"
-		if $base_present; then
-			"$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \
-				--default --mode=merge3 --to="$MERGED"
+		if merge_mode; then
+			touch "$BACKUP"
+			if $base_present; then
+				"$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \
+					--default --mode=merge3 --to="$MERGED"
+			else
+				"$merge_tool_path" "$LOCAL" "$REMOTE" \
+					--default --mode=merge2 --to="$MERGED"
+			fi
+			check_unchanged
 		else
 			"$merge_tool_path" "$LOCAL" "$REMOTE" \
 				--default --mode=merge2 --to="$MERGED"
 		fi
-		check_unchanged
 		;;
 	emerge)
-		if $base_present; then
-			"$merge_tool_path" -f emerge-files-with-ancestor-command \
-				"$LOCAL" "$REMOTE" "$BASE" "$(basename "$MERGED")"
+		if merge_mode; then
+			if $base_present; then
+				"$merge_tool_path" \
+					-f emerge-files-with-ancestor-command \
+					"$LOCAL" "$REMOTE" "$BASE" \
+					"$(basename "$MERGED")"
+			else
+				"$merge_tool_path" \
+					-f emerge-files-command \
+					"$LOCAL" "$REMOTE" \
+					"$(basename "$MERGED")"
+			fi
+			status=$?
 		else
 			"$merge_tool_path" -f emerge-files-command \
 				"$LOCAL" "$REMOTE" "$(basename "$MERGED")"
 		fi
-		status=$?
 		;;
 	tortoisemerge)
 		if $base_present; then
 			touch "$BACKUP"
-			"$merge_tool_path" -base:"$BASE" -mine:"$LOCAL" -theirs:"$REMOTE" -merged:"$MERGED"
+			"$merge_tool_path" \
+				-base:"$BASE" -mine:"$LOCAL" \
+				-theirs:"$REMOTE" -merged:"$MERGED"
 			check_unchanged
 		else
 			echo "TortoiseMerge cannot be used without a base" 1>&2
@@ -240,9 +262,14 @@ run_merge_tool () {
 		fi
 		;;
 	*)
-		if test -n "$merge_tool_cmd"; then
-			if merge_mode &&
-			test "$merge_tool_trust_exit_code" = "false"; then
+		if test -z "$merge_tool_cmd"; then
+			if merge_mode; then
+				status=1
+			fi
+			break
+		fi
+		if merge_mode; then
+			if test "$merge_tool_trust_exit_code" = "false"; then
 				touch "$BACKUP"
 				( eval $merge_tool_cmd )
 				check_unchanged
@@ -250,6 +277,8 @@ run_merge_tool () {
 				( eval $merge_tool_cmd )
 				status=$?
 			fi
+		else
+			( eval $merge_tool_cmd )
 		fi
 		;;
 	esac
@@ -257,27 +286,31 @@ run_merge_tool () {
 }
 
 guess_merge_tool () {
-	if diff_mode; then
+	tools="ecmerge"
+	if merge_mode; then
+		tools="$tools tortoisemerge"
+	else
 		kompare="kompare"
 	fi
 	if test -n "$DISPLAY"; then
 		if test -n "$GNOME_DESKTOP_SESSION_ID" ; then
-			tools="meld kdiff3 $kompare tkdiff"
+			tools="meld opendiff kdiff3 $kompare tkdiff $tools"
 			tools="$tools xxdiff gvimdiff diffuse"
 		else
-			tools="kdiff3 $kompare tkdiff xxdiff"
+			tools="opendiff kdiff3 $kompare tkdiff xxdiff $tools"
 			tools="$tools meld gvimdiff diffuse"
 		fi
 	fi
 	if echo "${VISUAL:-$EDITOR}" | grep emacs > /dev/null 2>&1; then
 		# $EDITOR is emacs so add emerge as a candidate
-		tools="$tools emerge opendiff vimdiff"
+		tools="$tools emerge vimdiff"
 	elif echo "${VISUAL:-$EDITOR}" | grep vim > /dev/null 2>&1; then
 		# $EDITOR is vim so add vimdiff as a candidate
-		tools="$tools vimdiff opendiff emerge"
+		tools="$tools vimdiff emerge"
 	else
-		tools="$tools opendiff emerge vimdiff"
+		tools="$tools emerge vimdiff"
 	fi
+	tools="$(echo "$tools" | sed -e 's/ +/ /g')"
 	echo >&2 "merge tool candidates: $tools"
 
 	# Loop over each candidate and stop when a valid merge tool is found.
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index cbfbe87..2586f86 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -202,10 +202,10 @@ test_expect_success 'difftool + mergetool config variables' '
 
 test_expect_success 'difftool.<tool>.path' '
 	git config difftool.tkdiff.path echo &&
-	diff=$(git difftool -y -t tkdiff branch) &&
+	diff=$(git difftool --tool=tkdiff --no-prompt branch) &&
 	git config --unset difftool.tkdiff.path &&
 	lines=$(echo "$diff" | grep file | wc -l) &&
-	test "$lines" = 1
+	test "$lines" -eq 1
 '
 
 test_done

  reply	other threads:[~2009-04-08  6:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-07 23:00 [PATCH v4 14/14] difftool/mergetool: refactor commands to use git-mergetool--lib David Aguilar
2009-04-08  5:33 ` Markus Heidelberg
2009-04-08  6:09   ` Junio C Hamano [this message]
2009-04-08  6:35     ` David Aguilar
2009-04-08  6:40     ` Charles Bailey
2009-04-08  6:56       ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7vtz4zr80v.fsf@gitster.siamese.dyndns.org \
    --to=gitster@pobox.com \
    --cc=charles@hashpling.org \
    --cc=davvid@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=markus.heidelberg@web.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).