submodule: refactor `submodule_to_gitdir()` to accept a repo

The `submodule_to_gitdir()` function implicitly uses `the_repository` to
resolve submodule paths. Refactor the function to instead accept a repo
as parameter to remove the dependency on global state.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Patrick Steinhardt 2025-02-07 12:03:29 +01:00 committed by Junio C Hamano
parent 93a8cfaf3c
commit f9467895d8
5 changed files with 11 additions and 9 deletions

View File

@ -1301,7 +1301,7 @@ static void sync_submodule(const char *path, const char *prefix,
remote_key = xstrfmt("remote.%s.url", default_remote); remote_key = xstrfmt("remote.%s.url", default_remote);
free(default_remote); free(default_remote);


submodule_to_gitdir(&sb, path); submodule_to_gitdir(the_repository, &sb, path);
strbuf_addstr(&sb, "/config"); strbuf_addstr(&sb, "/config");


if (git_config_set_in_file_gently(sb.buf, remote_key, NULL, sub_origin_url)) if (git_config_set_in_file_gently(sb.buf, remote_key, NULL, sub_origin_url))

2
path.c
View File

@ -567,7 +567,7 @@ static int do_submodule_path(struct strbuf *buf, const char *path,
struct strbuf git_submodule_dir = STRBUF_INIT; struct strbuf git_submodule_dir = STRBUF_INIT;
int ret; int ret;


ret = submodule_to_gitdir(&git_submodule_dir, path); ret = submodule_to_gitdir(the_repository, &git_submodule_dir, path);
if (ret) if (ret)
goto cleanup; goto cleanup;



2
refs.c
View File

@ -2146,7 +2146,7 @@ struct ref_store *repo_get_submodule_ref_store(struct repository *repo,
if (!is_nonbare_repository_dir(&submodule_sb)) if (!is_nonbare_repository_dir(&submodule_sb))
goto done; goto done;


if (submodule_to_gitdir(&submodule_sb, submodule)) if (submodule_to_gitdir(repo, &submodule_sb, submodule))
goto done; goto done;


subrepo = xmalloc(sizeof(*subrepo)); subrepo = xmalloc(sizeof(*subrepo));

View File

@ -536,7 +536,8 @@ static struct repository *open_submodule(const char *path)
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
struct repository *out = xmalloc(sizeof(*out)); struct repository *out = xmalloc(sizeof(*out));


if (submodule_to_gitdir(&sb, path) || repo_init(out, sb.buf, NULL)) { if (submodule_to_gitdir(the_repository, &sb, path) ||
repo_init(out, sb.buf, NULL)) {
strbuf_release(&sb); strbuf_release(&sb);
free(out); free(out);
return NULL; return NULL;
@ -2572,7 +2573,8 @@ int get_superproject_working_tree(struct strbuf *buf)
* Put the gitdir for a submodule (given relative to the main * Put the gitdir for a submodule (given relative to the main
* repository worktree) into `buf`, or return -1 on error. * repository worktree) into `buf`, or return -1 on error.
*/ */
int submodule_to_gitdir(struct strbuf *buf, const char *submodule) int submodule_to_gitdir(struct repository *repo,
struct strbuf *buf, const char *submodule)
{ {
const struct submodule *sub; const struct submodule *sub;
const char *git_dir; const char *git_dir;
@ -2592,14 +2594,13 @@ int submodule_to_gitdir(struct strbuf *buf, const char *submodule)
strbuf_addstr(buf, git_dir); strbuf_addstr(buf, git_dir);
} }
if (!is_git_directory(buf->buf)) { if (!is_git_directory(buf->buf)) {
sub = submodule_from_path(the_repository, null_oid(), sub = submodule_from_path(repo, null_oid(), submodule);
submodule);
if (!sub) { if (!sub) {
ret = -1; ret = -1;
goto cleanup; goto cleanup;
} }
strbuf_reset(buf); strbuf_reset(buf);
submodule_name_to_gitdir(buf, the_repository, sub->name); submodule_name_to_gitdir(buf, repo, sub->name);
} }


cleanup: cleanup:

View File

@ -136,7 +136,8 @@ int push_unpushed_submodules(struct repository *r,
* path of that submodule in 'buf'. Return -1 on error or when the * path of that submodule in 'buf'. Return -1 on error or when the
* submodule is not initialized. * submodule is not initialized.
*/ */
int submodule_to_gitdir(struct strbuf *buf, const char *submodule); int submodule_to_gitdir(struct repository *repo,
struct strbuf *buf, const char *submodule);


/* /*
* Given a submodule name, create a path to where the submodule's gitdir lives * Given a submodule name, create a path to where the submodule's gitdir lives