I have elaborated the commit message more, to explain why a warning is emitted for an empty value in 'submodule.active'. The warning has been worded more accurately than before. An unnecessary extra check for 'submodule.active' has been avoided. I have included a range diff, in case that is useful. My fork containing these changes can be found at: https://github.com/tfidfwastaken/git/commits/submodule-add-in-c Emily and Jonathan: To be on the safe side, I have CC'd you so you know where I keep my changes, and we can avoid potential conflicts, as I believe you are working on this area as well. Just so you know, every week, I update the link to all my ongoing work at: https://atharvaraykar.me/gitnotes/#my-public-gitgit-branches Atharva Raykar (2): submodule--helper: introduce add-clone subcommand submodule--helper: introduce add-config subcommand builtin/submodule--helper.c | 315 ++++++++++++++++++++++++++++++++++++ git-submodule.sh | 66 +------- 2 files changed, 317 insertions(+), 64 deletions(-) Range-diff against v1: 1: 398bfa713d = 1: 4374ebb6b1 submodule--helper: introduce add-clone subcommand 2: f9954cfcf7 ! 2: 406022d0f7 submodule--helper: introduce add-config subcommand @@ Commit message This is meant to be a faithful conversion from shell to C, with only one minor change: A warning is emitted if no value is specified in - 'submodule.active', ie, the config looks like: "[submodule] active\n". + 'submodule.active', ie, the config looks like: "[submodule] active\n", + because it is an invalid configuration. It would be helpful to let the + user know that the pathspec is unset, and the value of + 'submodule.<name>.active' might be set to 'true' so that they can + rectify their configuration and prevent future surprises (especially + given that the latter variable has a higher priority than the former). The structure of the conditional to check if we need to set the 'active' toggle looks different from the shell version -- but behaves the same. @@ builtin/submodule--helper.c: static int add_clone(int argc, const char **argv, c + char *key, *submod_pathspec = NULL; + struct child_process add_submod = CHILD_PROCESS_INIT; + struct child_process add_gitmodules = CHILD_PROCESS_INIT; -+ int pathspec_key_exists; ++ int pathspec_key_exists, activate = 0; + + key = xstrfmt("submodule.%s.url", add_data->sm_name); + git_config_set_gently(key, add_data->realrepo); @@ builtin/submodule--helper.c: static int add_clone(int argc, const char **argv, c + */ + pathspec_key_exists = !git_config_get_string("submodule.active", + &submod_pathspec); -+ if (pathspec_key_exists && !submod_pathspec) -+ warning(_("The submodule.active configuration exists, but " -+ "no pathspec was specified. Setting the value of " -+ "submodule.%s.active to 'true'."), add_data->sm_name); ++ if (pathspec_key_exists && !submod_pathspec) { ++ warning(_("The submodule.active configuration exists, but the " ++ "pathspec was unset. If the submodule is not already " ++ "active, the value of submodule.%s.active will be " ++ "be set to 'true'."), add_data->sm_name); ++ activate = 1; ++ } + + /* -+ * If submodule.active does not exist, we will activate this -+ * module unconditionally. ++ * If submodule.active does not exist, or if the pathspec was unset, ++ * we will activate this module unconditionally. + * + * Otherwise, we ask is_submodule_active(), which iterates + * through all the values of 'submodule.active' to determine + * if this module is already active. + */ -+ if (!pathspec_key_exists || ++ if (!pathspec_key_exists || activate || + !is_submodule_active(the_repository, add_data->sm_path)) { + key = xstrfmt("submodule.%s.active", add_data->sm_name); + git_config_set_gently(key, "true"); -- 2.31.1