summaryrefslogtreecommitdiff
path: root/submodule.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-06-13 20:47:07 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-06-13 20:47:07 (GMT)
commit3c548de3788eda31388b435d8983866fe43e032f (patch)
treeebc1325a891abcf3fac7dcdf04c86c077a1d76a4 /submodule.c
parent93dd544f54ea596e9d70d06c100123c10689861c (diff)
parent58f4203e7db265cd2d8315ca5d9c9979cd577427 (diff)
downloadgit-3c548de3788eda31388b435d8983866fe43e032f.zip
git-3c548de3788eda31388b435d8983866fe43e032f.tar.gz
git-3c548de3788eda31388b435d8983866fe43e032f.tar.bz2
Merge branch 'sb/submodule-blanket-recursive'
Many commands learned to pay attention to submodule.recurse configuration. * sb/submodule-blanket-recursive: builtin/fetch.c: respect 'submodule.recurse' option builtin/push.c: respect 'submodule.recurse' option builtin/grep.c: respect 'submodule.recurse' option Introduce 'submodule.recurse' option for worktree manipulators submodule loading: separate code path for .gitmodules and config overlay reset/checkout/read-tree: unify config callback for submodule recursion submodule test invocation: only pass additional arguments submodule recursing: do not write a config variable twice
Diffstat (limited to 'submodule.c')
-rw-r--r--submodule.c66
1 files changed, 57 insertions, 9 deletions
diff --git a/submodule.c b/submodule.c
index bf5a93d..1b8a3b5 100644
--- a/submodule.c
+++ b/submodule.c
@@ -16,9 +16,10 @@
#include "quote.h"
#include "remote.h"
#include "worktree.h"
+#include "parse-options.h"
static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
-static int config_update_recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
+static int config_update_recurse_submodules = RECURSE_SUBMODULES_OFF;
static int parallel_jobs = 1;
static struct string_list changed_submodule_paths = STRING_LIST_INIT_DUP;
static int initialized_fetch_ref_tips;
@@ -153,7 +154,8 @@ void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
}
}
-int submodule_config(const char *var, const char *value, void *cb)
+/* For loading from the .gitmodules file. */
+static int git_modules_config(const char *var, const char *value, void *cb)
{
if (!strcmp(var, "submodule.fetchjobs")) {
parallel_jobs = git_config_int(var, value);
@@ -169,6 +171,56 @@ int submodule_config(const char *var, const char *value, void *cb)
return 0;
}
+/* Loads all submodule settings from the config. */
+int submodule_config(const char *var, const char *value, void *cb)
+{
+ if (!strcmp(var, "submodule.recurse")) {
+ int v = git_config_bool(var, value) ?
+ RECURSE_SUBMODULES_ON : RECURSE_SUBMODULES_OFF;
+ config_update_recurse_submodules = v;
+ return 0;
+ } else {
+ return git_modules_config(var, value, cb);
+ }
+}
+
+/* Cheap function that only determines if we're interested in submodules at all */
+int git_default_submodule_config(const char *var, const char *value, void *cb)
+{
+ if (!strcmp(var, "submodule.recurse")) {
+ int v = git_config_bool(var, value) ?
+ RECURSE_SUBMODULES_ON : RECURSE_SUBMODULES_OFF;
+ config_update_recurse_submodules = v;
+ }
+ return 0;
+}
+
+int option_parse_recurse_submodules_worktree_updater(const struct option *opt,
+ const char *arg, int unset)
+{
+ if (unset) {
+ config_update_recurse_submodules = RECURSE_SUBMODULES_OFF;
+ return 0;
+ }
+ if (arg)
+ config_update_recurse_submodules =
+ parse_update_recurse_submodules_arg(opt->long_name,
+ arg);
+ else
+ config_update_recurse_submodules = RECURSE_SUBMODULES_ON;
+
+ return 0;
+}
+
+void load_submodule_cache(void)
+{
+ if (config_update_recurse_submodules == RECURSE_SUBMODULES_OFF)
+ return;
+
+ gitmodules_config();
+ git_config(submodule_config, NULL);
+}
+
void gitmodules_config(void)
{
const char *work_tree = get_git_work_tree();
@@ -196,7 +248,8 @@ void gitmodules_config(void)
}
if (!gitmodules_is_unmerged)
- git_config_from_file(submodule_config, gitmodules_path.buf, NULL);
+ git_config_from_file(git_modules_config,
+ gitmodules_path.buf, NULL);
strbuf_release(&gitmodules_path);
}
}
@@ -207,7 +260,7 @@ void gitmodules_config_sha1(const unsigned char *commit_sha1)
unsigned char sha1[20];
if (gitmodule_sha1_from_commit(commit_sha1, sha1, &rev)) {
- git_config_from_blob_sha1(submodule_config, rev.buf,
+ git_config_from_blob_sha1(git_modules_config, rev.buf,
sha1, NULL);
}
strbuf_release(&rev);
@@ -660,11 +713,6 @@ void set_config_fetch_recurse_submodules(int value)
config_fetch_recurse_submodules = value;
}
-void set_config_update_recurse_submodules(int value)
-{
- config_update_recurse_submodules = value;
-}
-
int should_update_submodules(void)
{
return config_update_recurse_submodules == RECURSE_SUBMODULES_ON;