Code

difftool: add support for a difftool.prompt config variable
authorDavid Aguilar <davvid@gmail.com>
Tue, 7 Apr 2009 08:21:22 +0000 (01:21 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 Apr 2009 05:19:56 +0000 (22:19 -0700)
difftool now supports difftool.prompt so that users do not have to
pass --no-prompt or hit enter each time a diff tool is launched.
The --prompt flag overrides the configuration variable.

Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
Documentation/git-difftool.txt
git-difftool--helper.sh
git-difftool.perl
t/t7800-difftool.sh

index 94ef1a62f98961eaa7028c1aa3bc95b9c48e85c9..d427dafb41a5688804ad81dfbe938b37776877c9 100644 (file)
@@ -685,6 +685,9 @@ difftool.<tool>.cmd::
        is set to the name of the temporary file containing the contents
        of the diff post-image.
 
+difftool.prompt::
+       Prompt before each invocation of the diff tool.
+
 diff.wordRegex::
        A POSIX Extended Regular Expression used to determine what is a "word"
        when performing word-by-word difference calculations.  Character
index af68466ebc95bbac739a48cb5f1caf3869d2ba3c..15b247bab4195286e55447388308473af4e2d001 100644 (file)
@@ -7,7 +7,7 @@ git-difftool - Show changes using common diff tools
 
 SYNOPSIS
 --------
-'git difftool' [--tool=<tool>] [-y|--no-prompt] [<'git diff' options>]
+'git difftool' [--tool=<tool>] [-y|--no-prompt|--prompt] [<'git diff' options>]
 
 DESCRIPTION
 -----------
@@ -21,6 +21,11 @@ OPTIONS
 --no-prompt::
        Do not prompt before launching a diff tool.
 
+--prompt::
+       Prompt before each invocation of the diff tool.
+       This is the default behaviour; the option is provided to
+       override any configuration settings.
+
 -t <tool>::
 --tool=<tool>::
        Use the diff tool specified by <tool>.
@@ -72,6 +77,9 @@ difftool.<tool>.cmd::
 +
 See the `--tool=<tool>` option above for more details.
 
+difftool.prompt::
+       Prompt before each invocation of the diff tool.
+
 SEE ALSO
 --------
 linkgit:git-diff[1]::
index fc61416acb1e14f4c6ad492ee3e105c345a5e44f..f3c27d86adf3ba158de4749d45c4ac54e7887e76 100755 (executable)
@@ -5,9 +5,15 @@
 #
 # Copyright (c) 2009 David Aguilar
 
-# Set GIT_DIFFTOOL_NO_PROMPT to bypass the per-file prompt.
+# difftool.prompt controls the default prompt/no-prompt behavior
+# and is overridden with $GIT_DIFFTOOL*_PROMPT.
 should_prompt () {
-       test -z "$GIT_DIFFTOOL_NO_PROMPT"
+       prompt=$(git config --bool difftool.prompt || echo true)
+       if test "$prompt" = true; then
+               test -z "$GIT_DIFFTOOL_NO_PROMPT"
+       else
+               test -n "$GIT_DIFFTOOL_PROMPT"
+       fi
 }
 
 # This function prepares temporary files and launches the appropriate
index 8857ac8a4cfa733c1158cdb9a0d3e453bd8d235c..948ff7f6fd2dacc41f10b2b92f6ad752001ea3be 100755 (executable)
@@ -2,9 +2,12 @@
 # Copyright (c) 2009 David Aguilar
 #
 # This is a wrapper around the GIT_EXTERNAL_DIFF-compatible
-# git-difftool--helper script.  This script exports
-# GIT_EXTERNAL_DIFF and GIT_PAGER for use by git, and
-# GIT_DIFFTOOL_NO_PROMPT and GIT_DIFF_TOOL for use by git-difftool--helper.
+# git-difftool--helper script.
+#
+# This script exports GIT_EXTERNAL_DIFF and GIT_PAGER for use by git.
+# GIT_DIFFTOOL_NO_PROMPT, GIT_DIFFTOOL_PROMPT, and GIT_DIFF_TOOL
+# are exported for use by git-difftool--helper.
+#
 # Any arguments that are unknown to this script are forwarded to 'git diff'.
 
 use strict;
@@ -62,6 +65,12 @@ sub generate_command
                }
                if ($arg eq '-y' || $arg eq '--no-prompt') {
                        $ENV{GIT_DIFFTOOL_NO_PROMPT} = 'true';
+                       delete $ENV{GIT_DIFFTOOL_PROMPT};
+                       next;
+               }
+               if ($arg eq '--prompt') {
+                       $ENV{GIT_DIFFTOOL_PROMPT} = 'true';
+                       delete $ENV{GIT_DIFFTOOL_NO_PROMPT};
                        next;
                }
                if ($arg eq '-h' || $arg eq '--help') {
index 26992265571f11b6df732cc45fe2e08ebaedb77d..2586f864a0df4d8c6fb2c7ca0824a6d53ce0520d 100755 (executable)
@@ -15,6 +15,7 @@ remove_config_vars()
        # Unset all config variables used by git-difftool
        git config --unset diff.tool
        git config --unset difftool.test-tool.cmd
+       git config --unset difftool.prompt
        git config --unset merge.tool
        git config --unset mergetool.test-tool.cmd
        return 0
@@ -26,11 +27,18 @@ restore_test_defaults()
        remove_config_vars
        unset GIT_DIFF_TOOL
        unset GIT_MERGE_TOOL
+       unset GIT_DIFFTOOL_PROMPT
        unset GIT_DIFFTOOL_NO_PROMPT
        git config diff.tool test-tool &&
        git config difftool.test-tool.cmd 'cat $LOCAL'
 }
 
