threads / patch / 9479

patch, 2 partsmergetool: refactored kdiff3 -> KDIFF3

Subject: [PATCH 1/2] mergetool: refactored kdiff3 -> KDIFF3

## tl;dr

2 messages between Aug 10, 2007 and Aug 10, 2007. Diffs are folded; open one to read it.

replies: 1people: 1as markdown or json

Steffen Prohaska· Aug 10, 2007, 23:56 UTC · lore

Use shell variable KDIFF3 instead of kdiff3 to call kdiff3. This will be used in detection of the absolute absolute path.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 git-mergetool.sh |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

This change is needed to be able to provide an absolute path to kdiff3, which will be looked up in the Windows Registry. See the following patch.

Show changes to git-mergetool.sh +4 −2
diff --git a/git-mergetool.sh b/git-mergetool.sh
index e6bbb6b..90a69b3 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -13,6 +13,8 @@ SUBDIRECTORY_OK=Yes
 . git-sh-setup
 require_work_tree
 
+KDIFF3=kdiff3
+
 # Returns true if the mode reflects a symlink
 is_symlink () {
     test "$1" = 120000
@@ -191,10 +193,10 @@ merge_file () {
     case "$merge_tool" in
 	kdiff3)
 	    if base_present ; then
-		(kdiff3 --auto --L1 "$path (Base)" -L2 "$path (Local)" --L3 "$path (Remote)" \
+		("$KDIFF3" --auto --L1 "$path (Base)" -L2 "$path (Local)" --L3 "$path (Remote)" \
 		    -o "$path" -- "$BASE" "$LOCAL" "$REMOTE" > /dev/null 2>&1)
 	    else
-		(kdiff3 --auto -L1 "$path (Local)" --L2 "$path (Remote)" \
+		("$KDIFF3" --auto -L1 "$path (Local)" --L2 "$path (Remote)" \
 		    -o "$path" -- "$LOCAL" "$REMOTE" > /dev/null 2>&1)
 	    fi
 	    status=$?
-- 
1.5.3.rc4.744.g68381
Steffen Prohaska· Aug 10, 2007, 23:56 UTC · re: Steffen Prohaska · lore

[PATCH] mergetool: added support for kdiff3 on windows

kdiff3's homepage is http://kdiff3.sourceforge.net/.

kdiff3 is automatically added to the available mergetools if its path is found in the Windows Registry. Be sure to set

    git config core.autocrlf true
kdiff3 seems to follow Windows crlf convention.
Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 git-mergetool.sh |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)

This patch was developed against msysgit, and is add functionality specific to Windows. It should also apply against git.git's master and shouldn't do any harm to the handling of mergetools on platforms other than Windows

It was tested on a Windows with german localization. I'd be interested if the lookup of kdiff3 works on other localizations, too.

Handling mergetools that needs an absolute path is a bit hacky. merge_tool is mostly used as an alias but also as the name of an executable. A level of indirection would be nice for handling absolute paths.

kdiff3 on Windows doesn't accept '--' on it's commandline. Is '--' really needed on other platforms? I replaced it by the variable KDIFF3SEPARATOR.

	Steffen
Show changes to git-mergetool.sh +18 −4
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 90a69b3..9f64e7c 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -14,6 +14,7 @@ SUBDIRECTORY_OK=Yes
 require_work_tree
 
 KDIFF3=kdiff3
+KDIFF3SEPARATOR=--
 
 # Returns true if the mode reflects a symlink
 is_symlink () {
@@ -194,10 +195,10 @@ merge_file () {
 	kdiff3)
 	    if base_present ; then
 		("$KDIFF3" --auto --L1 "$path (Base)" -L2 "$path (Local)" --L3 "$path (Remote)" \
-		    -o "$path" -- "$BASE" "$LOCAL" "$REMOTE" > /dev/null 2>&1)
+		    -o "$path" $KDIFF3SEPERATOR "$BASE" "$LOCAL" "$REMOTE" > /dev/null 2>&1)
 	    else
 		("$KDIFF3" --auto -L1 "$path (Local)" --L2 "$path (Remote)" \
-		    -o "$path" -- "$LOCAL" "$REMOTE" > /dev/null 2>&1)
+		    -o "$path" $KDIFF3SEPERATOR "$LOCAL" "$REMOTE" > /dev/null 2>&1)
 	    fi
 	    status=$?
 	    remove_backup
@@ -321,6 +322,11 @@ if test -z "$merge_tool" ; then
             merge_tool_candidates="kdiff3 $merge_tool_candidates"
         fi
     fi
+    regentry="$(REG QUERY 'HKEY_LOCAL_MACHINE\SOFTWARE\KDiff3\diff-ext' 2>/dev/null)" && {
+        KDIFF3=$(echo "$regentry" | grep diffcommand | cut -f 3)
+        KDIFF3SEPARATOR=
+        merge_tool_candidates="$merge_tool_candidates kdiff3"
+    } 
     if echo "${VISUAL:-$EDITOR}" | grep 'emacs' > /dev/null 2>&1; then
         merge_tool_candidates="$merge_tool_candidates emerge"
     fi
@@ -332,10 +338,12 @@ if test -z "$merge_tool" ; then
     for i in $merge_tool_candidates; do
         if test $i = emerge ; then
             cmd=emacs
+        elif test $i = kdiff3 ; then
+            cmd="$KDIFF3"
         else
             cmd=$i
         fi
-        if type $cmd > /dev/null 2>&1; then
+        if type "$cmd" > /dev/null 2>&1; then
             merge_tool=$i
             break
         fi
@@ -347,7 +355,13 @@ if test -z "$merge_tool" ; then
 fi
 
 case "$merge_tool" in
-    kdiff3|tkdiff|meld|xxdiff|vimdiff|gvimdiff|opendiff)
+    kdiff3)
+	if ! type "$KDIFF3" > /dev/null 2>&1; then
+	    echo "The merge tool $merge_tool is not available"
+	    exit 1
+	fi
+	;;
+    tkdiff|meld|xxdiff|vimdiff|gvimdiff|opendiff)
 	if ! type "$merge_tool" > /dev/null 2>&1; then
 	    echo "The merge tool $merge_tool is not available"
 	    exit 1
-- 
1.5.3.rc4.744.g68381

← back to recent threads