summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/config.txt5
-rw-r--r--Documentation/fetch-options.txt5
-rw-r--r--builtin/fetch.c21
-rwxr-xr-xgit-pull.sh3
-rw-r--r--submodule.c18
-rw-r--r--submodule.h4
-rwxr-xr-xt/t5526-fetch-submodules.sh36
7 files changed, 83 insertions, 9 deletions
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 05ec3fed89..b10e36f7e4 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -862,6 +862,11 @@ diff.wordRegex::
sequences that match the regular expression are "words", all other
characters are *ignorable* whitespace.
+fetch.recurseSubmodules::
+ A boolean value which changes the behavior for fetch and pull, the
+ default is to not recursively fetch populated sumodules unless
+ configured otherwise.
+
fetch.unpackLimit::
If the number of objects fetched over the git native
transfer is below this
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index 7f8d562efc..4cddfe8fa8 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -60,8 +60,9 @@ endif::git-pull[]
flag lets all tags and their associated objects be
downloaded.
---recurse-submodules::
- Use this option to fetch new commits of all populated submodules too.
+--[no-]recurse-submodules::
+ This option controls if new commits of all populated submodules should
+ be fetched too (see linkgit:git-config[1]).
ifndef::git-pull[]
--submodule-prefix=<path>::
diff --git a/builtin/fetch.c b/builtin/fetch.c
index cbbde2d0ee..75032a5076 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -28,8 +28,14 @@ enum {
TAGS_SET = 2
};
+enum {
+ RECURSE_SUBMODULES_OFF = 0,
+ RECURSE_SUBMODULES_DEFAULT = 1,
+ RECURSE_SUBMODULES_ON = 2
+};
+
static int all, append, dry_run, force, keep, multiple, prune, update_head_ok, verbosity;
-static int progress, recurse_submodules;
+static int progress, recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
static int tags = TAGS_DEFAULT;
static const char *depth;
static const char *upload_pack;
@@ -55,8 +61,9 @@ static struct option builtin_fetch_options[] = {
"do not fetch all tags (--no-tags)", TAGS_UNSET),
OPT_BOOLEAN('p', "prune", &prune,
"prune tracking branches no longer on remote"),
- OPT_BOOLEAN(0, "recurse-submodules", &recurse_submodules,
- "control recursive fetching of submodules"),
+ OPT_SET_INT(0, "recurse-submodules", &recurse_submodules,
+ "control recursive fetching of submodules",
+ RECURSE_SUBMODULES_ON),
OPT_BOOLEAN(0, "dry-run", &dry_run,
"dry run"),
OPT_BOOLEAN('k', "keep", &keep, "keep downloaded pack"),
@@ -795,7 +802,7 @@ static void add_options_to_argv(int *argc, const char **argv)
argv[(*argc)++] = "--force";
if (keep)
argv[(*argc)++] = "--keep";
- if (recurse_submodules)
+ if (recurse_submodules == RECURSE_SUBMODULES_ON)
argv[(*argc)++] = "--recurse-submodules";
if (verbosity >= 2)
argv[(*argc)++] = "-v";
@@ -933,14 +940,18 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
}
}
- if (!result && recurse_submodules) {
+ if (!result && (recurse_submodules != RECURSE_SUBMODULES_OFF)) {
const char *options[10];
int num_options = 0;
+ /* Set recursion as default when we already are recursing */
+ if (submodule_prefix[0])
+ set_config_fetch_recurse_submodules(1);
gitmodules_config();
git_config(submodule_config, NULL);
add_options_to_argv(&num_options, options);
result = fetch_populated_submodules(num_options, options,
submodule_prefix,
+ recurse_submodules == RECURSE_SUBMODULES_ON,
verbosity < 0);
}
diff --git a/git-pull.sh b/git-pull.sh
index 5804c627ca..a5ab19538c 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -108,6 +108,9 @@ do
--recurse-submodules)
recurse_submodules=--recurse-submodules
;;
+ --no-recurse-submodules)
+ recurse_submodules=--no-recurse-submodules
+ ;;
--d|--dr|--dry|--dry-|--dry-r|--dry-ru|--dry-run)
dry_run=--dry-run
;;
diff --git a/submodule.c b/submodule.c
index 4d9b774cd1..01d75f528b 100644
--- a/submodule.c
+++ b/submodule.c
@@ -11,6 +11,7 @@
struct string_list config_name_for_path;
struct string_list config_ignore_for_name;
+static int config_fetch_recurse_submodules;
static int add_submodule_odb(const char *path)
{
@@ -67,6 +68,10 @@ int submodule_config(const char *var, const char *value, void *cb)
{
if (!prefixcmp(var, "submodule."))
return parse_submodule_config_option(var, value);
+ else if (!strcmp(var, "fetch.recursesubmodules")) {
+ config_fetch_recurse_submodules = git_config_bool(var, value);
+ return 0;
+ }
return 0;
}
@@ -229,8 +234,14 @@ void show_submodule_summary(FILE *f, const char *path,
strbuf_release(&sb);
}
+void set_config_fetch_recurse_submodules(int value)
+{
+ config_fetch_recurse_submodules = value;
+}
+
int fetch_populated_submodules(int num_options, const char **options,
- const char *prefix, int quiet)
+ const char *prefix, int ignore_config,
+ int quiet)
{
int i, result = 0, argc = 0;
struct child_process cp;
@@ -271,6 +282,11 @@ int fetch_populated_submodules(int num_options, const char **options,
if (name_for_path)
name = name_for_path->util;
+ if (!ignore_config) {
+ if (!config_fetch_recurse_submodules)
+ continue;
+ }
+
strbuf_addf(&submodule_path, "%s/%s", work_tree, ce->name);
strbuf_addf(&submodule_git_dir, "%s/.git", submodule_path.buf);
strbuf_addf(&submodule_prefix, "%s%s/", prefix, ce->name);
diff --git a/submodule.h b/submodule.h
index b39d7a12ff..4729023aa5 100644
--- a/submodule.h
+++ b/submodule.h
@@ -13,8 +13,10 @@ void show_submodule_summary(FILE *f, const char *path,
unsigned char one[20], unsigned char two[20],
unsigned dirty_submodule,
const char *del, const char *add, const char *reset);
+void set_config_fetch_recurse_submodules(int value);
int fetch_populated_submodules(int num_options, const char **options,
- const char *prefix, int quiet);
+ const char *prefix, int ignore_config,
+ int quiet);
unsigned is_submodule_modified(const char *path, int ignore_untracked);
int merge_submodule(unsigned char result[20], const char *path, const unsigned char base[20],
const unsigned char a[20], const unsigned char b[20]);
diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh
index 9c1d3a0f6a..71e2a66f3b 100755
--- a/t/t5526-fetch-submodules.sh
+++ b/t/t5526-fetch-submodules.sh
@@ -106,4 +106,40 @@ test_expect_success "--dry-run propagates to submodules" '
test_cmp expect.err actual.err
'
+test_expect_success "recurseSubmodules=true propagates into submodules" '
+ add_upstream_commit &&
+ (
+ cd downstream &&
+ git config fetch.recurseSubmodules true
+ git fetch >../actual.out 2>../actual.err
+ ) &&
+ test_cmp expect.out actual.out &&
+ test_cmp expect.err actual.err
+'
+
+test_expect_success "--recurse-submodules overrides config in submodule" '
+ add_upstream_commit &&
+ (
+ cd downstream &&
+ (
+ cd submodule &&
+ git config fetch.recurseSubmodules false
+ ) &&
+ git fetch --recurse-submodules >../actual.out 2>../actual.err
+ ) &&
+ test_cmp expect.out actual.out &&
+ test_cmp expect.err actual.err
+'
+
+test_expect_success "--no-recurse-submodules overrides config setting" '
+ add_upstream_commit &&
+ (
+ cd downstream &&
+ git config fetch.recurseSubmodules true
+ git fetch --no-recurse-submodules >../actual.out 2>../actual.err
+ ) &&
+ ! test -s actual.out &&
+ ! test -s actual.err
+'
+
test_done