Currently the submodule.<name>.url config option is used to determine if a given submodule exists and is interesting to the user. This however doesn't work very well because the URL is a config option for the scope of a repository, whereas the existence of a submodule is an option scoped to the working tree. In a future with worktree support for submodules, there will be multiple working trees, each of which may only need a subset of the submodules checked out. The URL (which is where the submodule repository can be obtained) should not differ between different working trees. It may also be convenient for users to more easily specify groups of submodules they are interested in as apposed to running "git submodule init <path>" on each submodule they want checked out in their working tree. To this end, the config option submodule.active is introduced which holds a pathspec that specifies which submodules should exist in the working tree. Signed-off-by: Brandon Williams <bmwill@xxxxxxxxxx> --- submodule.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/submodule.c b/submodule.c index 4c4f033e8..991066ddf 100644 --- a/submodule.c +++ b/submodule.c @@ -217,11 +217,16 @@ void gitmodules_config_sha1(const unsigned char *commit_sha1) int is_submodule_initialized(const char *path) { int ret = 0; - const struct submodule *module = NULL; + const struct string_list *sl; + const struct submodule *module = submodule_from_path(null_sha1, path); - module = submodule_from_path(null_sha1, path); + /* early return if there isn't a path->module mapping */ + if (!module) + return 0; + + sl = git_config_get_value_multi("submodule.active"); - if (module) { + if (!sl) { char *key = xstrfmt("submodule.%s.url", module->name); char *value = NULL; @@ -229,6 +234,20 @@ int is_submodule_initialized(const char *path) free(value); free(key); + } else { + struct pathspec ps; + struct argv_array args = ARGV_ARRAY_INIT; + const struct string_list_item *item; + + for_each_string_list_item(item, sl) { + argv_array_push(&args, item->string); + } + + parse_pathspec(&ps, 0, 0, 0, args.argv); + ret = match_pathspec(&ps, path, strlen(path), 0, NULL, 1); + + argv_array_clear(&args); + clear_pathspec(&ps); } return ret; -- 2.11.0.483.g087da7b7c-goog