mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
mergetool: allow auto-merge for meld to follow the vim-diff behavior
Make the mergetool used with "meld" backend behave similarly to "vimdiff" by telling it to auto-merge non-conflicting parts and highlight the conflicting parts when `mergetool.meld.useAutoMerge` is configured with `true`, or `auto` for detecting the `--auto-merge` option automatically. Helped-by: Đoàn Trần Công Danh <congdanhqx@gmail.com> Helped-by: David Aguilar <davvid@gmail.com> Signed-off-by: Lin Sun <lin.sun@zoom.us> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
@@ -3,34 +3,87 @@ diff_cmd () {
|
||||
}
|
||||
|
||||
merge_cmd () {
|
||||
if test -z "${meld_has_output_option:+set}"
|
||||
check_meld_for_features
|
||||
|
||||
option_auto_merge=
|
||||
if test "$meld_use_auto_merge_option" = true
|
||||
then
|
||||
check_meld_for_output_version
|
||||
option_auto_merge="--auto-merge"
|
||||
fi
|
||||
|
||||
if test "$meld_has_output_option" = true
|
||||
then
|
||||
"$merge_tool_path" --output="$MERGED" \
|
||||
"$merge_tool_path" $option_auto_merge --output="$MERGED" \
|
||||
"$LOCAL" "$BASE" "$REMOTE"
|
||||
else
|
||||
"$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE"
|
||||
"$merge_tool_path" $option_auto_merge "$LOCAL" "$MERGED" "$REMOTE"
|
||||
fi
|
||||
}
|
||||
|
||||
# Check whether we should use 'meld --output <file>'
|
||||
check_meld_for_output_version () {
|
||||
meld_path="$(git config mergetool.meld.path)"
|
||||
meld_path="${meld_path:-meld}"
|
||||
|
||||
if meld_has_output_option=$(git config --bool mergetool.meld.hasOutput)
|
||||
# Get meld help message
|
||||
init_meld_help_msg () {
|
||||
if test -z "$meld_help_msg"
|
||||
then
|
||||
: use configured value
|
||||
elif "$meld_path" --help 2>&1 |
|
||||
grep -e '--output=' -e '\[OPTION\.\.\.\]' >/dev/null
|
||||
then
|
||||
: old ones mention --output and new ones just say OPTION...
|
||||
meld_has_output_option=true
|
||||
else
|
||||
meld_has_output_option=false
|
||||
meld_path="$(git config mergetool.meld.path || echo meld)"
|
||||
meld_help_msg=$("$meld_path" --help 2>&1)
|
||||
fi
|
||||
}
|
||||
|
||||
# Check the features and set flags
|
||||
check_meld_for_features () {
|
||||
# Check whether we should use 'meld --output <file>'
|
||||
if test -z "$meld_has_output_option"
|
||||
then
|
||||
meld_has_output_option=$(git config --bool mergetool.meld.hasOutput)
|
||||
case "$meld_has_output_option" in
|
||||
true | false)
|
||||
: use configured value
|
||||
;;
|
||||
*)
|
||||
: empty or invalid configured value, detecting "--output" automatically
|
||||
init_meld_help_msg
|
||||
|
||||
case "$meld_help_msg" in
|
||||
*"--output="* | *'[OPTION...]'*)
|
||||
# All version that has [OPTION...] supports --output
|
||||
meld_has_output_option=true
|
||||
;;
|
||||
*)
|
||||
meld_has_output_option=false
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
# Check whether we should use 'meld --auto-merge ...'
|
||||
if test -z "$meld_use_auto_merge_option"
|
||||
then
|
||||
meld_use_auto_merge_option=$(
|
||||
git config --bool-or-str mergetool.meld.useAutoMerge
|
||||
)
|
||||
case "$meld_use_auto_merge_option" in
|
||||
true | false)
|
||||
: use well formatted boolean value
|
||||
;;
|
||||
auto)
|
||||
# testing the "--auto-merge" option only if config is "auto"
|
||||
init_meld_help_msg
|
||||
|
||||
case "$meld_help_msg" in
|
||||
*"--auto-merge"* | *'[OPTION...]'*)
|
||||
meld_use_auto_merge_option=true
|
||||
;;
|
||||
*)
|
||||
meld_use_auto_merge_option=false
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
"")
|
||||
meld_use_auto_merge_option=false
|
||||
;;
|
||||
*)
|
||||
die "unknown mergetool.meld.useAutoMerge: $meld_use_auto_merge_option"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user