Skip to content

Commit

Permalink
Submodules: Add the "fetchRecurseSubmodules" config option
Browse files Browse the repository at this point in the history
The new boolean "fetchRecurseSubmodules" config option controls the
behavior for "git fetch" and "git pull". It specifies if these commands
should recurse into submodules and fetch new commits there too and can be
set separately for each submodule.

In the .gitmodules file "submodule.<name>.fetchRecurseSubmodules" entries
are read before looking for them in .git/config. Thus settings found in
.git/config will override those from .gitmodules, thereby allowing the
user to ignore settings given by the remote side while also letting
upstream set reasonable defaults for those users who don't have special
needs.

This configuration can be overridden by the command line option
"--[no-]recurse-submodules" of "git fetch" and "git pull".

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jens Lehmann authored and Junio C Hamano committed Nov 12, 2010
1 parent be254a0 commit c1a3c36
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 3 deletions.
7 changes: 7 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1768,6 +1768,13 @@ submodule.<name>.update::
URL and other values found in the `.gitmodules` file. See
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
submodule. It can be overriden 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]
file.

submodule.<name>.ignore::
Defines under what circumstances "git status" and the diff family show
a submodule as modified. When set to "all", it will never be considered
Expand Down
2 changes: 1 addition & 1 deletion Documentation/fetch-options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ endif::git-pull[]

--[no-]recurse-submodules::
This option controls if new commits of all populated submodules should
be fetched too (see linkgit:git-config[1]).
be fetched too (see linkgit:git-config[1] and linkgit:gitmodules[5]).

ifndef::git-pull[]
--submodule-prefix=<path>::
Expand Down
8 changes: 8 additions & 0 deletions Documentation/gitmodules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,14 @@ submodule.<name>.update::
This config option is overridden if 'git submodule update' is given
the '--merge' or '--rebase' options.

submodule.<name>.fetchRecurseSubmodules::
This option can be used to enable/disable 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 overriden on the command line by using the
"--[no-]recurse-submodules" option to "git fetch" and "git pull"..

submodule.<name>.ignore::
Defines under what circumstances "git status" and the diff family show
a submodule as modified. When set to "all", it will never be considered
Expand Down
20 changes: 18 additions & 2 deletions submodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "string-list.h"

struct string_list config_name_for_path;
struct string_list config_fetch_recurse_submodules_for_name;
struct string_list config_ignore_for_name;
static int config_fetch_recurse_submodules;

Expand Down Expand Up @@ -105,6 +106,14 @@ int parse_submodule_config_option(const char *var, const char *value)
config = string_list_append(&config_name_for_path, xstrdup(value));
config->util = strbuf_detach(&submodname, NULL);
strbuf_release(&submodname);
} else if ((len > 23) && !strcmp(var + len - 23, ".fetchrecursesubmodules")) {
strbuf_add(&submodname, var, len - 23);
config = unsorted_string_list_lookup(&config_fetch_recurse_submodules_for_name, submodname.buf);
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;
strbuf_release(&submodname);
} else if ((len > 7) && !strcmp(var + len - 7, ".ignore")) {
if (strcmp(value, "untracked") && strcmp(value, "dirty") &&
strcmp(value, "all") && strcmp(value, "none")) {
Expand Down Expand Up @@ -283,8 +292,15 @@ int fetch_populated_submodules(int num_options, const char **options,
name = name_for_path->util;

if (!ignore_config) {
if (!config_fetch_recurse_submodules)
continue;
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)
continue;
} else {
if (!config_fetch_recurse_submodules)
continue;
}
}

strbuf_addf(&submodule_path, "%s/%s", work_tree, ce->name);
Expand Down
50 changes: 50 additions & 0 deletions t/t5526-fetch-submodules.sh
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,56 @@ test_expect_success "fetch alone only fetches superproject" '
! test -s actual.err
'

test_expect_success "fetch --no-recurse-submodules only fetches superproject" '
(
cd downstream &&
git fetch --no-recurse-submodules >../actual.out 2>../actual.err
) &&
! test -s actual.out &&
! test -s actual.err
'

test_expect_success "using fetchRecurseSubmodules=true in .gitmodules recurses into submodules" '
(
cd downstream &&
git config -f .gitmodules submodule.submodule.fetchRecurseSubmodules true &&
git fetch >../actual.out 2>../actual.err
) &&
test_cmp expect.out actual.out &&
test_cmp expect.err actual.err
'

test_expect_success "--no-recurse-submodules overrides .gitmodules config" '
add_upstream_commit &&
(
cd downstream &&
git fetch --no-recurse-submodules >../actual.out 2>../actual.err
) &&
! test -s actual.out &&
! test -s actual.err
'

test_expect_success "using fetchRecurseSubmodules=false in .git/config overrides setting in .gitmodules" '
(
cd downstream &&
git config submodule.submodule.fetchRecurseSubmodules false &&
git fetch >../actual.out 2>../actual.err
) &&
! test -s actual.out &&
! test -s actual.err
'

test_expect_success "--recurse-submodules overrides fetchRecurseSubmodules setting from .git/config" '
(
cd downstream &&
git fetch --recurse-submodules >../actual.out 2>../actual.err &&
git config -f --unset .gitmodules submodule.submodule.fetchRecurseSubmodules true &&
git config --unset submodule.submodule.fetchRecurseSubmodules
) &&
test_cmp expect.out actual.out &&
test_cmp expect.err actual.err
'

test_expect_success "--quiet propagates to submodules" '
(
cd downstream &&
Expand Down

0 comments on commit c1a3c36

Please sign in to comment.