Merge branch 'sp/mergetool'

* sp/mergetool:
  mergetool: avoid misleading message "Resetting to default..."
  mergetool: add support for ECMerge
  mergetool: use path to mergetool in config var mergetool.<tool>.path
This commit is contained in:
Junio C Hamano
2007-10-31 23:53:55 -07:00
2 changed files with 71 additions and 44 deletions

View File

@ -25,12 +25,18 @@ OPTIONS
-t or --tool=<tool>:: -t or --tool=<tool>::
Use the merge resolution program specified by <tool>. Use the merge resolution program specified by <tool>.
Valid merge tools are: Valid merge tools are:
kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, and opendiff kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, and opendiff
+ +
If a merge resolution program is not specified, 'git mergetool' If a merge resolution program is not specified, 'git mergetool'
will use the configuration variable merge.tool. If the will use the configuration variable merge.tool. If the
configuration variable merge.tool is not set, 'git mergetool' configuration variable merge.tool is not set, 'git mergetool'
will pick a suitable default. will pick a suitable default.
+
You can explicitly provide a full path to the tool by setting the
configuration variable mergetool.<tool>.path. For example, you
can configure the absolute path to kdiff3 by setting
mergetool.kdiff3.path. Otherwise, 'git mergetool' assumes the tool
is available in PATH.
Author Author
------ ------

View File

