提交 a427ef7a 编写于 作者: D David Aguilar 提交者: Junio C Hamano

mergetool--lib: Allow custom commands to override built-ins

Allow users to override the default commands provided by the
mergetools/* scriptlets.

Users occasionally run into problems where they expect to be
able to override the built-in tool names.  The documentation
does not explicitly mention that built-ins cannot be overridden,
so it's easy to assume that it should work.

Lift this restriction so that built-in tools are handled the
same way as user-configured tools.  Add tests to guarantee this
behavior.

A nice benefit of this change is that it protects users from
having future versions of git trump their custom configuration
with a new built-in tool.

C.f.:

http://stackoverflow.com/questions/7435002/mergetool-from-gitconfig-being-ignored
http://thread.gmane.org/gmane.comp.version-control.msysgit/13188
http://thread.gmane.org/gmane.comp.version-control.git/148267Signed-off-by: NDavid Aguilar <davvid@gmail.com>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 889d3589
...@@ -104,13 +104,49 @@ run_merge_tool () { ...@@ -104,13 +104,49 @@ run_merge_tool () {
if merge_mode if merge_mode
then then
merge_cmd "$1" run_merge_cmd "$1"
else else
diff_cmd "$1" run_diff_cmd "$1"
fi fi
return $status return $status
} }
# Run a either a configured or built-in diff tool
run_diff_cmd () {
merge_tool_cmd="$(get_merge_tool_cmd "$1")"
if test -n "$merge_tool_cmd"
then
( eval $merge_tool_cmd )
status=$?
return $status
else
diff_cmd "$1"
fi
}
# Run a either a configured or built-in merge tool
run_merge_cmd () {
merge_tool_cmd="$(get_merge_tool_cmd "$1")"
if test -n "$merge_tool_cmd"
then
trust_exit_code="$(git config --bool \
mergetool."$1".trustExitCode || echo false)"
if test "$trust_exit_code" = "false"
then
touch "$BACKUP"
( eval $merge_tool_cmd )
status=$?
check_unchanged
else
( eval $merge_tool_cmd )
status=$?
fi
return $status
else
merge_cmd "$1"
fi
}
list_merge_tool_candidates () { list_merge_tool_candidates () {
if merge_mode if merge_mode
then then
......
...@@ -8,36 +8,12 @@ can_diff () { ...@@ -8,36 +8,12 @@ can_diff () {
} }
diff_cmd () { diff_cmd () {
merge_tool_cmd="$(get_merge_tool_cmd "$1")" status=1
if test -z "$merge_tool_cmd"
then
status=1
break
fi
( eval $merge_tool_cmd )
status=$?
return $status return $status
} }
merge_cmd () { merge_cmd () {
merge_tool_cmd="$(get_merge_tool_cmd "$1")" status=1
if test -z "$merge_tool_cmd"
then
status=1
break
fi
trust_exit_code="$(git config --bool \
mergetool."$1".trustExitCode || echo false)"
if test "$trust_exit_code" = "false"
then
touch "$BACKUP"
( eval $merge_tool_cmd )
status=$?
check_unchanged
else
( eval $merge_tool_cmd )
status=$?
fi
return $status return $status
} }
......
...@@ -471,4 +471,17 @@ test_expect_success 'file with no base' ' ...@@ -471,4 +471,17 @@ test_expect_success 'file with no base' '
git reset --hard master >/dev/null 2>&1 git reset --hard master >/dev/null 2>&1
' '
test_expect_success 'custom commands override built-ins' '
git checkout -b test14 branch1 &&
git config mergetool.defaults.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
git config mergetool.defaults.trustExitCode true &&
test_must_fail git merge master &&
git mergetool --no-prompt --tool defaults -- both &&
echo master both added >expected &&
test_cmp both expected &&
git config --unset mergetool.defaults.cmd &&
git config --unset mergetool.defaults.trustExitCode &&
git reset --hard master >/dev/null 2>&1
'
test_done test_done
...@@ -76,6 +76,17 @@ test_expect_success PERL 'custom commands' ' ...@@ -76,6 +76,17 @@ test_expect_success PERL 'custom commands' '
test "$diff" = "branch" test "$diff" = "branch"
' '
# Ensures that a custom difftool.<tool>.cmd overrides built-ins
test_expect_success PERL 'custom commands override built-ins' '
restore_test_defaults &&
git config difftool.defaults.cmd "cat \$REMOTE" &&
diff=$(git difftool --tool defaults --no-prompt branch) &&
test "$diff" = "master" &&
git config --unset difftool.defaults.cmd
'
# Ensures that git-difftool ignores bogus --tool values # Ensures that git-difftool ignores bogus --tool values
test_expect_success PERL 'difftool ignores bad --tool values' ' test_expect_success PERL 'difftool ignores bad --tool values' '
diff=$(git difftool --no-prompt --tool=bad-tool branch) diff=$(git difftool --no-prompt --tool=bad-tool branch)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册