]> git.ipfire.org Git - thirdparty/git.git/commitdiff
checkout: learn to respect checkout.guess
authorDenton Liu <liu.denton@gmail.com>
Thu, 8 Oct 2020 05:48:15 +0000 (22:48 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 8 Oct 2020 16:25:29 +0000 (09:25 -0700)
The current behavior of git checkout/switch is that --guess is currently
enabled by default. However, some users may not wish for this to happen
automatically. Instead of forcing users to specify --no-guess manually
each time, teach these commands the checkout.guess configuration
variable that gives users the option to set a default behavior.

Teach the completion script to recognize the new config variable and
disable DWIM logic if it is set to false.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/checkout.txt
Documentation/git-checkout.txt
Documentation/git-switch.txt
builtin/checkout.c
contrib/completion/git-completion.bash
t/t2024-checkout-dwim.sh
t/t2060-switch.sh
t/t9902-completion.sh

index e3684a54599d97ba8a8729b3958ca57d4fbd4b8f..2cddf7b4b40213155a09e85e6499508fc4a30c86 100644 (file)
@@ -16,3 +16,8 @@ will checkout the `<something>` branch on another remote,
 and by linkgit:git-worktree[1] when `git worktree add` refers to a
 remote branch. This setting might be used for other checkout-like
 commands or functionality in the future.
+
+checkout.guess::
+       Provides the default value for the `--guess` or `--no-guess`
+       option in `git checkout` and `git switch`. See
+       linkgit:git-switch[1] and linkgit:git-checkout[1].
index afa5c11fd3c4d58f978e5bb99a03517c642584c6..1435d3de9e6003922a4388f57da877754535824e 100644 (file)
@@ -192,7 +192,10 @@ branches from there if `<branch>` is ambiguous but exists on the
 'origin' remote. See also `checkout.defaultRemote` in
 linkgit:git-config[1].
 +
-Use `--no-guess` to disable this.
+`--guess` is the default behavior. Use `--no-guess` to disable it.
++
+The default behavior can be set via the `checkout.guess` configuration
+variable.
 
 -l::
        Create the new branch's reflog; see linkgit:git-branch[1] for
index 3759c3a265b5b9761a9df4d8e6b9d733d29aee04..5c438cd505875841763f0151dfe0a2c1454dfcc5 100644 (file)
@@ -103,6 +103,9 @@ ambiguous but exists on the 'origin' remote. See also
 `checkout.defaultRemote` in linkgit:git-config[1].
 +
 `--guess` is the default behavior. Use `--no-guess` to disable it.
++
+The default behavior can be set via the `checkout.guess` configuration
+variable.
 
 -f::
 --force::
index 0951f8fee5cc2a88ac9e08009a69eaf446b6fed4..0c0394a0d653fe9c2f615e2ff65fd5311d127f47 100644 (file)
@@ -1093,11 +1093,16 @@ static int switch_branches(const struct checkout_opts *opts,
 
 static int git_checkout_config(const char *var, const char *value, void *cb)
 {
+       struct checkout_opts *opts = cb;
+
        if (!strcmp(var, "diff.ignoresubmodules")) {
-               struct checkout_opts *opts = cb;
                handle_ignore_submodules_arg(&opts->diff_options, value);
                return 0;
        }
+       if (!strcmp(var, "checkout.guess")) {
+               opts->dwim_new_local_branch = git_config_bool(var, value);
+               return 0;
+       }
 
        if (starts_with(var, "submodule."))
                return git_default_submodule_config(var, value, NULL);
index 0a96ad87e7b6d8723175d3b97c18921ddc737d7b..5f09dd9bad26cb191c71e069cd653eb937df443d 100644 (file)
@@ -1467,14 +1467,15 @@ _git_bundle ()
 # Helper function to decide whether or not we should enable DWIM logic for
 # git-switch and git-checkout.
 #
-# To decide between the following rules in priority order
-# 1) the last provided of "--guess" or "--no-guess" explicitly enable or
-#    disable completion of DWIM logic respectively.
-# 2) If the --no-track option is provided, take this as a hint to disable the
-#    DWIM completion logic
-# 3) If GIT_COMPLETION_CHECKOUT_NO_GUESS is set, disable the DWIM completion
-#    logic, as requested by the user.
-# 4) Enable DWIM logic otherwise.
+# To decide between the following rules in decreasing priority order:
+# - the last provided of "--guess" or "--no-guess" explicitly enable or
+#   disable completion of DWIM logic respectively.
+# - If checkout.guess is false, disable completion of DWIM logic.
+# - If the --no-track option is provided, take this as a hint to disable the
+#   DWIM completion logic
+# - If GIT_COMPLETION_CHECKOUT_NO_GUESS is set, disable the DWIM completion
+#   logic, as requested by the user.
+# - Enable DWIM logic otherwise.
 #
 __git_checkout_default_dwim_mode ()
 {
@@ -1485,11 +1486,17 @@ __git_checkout_default_dwim_mode ()
        fi
 
        # --no-track disables DWIM, but with lower priority than
-       # --guess/--no-guess
+       # --guess/--no-guess/checkout.guess
        if [ -n "$(__git_find_on_cmdline "--no-track")" ]; then
                dwim_opt=""
        fi
 
+       # checkout.guess = false disables DWIM, but with lower priority than
+       # --guess/--no-guess
+       if [ "$(__git config --type=bool checkout.guess)" = "false" ]; then
+               dwim_opt=""
+       fi
+
        # Find the last provided --guess or --no-guess
        last_option="$(__git_find_last_on_cmdline "--guess --no-guess")"
        case "$last_option" in
index accfa9aa4bd82a5f13d3ce5e3755f33f47b38e3e..a4f8d3a67e8a4a36d6bccdda6a83da15c53ee5f3 100755 (executable)
@@ -166,6 +166,17 @@ test_expect_success '--no-guess suppresses branch auto-vivification' '
        test_branch master
 '
 
+test_expect_success 'checkout.guess = false suppresses branch auto-vivification' '
+       git checkout -B master &&
+       status_uno_is_clean &&
+       test_might_fail git branch -D bar &&
+
+       test_config checkout.guess false &&
+       test_must_fail git checkout bar &&
+       test_must_fail git rev-parse --verify refs/heads/bar &&
+       test_branch master
+'
+
 test_expect_success 'setup more remotes with unconventional refspecs' '
        git checkout -B master &&
        status_uno_is_clean &&
index 2c1b8c0d6d22469fadd9eeb05a19c1b7a53d0f51..68c9101b02f32d943ec5c167d7a726747f5970e4 100755 (executable)
@@ -85,9 +85,12 @@ test_expect_success 'switching ignores file of same branch name' '
        test_cmp expected actual
 '
 
-test_expect_success 'guess and create branch ' '
+test_expect_success 'guess and create branch' '
        test_when_finished git switch master &&
        test_must_fail git switch --no-guess foo &&
+       test_config checkout.guess false &&
+       test_must_fail git switch foo &&
+       test_config checkout.guess true &&
        git switch foo &&
        echo refs/heads/foo >expected &&
        git symbolic-ref HEAD >actual &&
index 7b7bc6e4bd86a39e5d0eeede2eb566efe434e239..eb9e56c39eb331b22d336f29ec9e3f07a39a4649 100755 (executable)
@@ -1360,6 +1360,58 @@ test_expect_success 'git checkout - a later --no-guess overrides previous --gues
        EOF
 '
 
+test_expect_success 'git checkout - with checkout.guess = false, only completes refs' '
+       test_config checkout.guess false &&
+       test_completion "git checkout " <<-\EOF
+       HEAD Z
+       master Z
+       matching-branch Z
+       matching-tag Z
+       other/branch-in-other Z
+       other/master-in-other Z
+       EOF
+'
+
+test_expect_success 'git checkout - with checkout.guess = true, completes refs and unique remote branches for DWIM' '
+       test_config checkout.guess true &&
+       test_completion "git checkout " <<-\EOF
+       HEAD Z
+       branch-in-other Z
+       master Z
+       master-in-other Z
+       matching-branch Z
+       matching-tag Z
+       other/branch-in-other Z
+       other/master-in-other Z
+       EOF
+'
+
+test_expect_success 'git checkout - a later --guess overrides previous checkout.guess = false, complete refs and unique remote branches for DWIM' '
+       test_config checkout.guess false &&
+       test_completion "git checkout --guess " <<-\EOF
+       HEAD Z
+       branch-in-other Z
+       master Z
+       master-in-other Z
+       matching-branch Z
+       matching-tag Z
+       other/branch-in-other Z
+       other/master-in-other Z
+       EOF
+'
+
+test_expect_success 'git checkout - a later --no-guess overrides previous checkout.guess = true, complete only refs' '
+       test_config checkout.guess true &&
+       test_completion "git checkout --no-guess " <<-\EOF
+       HEAD Z
+       master Z
+       matching-branch Z
+       matching-tag Z
+       other/branch-in-other Z
+       other/master-in-other Z
+       EOF
+'
+
 test_expect_success 'git switch - with --detach, complete all references' '
        test_completion "git switch --detach " <<-\EOF
        HEAD Z