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/148267 Signed-off-by: David Aguilar <davvid@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
889d35899b
commit
a427ef7acc
@ -104,11 +104,47 @@ run_merge_tool () {
|
||||
|
||||
if merge_mode
|
||||
then
|
||||
merge_cmd "$1"
|
||||
run_merge_cmd "$1"
|
||||
else
|
||||
run_diff_cmd "$1"
|
||||
fi
|
||||
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
|
||||
return $status
|
||||
}
|
||||
|
||||
# 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 () {
|
||||
|
@ -8,36 +8,12 @@ can_diff () {
|
||||
}
|
||||
|
||||
diff_cmd () {
|
||||
merge_tool_cmd="$(get_merge_tool_cmd "$1")"
|
||||
if test -z "$merge_tool_cmd"
|
||||
then
|
||||
status=1
|
||||
break
|
||||
fi
|
||||
( eval $merge_tool_cmd )
|
||||
status=$?
|
||||
status=1
|
||||
return $status
|
||||
}
|
||||
|
||||
merge_cmd () {
|
||||
merge_tool_cmd="$(get_merge_tool_cmd "$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
|
||||
status=1
|
||||
return $status
|
||||
}
|
||||
|
||||
|
@ -471,4 +471,17 @@ test_expect_success 'file with no base' '
|
||||
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
|
||||
|
@ -76,6 +76,17 @@ test_expect_success PERL 'custom commands' '
|
||||
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
|
||||
test_expect_success PERL 'difftool ignores bad --tool values' '
|
||||
diff=$(git difftool --no-prompt --tool=bad-tool branch)
|
||||
|
Loading…
Reference in New Issue
Block a user