Re: [PATCH v2 2/3] submodule: port submodule subcommand 'add' from shell to C
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Oct 9, 2020, 05:09 UTC
- Message-ID
- <xmqqd01sugrg.fsf@gitster.c.googlers.com>
- In-Reply-To
- <20201007074538.25891-3-shouryashukla.oo@gmail.com>
Shourya Shukla <shouryashukla.oo@gmail.com> writes:
Show 14 quoted lines
> +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 ...
Show 10 quoted lines
> + 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.
Show 8 quoted lines
> + 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?
Show 33 quoted lines
> + /*
> + * 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.