To make it easier for the user, who doesn't want to give the
`--recurse-submodules` option whenever they run checkout, have an
option for to set the default behavior for checkout to recurse into
submodules.

Signed-off-by: Stefan Beller <sbel...@google.com>
---
 Documentation/config.txt       |  6 ++++++
 Documentation/git-checkout.txt |  5 +++--
 submodule.c                    |  6 +++---
 t/t2013-checkout-submodule.sh  | 16 ++++++++++++++++
 4 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index a0ab66aae7..67e0714358 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -949,6 +949,12 @@ clean.requireForce::
        A boolean to make git-clean do nothing unless given -f,
        -i or -n.   Defaults to true.
 
+checkout.recurseSubmodules::
+       This option can be set to a boolean value.
+       When set to true checkout will recurse into submodules and
+       update them. When set to false, which is the default, checkout
+       will leave submodules untouched.
+
 color.branch::
        A boolean to enable/disable color in the output of
        linkgit:git-branch[1]. May be set to `always`,
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index a0ea2c5651..819c430b6e 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -260,8 +260,9 @@ section of linkgit:git-add[1] to learn how to operate the 
`--patch` mode.
        Using --recurse-submodules will update the content of all initialized
        submodules according to the commit recorded in the superproject. If
        local modifications in a submodule would be overwritten the checkout
-       will fail until `-f` is used. If nothing (or --no-recurse-submodules)
-       is used, the work trees of submodules will not be updated.
+       will fail until `-f` is used. If `--no-recurse-submodules` is used,
+       the work trees of submodules will not be updated. If no command line
+       argument is given, `checkout.recurseSubmodules` is used as a default.
 
 <branch>::
        Branch to checkout; if it refers to a branch (i.e., a name that,
diff --git a/submodule.c b/submodule.c
index 4253f7f044..e4e326bce4 100644
--- a/submodule.c
+++ b/submodule.c
@@ -160,10 +160,10 @@ int submodule_config(const char *var, const char *value, 
void *cb)
                return 0;
        } else if (starts_with(var, "submodule."))
                return parse_submodule_config_option(var, value);
-       else if (!strcmp(var, "fetch.recursesubmodules")) {
+       else if (!strcmp(var, "fetch.recursesubmodules"))
                config_fetch_recurse_submodules = 
parse_fetch_recurse_submodules_arg(var, value);
-               return 0;
-       }
+       else if (!strcmp(var, "checkout.recursesubmodules"))
+               config_update_recurse_submodules = 
parse_update_recurse_submodules_arg(var, value);
        return 0;
 }
 
diff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh
index 33fb2f5de3..673021fb80 100755
--- a/t/t2013-checkout-submodule.sh
+++ b/t/t2013-checkout-submodule.sh
@@ -137,6 +137,22 @@ test_expect_success '"checkout --recurse-submodules" 
repopulates submodule' '
        submodule_creation_must_succeed delete_submodule base
 '
 
+test_expect_success 'option checkout.recurseSubmodules updates submodule' '
+       test_config checkout.recurseSubmodules 1 &&
+       git checkout base &&
+       git checkout -b advanced-base &&
+       git -C submodule commit --allow-empty -m "empty commit" &&
+       git add submodule &&
+       git commit -m "advance submodule" &&
+       git checkout base &&
+       git diff-files --quiet &&
+       git diff-index --quiet --cached base &&
+       git checkout advanced-base &&
+       git diff-files --quiet &&
+       git diff-index --quiet --cached advanced-base &&
+       git checkout --recurse-submodules base
+'
+
 test_expect_success '"checkout --recurse-submodules" repopulates submodule in 
existing directory' '
        git checkout --recurse-submodules delete_submodule &&
        mkdir submodule &&
-- 
2.11.0.rc2.28.g2673dad

Reply via email to