mergetool--lib: Allow custom commands to override built-ins
authorDavid Aguilar <davvid@gmail.com>
Tue, 25 Sep 2012 07:48:11 +0000 (00:48 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 25 Sep 2012 16:04:39 +0000 (09:04 -0700)
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>
git-mergetool--lib.sh
mergetools/defaults
t/t7610-mergetool.sh
t/t7800-difftool.sh

index f730253c0eac181ec8507d2c837d4ec85a0ae991..6988f9c0c0492b2a623c62420509ef64654c0f1b 100644 (file)
@@ -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
index 1d8f2a3dd3d0370461423007ed2198918836181b..21e63ecc3e019252c5c9ab5c26b1ea72f5952cc7 100644 (file)
@@ -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
 }
 
index f5e16fc7db3f1dd84aff6d86261d10b3b3d00826..0348ed2fb745a999377aab564e96c6cd1ebde62a 100755 (executable)
@@ -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
index 9c3e997b9d6be69467a78f9ff8b1ff746be8e9b6..eb1d3f85b59b2e74231f0285fc4e90d95d0658fa 100755 (executable)
@@ -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)