Code

Submodules: Add 'on-demand' value for the 'fetchRecurseSubmodule' option
authorJens Lehmann <Jens.Lehmann@web.de>
Sun, 6 Mar 2011 22:12:19 +0000 (23:12 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 9 Mar 2011 21:10:35 +0000 (13:10 -0800)
Now the behavior of fetch and pull can be configured to the recently added
'on-demand' mode separately for each submodule too.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
Documentation/gitmodules.txt
submodule.c
t/t5526-fetch-submodules.sh

index 75b1d32282c218230a87a7d61f325922233f733a..2210633882e06e00fb345154c6b132ab125c0c60 100644 (file)
@@ -1823,7 +1823,7 @@ submodule.<name>.update::
        linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
 
 submodule.<name>.fetchRecurseSubmodules::
        linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
 
 submodule.<name>.fetchRecurseSubmodules::
-       This option can be used to enable/disable recursive fetching of this
+       This option can be used to control recursive fetching of this
        submodule. It can be overridden by using the --[no-]recurse-submodules
        command line option to "git fetch" and "git pull".
        This setting will override that from in the linkgit:gitmodules[5]
        submodule. It can be overridden by using the --[no-]recurse-submodules
        command line option to "git fetch" and "git pull".
        This setting will override that from in the linkgit:gitmodules[5]
index 68977943e7bba092f5e55e6ad1b9ede83f4c2b67..25daee221fabad13adca5d043e5c5770624569c7 100644 (file)
@@ -45,12 +45,12 @@ submodule.<name>.update::
        the '--merge' or '--rebase' options.
 
 submodule.<name>.fetchRecurseSubmodules::
        the '--merge' or '--rebase' options.
 
 submodule.<name>.fetchRecurseSubmodules::
-       This option can be used to enable/disable recursive fetching of this
+       This option can be used to control recursive fetching of this
        submodule. If this option is also present in the submodules entry in
        .git/config of the superproject, the setting there will override the
        one found in .gitmodules.
        Both settings can be overridden on the command line by using the
        submodule. If this option is also present in the submodules entry in
        .git/config of the superproject, the setting there will override the
        one found in .gitmodules.
        Both settings can be overridden on the command line by using the
-       "--[no-]recurse-submodules" option to "git fetch" and "git pull"..
+       "--[no-]recurse-submodules" option to "git fetch" and "git pull".
 
 submodule.<name>.ignore::
        Defines under what circumstances "git status" and the diff family show
 
 submodule.<name>.ignore::
        Defines under what circumstances "git status" and the diff family show
index afb0a0e3fe588a756578642b7f063b14000fe910..924b156950982db56ab6ddf1093aff30375e5ee4 100644 (file)
@@ -113,7 +113,7 @@ int parse_submodule_config_option(const char *var, const char *value)
                if (!config)
                        config = string_list_append(&config_fetch_recurse_submodules_for_name,
                                                    strbuf_detach(&submodname, NULL));
                if (!config)
                        config = string_list_append(&config_fetch_recurse_submodules_for_name,
                                                    strbuf_detach(&submodname, NULL));
-               config->util = git_config_bool(var, value) ? (void *)1 : NULL;
+               config->util = (void *)(intptr_t)parse_fetch_recurse_submodules_arg(var, value);
                strbuf_release(&submodname);
        } else if ((len > 7) && !strcmp(var + len - 7, ".ignore")) {
                if (strcmp(value, "untracked") && strcmp(value, "dirty") &&
                strbuf_release(&submodname);
        } else if ((len > 7) && !strcmp(var + len - 7, ".ignore")) {
                if (strcmp(value, "untracked") && strcmp(value, "dirty") &&
@@ -380,8 +380,13 @@ int fetch_populated_submodules(int num_options, const char **options,
                        struct string_list_item *fetch_recurse_submodules_option;
                        fetch_recurse_submodules_option = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name);
                        if (fetch_recurse_submodules_option) {
                        struct string_list_item *fetch_recurse_submodules_option;
                        fetch_recurse_submodules_option = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, name);
                        if (fetch_recurse_submodules_option) {
-                               if (!fetch_recurse_submodules_option->util)
+                               if ((intptr_t)fetch_recurse_submodules_option->util == RECURSE_SUBMODULES_OFF)
                                        continue;
                                        continue;
+                               if ((intptr_t)fetch_recurse_submodules_option->util == RECURSE_SUBMODULES_ON_DEMAND) {
+                                       if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name))
+                                               continue;
+                                       default_argv = "on-demand";
+                               }
                        } else {
                                if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF)
                                        continue;
                        } else {
                                if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF)
                                        continue;
index e6d873a48963f69f1527a63c444c452dfc93ab43..09701aa1a71fa51b54fd2bf68858437eb63c1ee2 100755 (executable)
@@ -400,4 +400,32 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config
        test_cmp expect.err.2 actual.err
 '
 
        test_cmp expect.err.2 actual.err
 '
 
+test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' overrides fetch.recurseSubmodules" '
+       (
+               cd downstream &&
+               git fetch --recurse-submodules
+       ) &&
+       add_upstream_commit &&
+       git config fetch.recurseSubmodules false &&
+       head1=$(git rev-parse --short HEAD) &&
+       git add submodule &&
+       git commit -m "new submodule" &&
+       head2=$(git rev-parse --short HEAD) &&
+       echo "From $pwd/." > expect.err.2 &&
+       echo "   $head1..$head2  master     -> origin/master" >> expect.err.2
+       head -2 expect.err >> expect.err.2 &&
+       (
+               cd downstream &&
+               git config submodule.submodule.fetchRecurseSubmodules on-demand &&
+               git fetch >../actual.out 2>../actual.err
+       ) &&
+       git config --unset fetch.recurseSubmodules &&
+       (
+               cd downstream &&
+               git config --unset submodule.submodule.fetchRecurseSubmodules
+       ) &&
+       test_cmp expect.out.sub actual.out &&
+       test_cmp expect.err.2 actual.err
+'
+
 test_done
 test_done