Merge branch 'jl/maint-fetch-recursive-fix' into maint
authorJunio C Hamano <gitster@pobox.com>
Mon, 1 Aug 2011 21:44:17 +0000 (14:44 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 1 Aug 2011 21:44:17 +0000 (14:44 -0700)
* jl/maint-fetch-recursive-fix:
fetch: Also fetch submodules in subdirectories in on-demand mode

1  2 
submodule.c
diff --combined submodule.c
index b6dec70bd1a6b35c8ecc6a1a9953d64bfe6c4510,e43f221af2d1f3a6c6611d8dc37e349e63bc4bf2..1ba9646d3484fe2a11c1faba339c4e333186085e
@@@ -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))