+prompt_given()
+{
+       prompt="$1"
+       test "$prompt" = "Hit return to launch 'test-tool': branch"
+}
+
 # Create a file on master and change it on branch
 test_expect_success 'setup' '
        echo master >file &&
@@ -116,6 +124,62 @@ test_expect_success 'GIT_DIFFTOOL_NO_PROMPT variable' '
        restore_test_defaults
 '
 
+# git-difftool supports the difftool.prompt variable.
+# Test that GIT_DIFFTOOL_PROMPT can override difftool.prompt = false
+test_expect_success 'GIT_DIFFTOOL_PROMPT variable' '
+       git config difftool.prompt false &&
+       GIT_DIFFTOOL_PROMPT=true &&
+       export GIT_DIFFTOOL_PROMPT &&
+
+       prompt=$(echo | git difftool --prompt branch | tail -1) &&
+       prompt_given "$prompt" &&
+
+       restore_test_defaults
+'
+
+# Test that we don't have to pass --no-prompt when difftool.prompt is false
+test_expect_success 'difftool.prompt config variable is false' '
+       git config difftool.prompt false &&
+
+       diff=$(git difftool branch) &&
+       test "$diff" = "branch" &&
+
+       restore_test_defaults
+'
+
+# Test that the -y flag can override difftool.prompt = true
+test_expect_success 'difftool.prompt can overridden with -y' '
+       git config difftool.prompt true &&
+
+       diff=$(git difftool -y branch) &&
+       test "$diff" = "branch" &&
+
+       restore_test_defaults
+'
+
+# Test that the --prompt flag can override difftool.prompt = false
+test_expect_success 'difftool.prompt can overridden with --prompt' '
+       git config difftool.prompt false &&
+
+       prompt=$(echo | git difftool --prompt branch | tail -1) &&
+       prompt_given "$prompt" &&
+
+       restore_test_defaults
+'
+
+# Test that the last flag passed on the command-line wins
+test_expect_success 'difftool last flag wins' '
+       diff=$(git difftool --prompt --no-prompt branch) &&
+       test "$diff" = "branch" &&
+
+       restore_test_defaults &&
+
+       prompt=$(echo | git difftool --no-prompt --prompt branch | tail -1) &&
+       prompt_given "$prompt" &&
+
+       restore_test_defaults
+'
+
 # git-difftool falls back to git-mergetool config variables
 # so test that behavior here
 test_expect_success 'difftool + mergetool config variables' '