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  | 19 +++++++++++++++++++
 4 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index a0ab66a..67e0714 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 a0ea2c5..819c430 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 2149ef7..0c807d9 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 60f6987..788c59d 100755
--- a/t/t2013-checkout-submodule.sh
+++ b/t/t2013-checkout-submodule.sh
@@ -149,6 +149,25 @@ test_expect_success '"checkout --recurse-submodules" 
repopulates submodule' '
        )
 '
 
+test_expect_success 'option checkout.recurseSubmodules updates submodule' '
+       test_config -C super checkout.recurseSubmodules 1 &&
+       (
+               cd super &&
+               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' '
        (
                cd super &&
-- 
2.10.1.469.g00a8914

Reply via email to