Shourya Shukla <shouryashukla.oo@xxxxxxxxx> writes: > +static void config_added_submodule(struct add_data *info) > +{ > + char *key, *var = NULL; > + struct child_process cp = CHILD_PROCESS_INIT; > + > + key = xstrfmt("submodule.%s.url", info->sm_name); > + git_config_set_gently(key, info->realrepo); > + free(key); > + > + cp.git_cmd = 1; > + strvec_pushl(&cp.args, "add", "--no-warn-embedded-repo", NULL); > + if (info->force) > + strvec_push(&cp.args, "--force"); > + strvec_pushl(&cp.args, "--", info->sm_path, ".gitmodules", NULL); Hmph, you lost me. I think this ought to correspond to this part of the original: git add --no-warn-embedded-repo $force "$sm_path" || die "$(eval_gettext "Failed to add submodule '\$sm_path'")" I can see that adding "--" before $sm_path may be an improvement, but why do we also add .gitmodules here, and ... > + key = xstrfmt("submodule.%s.path", info->sm_name); > + git_config_set_in_file_gently(".gitmodules", key, info->sm_path); > + free(key); > + key = xstrfmt("submodule.%s.url", info->sm_name); > + git_config_set_in_file_gently(".gitmodules", key, info->repo); > + free(key); > + key = xstrfmt("submodule.%s.branch", info->sm_name); > + if (info->branch) > + git_config_set_in_file_gently(".gitmodules", key, info->branch); > + free(key); ... perform quite a lot of configuration writing, before actually spawning the "git add" and make sure it succeeds? The original won't futz with any of these .gitmodules entries if "git add" of the $sm_path fails and that is a good discipline to follow. > + if (run_command(&cp)) > + die(_("failed to add submodule '%s'"), info->sm_path); > + > + /* > + * NEEDSWORK: In a multi-working-tree world, this needs to be > + * set in the per-worktree config. > + */ > + if (!git_config_get_string("submodule.active", &var) && var) { What if this were a valueless true ("[submodule] active\n" without "= true")? Wouldn't get_string() fail? > + /* > + * If the submodule being adding isn't already covered by the > + * current configured pathspec, set the submodule's active flag > + */ > + if (!is_submodule_active(the_repository, info->sm_path)) { > + key = xstrfmt("submodule.%s.active", info->sm_name); > + git_config_set_gently(key, "true"); > + free(key); > + } > + } else { > + key = xstrfmt("submodule.%s.active", info->sm_name); > + git_config_set_gently(key, "true"); > + free(key); > + } > +} > + > + ... > + info.prefix = prefix; > + info.sm_name = name; > + info.sm_path = path; > + info.repo = repo; > + info.realrepo = realrepo; > + info.reference_path = reference_path; > + info.branch = branch; > + info.depth = depth; > + info.progress = !!progress; > + info.dissociate = !!dissociate; > + info.force = !!force; > + info.quiet = !!quiet; > + > + if (add_submodule(&info)) > + return 1; > + config_added_submodule(&info); Whew. This was way too big to be reviewed in a single sitting. I do not know offhand if there is a better way to structure the changes into a more digestible pieces to help prevent reviewers from overlooking potential mistakes, though. Thanks.