Changes in v5:
* Add "NEEDSWORK" comments to indicate where attention is needed once
per-worktree config is a reality
* --no-recurse now works by clearing the string list of paths.
* module_list_active() now does post-processing instead of duplicating code.
Brandon Williams (10):
submodule--helper: add is-active subcommand
submodule status: use submodule--helper is-active
submodule sync: skip work for inactive submodules
submodule sync: use submodule--helper is-active
submodule--helper clone: check for configured submodules using helper
submodule: decouple url and submodule interest
submodule init: initialize active submodules
clone: teach --recurse-submodules to optionally take a pathspec
submodule--helper init: set submodule.<name>.active
submodule add: respect submodule.active and submodule.<name>.active
Documentation/config.txt | 15 ++++-
Documentation/git-clone.txt | 14 +++--
Documentation/git-submodule.txt | 4 +-
builtin/clone.c | 50 ++++++++++++---
builtin/submodule--helper.c | 68 ++++++++++++++++----
git-submodule.sh | 55 ++++++++++------
submodule.c | 50 ++++++++++++---
t/t7400-submodule-basic.sh | 136 ++++++++++++++++++++++++++++++++++++++++
t/t7413-submodule-is-active.sh | 107 +++++++++++++++++++++++++++++++
9 files changed, 445 insertions(+), 54 deletions(-)
create mode 100755 t/t7413-submodule-is-active.sh
---interdiff with 'origin/bw/submodule-is-active'
diff --git a/builtin/clone.c b/builtin/clone.c
index 3dc8faac5..a7be61d6b 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -62,9 +62,8 @@ static int recurse_submodules_cb(const struct option *opt,
const char *arg, int unset)
{
if (unset)
- return -1;
-
- if (arg)
+ string_list_clear((struct string_list *)opt->value, 0);
+ else if (arg)
string_list_append((struct string_list *)opt->value, arg);
else
string_list_append((struct string_list *)opt->value,
@@ -984,6 +983,10 @@ int cmd_clone(int argc, const char **argv, const char
*prefix)
string_list_sort(&option_recurse_submodules);
string_list_remove_duplicates(&option_recurse_submodules, 0);
+ /*
+ * NEEDSWORK: In a multi-working-tree world, this needs to be
+ * set in the per-worktree config.
+ */
for_each_string_list_item(item, &option_recurse_submodules) {
strbuf_addf(&sb, "submodule.active=%s",
item->string);
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index a574596cb..7700d8948 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -273,29 +273,24 @@ static int module_list_compute(int argc, const char
**argv,
static void module_list_active(struct module_list *list)
{
int i;
-
- if (read_cache() < 0)
- die(_("index file corrupt"));
+ struct module_list active_modules = MODULE_LIST_INIT;
gitmodules_config();
- for (i = 0; i < active_nr; i++) {
- const struct cache_entry *ce = active_cache[i];
+ for (i = 0; i < list->nr; i++) {
+ const struct cache_entry *ce = list->entries[i];
- if (!S_ISGITLINK(ce->ce_mode) ||
- !is_submodule_initialized(ce->name))
+ if (!is_submodule_initialized(ce->name))
continue;
- ALLOC_GROW(list->entries, list->nr + 1, list->alloc);
- list->entries[list->nr++] = ce;
- while (i + 1 < active_nr &&
- !strcmp(ce->name, active_cache[i + 1]->name))
- /*
- * Skip entries with the same name in different stages
- * to make sure an entry is returned only once.
- */
- i++;
+ ALLOC_GROW(active_modules.entries,
+ active_modules.nr + 1,
+ active_modules.alloc);
+ active_modules.entries[active_modules.nr++] = ce;
}
+
+ free(list->entries);
+ *list = active_modules;
}
static int module_list(int argc, const char **argv, const char *prefix)
@@ -361,7 +356,12 @@ static void init_submodule(const char *path, const char
*prefix, int quiet)
die(_("No url found for submodule path '%s' in .gitmodules"),
displaypath);
- /* Set active flag for the submodule being initialized */
+ /*
+ * NEEDSWORK: In a multi-working-tree world, this needs to be
+ * set in the per-worktree config.
+ *
+ * Set active flag for the submodule being initialized
+ */
if (!is_submodule_initialized(path)) {
strbuf_reset(&sb);
strbuf_addf(&sb, "submodule.%s.active", sub->name);
@@ -452,14 +452,15 @@ static int module_init(int argc, const char **argv, const
char *prefix)
argc = parse_options(argc, argv, prefix, module_init_options,
git_submodule_helper_usage, 0);
+ if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
+ return 1;
+
/*
* If there are no path args and submodule.active is set then,
* by default, only initialize 'active' modules.
*/
if (!argc && git_config_get_value_multi("submodule.active"))
module_list_active(&list);
- else if (module_list_compute(argc, argv, prefix, &pathspec, &list) < 0)
- return 1;
for (i = 0; i < list.nr; i++)
init_submodule(list.entries[i]->name, prefix, quiet);
diff --git a/git-submodule.sh b/git-submodule.sh
index 6eca93416..6ec35e5fc 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -279,6 +279,8 @@ or you are unsure what this means choose another name with
the '--name' option."
git add --force .gitmodules ||
die "$(eval_gettext "Failed to register submodule '\$sm_path'")"
+ # NEEDSWORK: In a multi-working-tree world, this needs to be
+ # set in the per-worktree config.
if git config --get submodule.active >/dev/null
then
# If the submodule being adding isn't already covered by the
--
2.12.0.367.g23dc2f6d3c-goog