@ -192,10 +192,10 @@ merge_file () {
case "$merge_tool" in case "$merge_tool" in
kdiff3) kdiff3)
if base_present ; then if base_present ; then
(kdiff3 --auto --L1 "$path (Base)" --L2 "$path (Local)" --L3 "$path (Remote)" \ ("$merge_tool_path" --auto --L1 "$path (Base)" --L2 "$path (Local)" --L3 "$path (Remote)" \
-o "$path" -- "$BASE" "$LOCAL" "$REMOTE" > /dev/null 2>&1) -o "$path" -- "$BASE" "$LOCAL" "$REMOTE" > /dev/null 2>&1)
else else
(kdiff3 --auto --L1 "$path (Local)" --L2 "$path (Remote)" \ ("$merge_tool_path" --auto --L1 "$path (Local)" --L2 "$path (Remote)" \
-o "$path" -- "$LOCAL" "$REMOTE" > /dev/null 2>&1) -o "$path" -- "$LOCAL" "$REMOTE" > /dev/null 2>&1)
fi fi
status=$? status=$?
@ -203,35 +203,35 @@ merge_file () {
;; ;;
tkdiff) tkdiff)
if base_present ; then if base_present ; then
tkdiff -a "$BASE" -o "$path" -- "$LOCAL" "$REMOTE" "$merge_tool_path" -a "$BASE" -o "$path" -- "$LOCAL" "$REMOTE"
else else
tkdiff -o "$path" -- "$LOCAL" "$REMOTE" "$merge_tool_path" -o "$path" -- "$LOCAL" "$REMOTE"
fi fi
status=$? status=$?
save_backup save_backup
;; ;;
meld|vimdiff) meld|vimdiff)
touch "$BACKUP" touch "$BACKUP"
$merge_tool -- "$LOCAL" "$path" "$REMOTE" "$merge_tool_path" -- "$LOCAL" "$path" "$REMOTE"
check_unchanged check_unchanged
save_backup save_backup
;; ;;
gvimdiff) gvimdiff)
touch "$BACKUP" touch "$BACKUP"
gvimdiff -f -- "$LOCAL" "$path" "$REMOTE" "$merge_tool_path" -f -- "$LOCAL" "$path" "$REMOTE"
check_unchanged check_unchanged
save_backup save_backup
;; ;;
xxdiff) xxdiff)
touch "$BACKUP" touch "$BACKUP"
if base_present ; then if base_present ; then
xxdiff -X --show-merged-pane \ "$merge_tool_path" -X --show-merged-pane \
-R 'Accel.SaveAsMerged: "Ctrl-S"' \ -R 'Accel.SaveAsMerged: "Ctrl-S"' \
-R 'Accel.Search: "Ctrl+F"' \ -R 'Accel.Search: "Ctrl+F"' \
-R 'Accel.SearchForward: "Ctrl-G"' \ -R 'Accel.SearchForward: "Ctrl-G"' \
--merged-file "$path" -- "$LOCAL" "$BASE" "$REMOTE" --merged-file "$path" -- "$LOCAL" "$BASE" "$REMOTE"
else else
xxdiff -X --show-merged-pane \ "$merge_tool_path" -X --show-merged-pane \
-R 'Accel.SaveAsMerged: "Ctrl-S"' \ -R 'Accel.SaveAsMerged: "Ctrl-S"' \
-R 'Accel.Search: "Ctrl+F"' \ -R 'Accel.Search: "Ctrl+F"' \
-R 'Accel.SearchForward: "Ctrl-G"' \ -R 'Accel.SearchForward: "Ctrl-G"' \
@ -243,18 +243,28 @@ merge_file () {
opendiff) opendiff)
touch "$BACKUP" touch "$BACKUP"
if base_present; then if base_present; then
opendiff "$LOCAL" "$REMOTE" -ancestor "$BASE" -merge "$path" | cat "$merge_tool_path" "$LOCAL" "$REMOTE" -ancestor "$BASE" -merge "$path" | cat
else else
opendiff "$LOCAL" "$REMOTE" -merge "$path" | cat "$merge_tool_path" "$LOCAL" "$REMOTE" -merge "$path" | cat
fi
check_unchanged
save_backup
;;
ecmerge)
touch "$BACKUP"
if base_present; then
"$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" --mode=merge3 --to="$path"
else
"$merge_tool_path" "$LOCAL" "$REMOTE" --mode=merge2 --to="$path"
fi fi
check_unchanged check_unchanged
save_backup save_backup
;; ;;
emerge) emerge)
if base_present ; then if base_present ; then
emacs -f emerge-files-with-ancestor-command "$LOCAL" "$REMOTE" "$BASE" "$(basename "$path")" "$merge_tool_path" -f emerge-files-with-ancestor-command "$LOCAL" "$REMOTE" "$BASE" "$(basename "$path")"
else else
emacs -f emerge-files-command "$LOCAL" "$REMOTE" "$(basename "$path")" "$merge_tool_path" -f emerge-files-command "$LOCAL" "$REMOTE" "$(basename "$path")"
fi fi
status=$? status=$?
save_backup save_backup
@ -297,17 +307,38 @@ do
shift shift
done done
valid_tool() {
case "$1" in
kdiff3 | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | ecmerge)
;; # happy
*)
return 1
;;
esac
}
init_merge_tool_path() {
merge_tool_path=`git config mergetool.$1.path`
if test -z "$merge_tool_path" ; then
case "$1" in
emerge)
merge_tool_path=emacs
;;
*)
merge_tool_path=$1
;;
esac
fi
}
if test -z "$merge_tool"; then if test -z "$merge_tool"; then
merge_tool=`git config merge.tool` merge_tool=`git config merge.tool`
case "$merge_tool" in if test -n "$merge_tool" && ! valid_tool "$merge_tool"; then
kdiff3 | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | "")
;; # happy
*)
echo >&2 "git config option merge.tool set to unknown tool: $merge_tool" echo >&2 "git config option merge.tool set to unknown tool: $merge_tool"
echo >&2 "Resetting to default..." echo >&2 "Resetting to default..."
unset merge_tool unset merge_tool
;; fi
esac
fi fi
if test -z "$merge_tool" ; then if test -z "$merge_tool" ; then
@ -329,40 +360,30 @@ if test -z "$merge_tool" ; then
merge_tool_candidates="$merge_tool_candidates opendiff emerge vimdiff" merge_tool_candidates="$merge_tool_candidates opendiff emerge vimdiff"
echo "merge tool candidates: $merge_tool_candidates" echo "merge tool candidates: $merge_tool_candidates"
for i in $merge_tool_candidates; do for i in $merge_tool_candidates; do
if test $i = emerge ; then init_merge_tool_path $i
cmd=emacs if type "$merge_tool_path" > /dev/null 2>&1; then
else
cmd=$i
fi
if type $cmd > /dev/null 2>&1; then
merge_tool=$i merge_tool=$i
break break
fi fi
done done
if test -z "$merge_tool" ; then if test -z "$merge_tool" ; then
echo "No available merge resolution programs available." echo "No known merge resolution program available."
exit 1 exit 1
fi fi
else
if ! valid_tool "$merge_tool"; then
echo >&2 "Unknown merge_tool $merge_tool"
exit 1
fi
init_merge_tool_path "$merge_tool"
if ! type "$merge_tool_path" > /dev/null 2>&1; then
echo "The merge tool $merge_tool is not available as '$merge_tool_path'"
exit 1
fi
fi fi
case "$merge_tool" in
kdiff3|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
fi
;;
emerge)
if ! type "emacs" > /dev/null 2>&1; then
echo "Emacs is not available"
exit 1
fi
;;
*)
echo "Unknown merge tool: $merge_tool"
exit 1
;;
esac
if test $# -eq 0 ; then if test $# -eq 0 ; then
files=`git ls-files -u | sed -e 's/^[^ ]* //' | sort -u` files=`git ls-files -u | sed -e 's/^[^ ]* //' | sort -u`