From: Junio C Hamano Date: Wed, 13 Jul 2011 21:31:37 +0000 (-0700) Subject: Merge branch 'jl/maint-fetch-recursive-fix' X-Git-Tag: v1.7.7-rc0~100 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/182f22893078a65110aaaf98100e85618fca83b2?ds=inline;hp=-c Merge branch 'jl/maint-fetch-recursive-fix' * jl/maint-fetch-recursive-fix: fetch: Also fetch submodules in subdirectories in on-demand mode --- 182f22893078a65110aaaf98100e85618fca83b2 diff --combined submodule.c index b6dec70bd1,e43f221af2..1ba9646d34 --- a/submodule.c +++ b/submodule.c @@@ -14,15 -14,6 +14,15 @@@ static struct string_list config_fetch_ static struct string_list config_ignore_for_name; static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND; static struct string_list changed_submodule_paths; +/* + * The following flag is set if the .gitmodules file is unmerged. We then + * disable recursion for all submodules where .git/config doesn't have a + * matching config entry because we can't guess what might be configured in + * .gitmodules unless the user resolves the conflict. When a command line + * option is given (which always overrides configuration) this flag will be + * ignored. + */ +static int gitmodules_is_unmerged; static int add_submodule_odb(const char *path) { @@@ -72,8 -63,6 +72,8 @@@ void set_diffopt_flags_from_submodule_c ignore_option = unsorted_string_list_lookup(&config_ignore_for_name, path_option->util); if (ignore_option) handle_ignore_submodules_arg(diffopt, ignore_option->util); + else if (gitmodules_is_unmerged) + DIFF_OPT_SET(diffopt, IGNORE_SUBMODULES); } } @@@ -93,24 -82,9 +93,24 @@@ void gitmodules_config(void const char *work_tree = get_git_work_tree(); if (work_tree) { struct strbuf gitmodules_path = STRBUF_INIT; + int pos; strbuf_addstr(&gitmodules_path, work_tree); strbuf_addstr(&gitmodules_path, "/.gitmodules"); - git_config_from_file(submodule_config, gitmodules_path.buf, NULL); + if (read_cache() < 0) + die("index file corrupt"); + pos = cache_name_pos(".gitmodules", 11); + if (pos < 0) { /* .gitmodules not found or isn't merged */ + pos = -1 - pos; + if (active_nr > pos) { /* there is a .gitmodules */ + const struct cache_entry *ce = active_cache[pos]; + if (ce_namelen(ce) == 11 && + !memcmp(ce->name, ".gitmodules", 11)) + gitmodules_is_unmerged = 1; + } + } + + if (!gitmodules_is_unmerged) + git_config_from_file(submodule_config, gitmodules_path.buf, NULL); strbuf_release(&gitmodules_path); } } @@@ -388,6 -362,7 +388,7 @@@ void check_for_new_submodule_commits(un while (parent) { struct diff_options diff_opts; diff_setup(&diff_opts); + DIFF_OPT_SET(&diff_opts, RECURSIVE); diff_opts.output_format |= DIFF_FORMAT_CALLBACK; diff_opts.format_callback = submodule_collect_changed_cb; if (diff_setup_done(&diff_opts) < 0) @@@ -460,8 -435,7 +461,8 @@@ int fetch_populated_submodules(int num_ default_argv = "on-demand"; } } else { - if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF) + if ((config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF) || + gitmodules_is_unmerged) continue; if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND) { if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name))