This will be useful in a later patch. when passing in the --groups option, only the configured groups are considered instead of all groups. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- builtin/submodule--helper.c | 68 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 254824a..6a208ac 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -67,16 +67,33 @@ static int module_list_compute(int argc, const char **argv, return result; } +static int load_submodule_groups(struct string_list **groups) +{ + const char *g = NULL; + if (git_config_get_string_const("submodule.groups", &g) < 0) + return -1; + if (!g) + return 1; + *groups = xmalloc(sizeof(**groups)); + string_list_init(*groups, 1); + string_list_split(*groups, g, ',', -1); + string_list_sort(*groups); + return 0; +} + static int module_list(int argc, const char **argv, const char *prefix) { - int i; + int i, groups = 0; struct pathspec pathspec; struct module_list list = MODULE_LIST_INIT; + struct string_list *submodule_groups; struct option module_list_options[] = { OPT_STRING(0, "prefix", &prefix, N_("path"), N_("alternative anchor for relative paths")), + OPT_BOOL(0, "groups", &groups, + N_("Only initialize configured submodule groups")), OPT_END() }; @@ -93,9 +110,33 @@ static int module_list(int argc, const char **argv, const char *prefix) return 1; } + if (groups) { + gitmodules_config(); + if (load_submodule_groups(&submodule_groups)) + die(_("No groups configured?")); + } for (i = 0; i < list.nr; i++) { const struct cache_entry *ce = list.entries[i]; + if (groups) { + int found = 0; + struct string_list_item *item; + const struct submodule *sub = submodule_from_path(null_sha1, ce->name); + if (!sub) + die("BUG: Could not find submodule %s in cache, " + "despite having found it earlier", ce->name); + else { + for_each_string_list_item(item, sub->groups) { + if (string_list_lookup(submodule_groups, item->string)) { + found = 1; + break; + } + } + if (!found) + continue; + } + } + if (ce_stage(ce)) printf("%06o %s U\t", ce->ce_mode, sha1_to_hex(null_sha1)); else @@ -262,6 +303,7 @@ static int git_submodule_config(const char *var, const char *value, void *cb) struct submodule_update_clone { /* states */ + struct string_list *submodule_groups; int count; int print_unmatched; /* configuration */ @@ -275,7 +317,7 @@ struct submodule_update_clone { struct string_list projectlines; struct pathspec pathspec; }; -#define SUBMODULE_UPDATE_CLONE_INIT {0, 0, 0, NULL, NULL, NULL, NULL, NULL, MODULE_LIST_INIT, STRING_LIST_INIT_DUP} +#define SUBMODULE_UPDATE_CLONE_INIT {NULL, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, MODULE_LIST_INIT, STRING_LIST_INIT_DUP} static void fill_clone_command(struct child_process *cp, int quiet, const char *prefix, const char *path, @@ -318,6 +360,7 @@ static int update_clone_get_next_task(void **pp_task_cb, const char *update_module = NULL; char *url = NULL; int needs_cloning = 0; + int in_submodule_groups = 0; if (ce_stage(ce)) { if (pp->recursive_prefix) @@ -372,6 +415,20 @@ static int update_clone_get_next_task(void **pp_task_cb, continue; } + if (pp->submodule_groups) { + struct string_list_item *item; + for_each_string_list_item(item, sub->groups) { + if (string_list_lookup( + pp->submodule_groups, item->string)) { + in_submodule_groups = 1; + break; + } + } + } + + if (pp->submodule_groups && !in_submodule_groups) + continue; + strbuf_reset(&sb); strbuf_addf(&sb, "%s/.git", ce->name); needs_cloning = !file_exists(sb.buf); @@ -427,6 +484,7 @@ static int update_clone_task_finished(int result, static int update_clone(int argc, const char **argv, const char *prefix) { int max_jobs = -1; + int submodule_groups = 0; struct string_list_item *item; struct submodule_update_clone pp = SUBMODULE_UPDATE_CLONE_INIT; @@ -449,6 +507,8 @@ static int update_clone(int argc, const char **argv, const char *prefix) "specified number of revisions")), OPT_INTEGER('j', "jobs", &max_jobs, N_("parallel jobs")), + OPT_BOOL(0, "groups", &submodule_groups, + N_("operate only on configured groups")), OPT__QUIET(&pp.quiet, N_("do't print cloning progress")), OPT_END() }; @@ -467,6 +527,9 @@ static int update_clone(int argc, const char **argv, const char *prefix) return 1; } + if (submodule_groups) + load_submodule_groups(&pp.submodule_groups); + gitmodules_config(); /* Overlay the parsed .gitmodules file with .git/config */ git_config(git_submodule_config, NULL); @@ -490,6 +553,7 @@ static int update_clone(int argc, const char **argv, const char *prefix) for_each_string_list_item(item, &pp.projectlines) utf8_fprintf(stdout, "%s", item->string); + free(pp.submodule_groups); return 0; } -- 2.6.1.261.g0d9c4c1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html