Browse Source

Merge branch 'da/mergetool-custom'

The actual external command to run for mergetool backend can be
specified with difftool/mergetool.$name.cmd configuration
variables, but this mechanism was ignored for the backends we
natively support.

* da/mergetool-custom:
  mergetool--lib: Allow custom commands to override built-ins
maint
Junio C Hamano 12 years ago
parent
commit
5ec11ab39d
  1. 40
      git-mergetool--lib.sh
  2. 28
      mergetools/defaults
  3. 13
      t/t7610-mergetool.sh
  4. 11
      t/t7800-difftool.sh

40
git-mergetool--lib.sh

@ -104,13 +104,49 @@ run_merge_tool () { @@ -104,13 +104,49 @@ run_merge_tool () {

if merge_mode
then
merge_cmd "$1"
run_merge_cmd "$1"
else
diff_cmd "$1"
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
}

# 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 () {
if merge_mode
then

28
mergetools/defaults

@ -8,36 +8,12 @@ can_diff () { @@ -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
}


13
t/t7610-mergetool.sh

@ -509,4 +509,17 @@ test_expect_success 'file with no base' ' @@ -509,4 +509,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

11
t/t7800-difftool.sh

@ -76,6 +76,17 @@ test_expect_success PERL 'custom commands' ' @@ -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…
Cancel
Save