git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 04/16] submodule: refactor `submodule_to_gitdir()` to accept a repo

From
Patrick Steinhardt <ps@pks.im>
Date
Feb 6, 2025, 07:58 UTC
Message-ID
<20250206-b4-pks-path-drop-the-repository-v1-4-4e77f0313206@pks.im>
In-Reply-To
<20250206-b4-pks-path-drop-the-repository-v1-0-4e77f0313206@pks.im>

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>
---
 builtin/submodule--helper.c |  2 +-
 path.c                      |  2 +-
 refs.c                      |  2 +-
 submodule.c                 | 11 ++++++-----
 submodule.h                 |  3 ++-
 5 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index f9b970f8a6..3a64f7e605 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -1301,7 +1301,7 @@ static void sync_submodule(const char *path, const char *prefix,
 	remote_key = xstrfmt("remote.%s.url", default_remote);
 	free(default_remote);
 
-	submodule_to_gitdir(&sb, path);
+	submodule_to_gitdir(the_repository, &sb, path);
 	strbuf_addstr(&sb, "/config");
 
 	if (git_config_set_in_file_gently(sb.buf, remote_key, NULL, sub_origin_url))
diff --git a/path.c b/path.c
index be75808acc..d918d0409e 100644
--- a/path.c
+++ b/path.c
@@ -567,7 +567,7 @@ static int do_submodule_path(struct strbuf *buf, const char *path,
 	struct strbuf git_submodule_dir = STRBUF_INIT;
 	int ret;
 
-	ret = submodule_to_gitdir(&git_submodule_dir, path);
+	ret = submodule_to_gitdir(the_repository, &git_submodule_dir, path);
 	if (ret)
 		goto cleanup;
 
diff --git a/refs.c b/refs.c
index daf6a84205..e1293e53aa 100644
--- a/refs.c
+++ b/refs.c
@@ -2146,7 +2146,7 @@ struct ref_store *repo_get_submodule_ref_store(struct repository *repo,
 	if (!is_nonbare_repository_dir(&submodule_sb))
 		goto done;
 
-	if (submodule_to_gitdir(&submodule_sb, submodule))
+	if (submodule_to_gitdir(repo, &submodule_sb, submodule))
 		goto done;
 
 	subrepo = xmalloc(sizeof(*subrepo));
diff --git a/submodule.c b/submodule.c
index 211ead54a0..0530e8cf24 100644
--- a/submodule.c
+++ b/submodule.c
@@ -536,7 +536,8 @@ static struct repository *open_submodule(const char *path)
 	struct strbuf sb = STRBUF_INIT;
 	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);
 		free(out);
 		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
  * 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 char *git_dir;
@@ -2592,14 +2594,13 @@ int submodule_to_gitdir(struct strbuf *buf, const char *submodule)
 		strbuf_addstr(buf, git_dir);
 	}
 	if (!is_git_directory(buf->buf)) {
-		sub = submodule_from_path(the_repository, null_oid(),
-					  submodule);
+		sub = submodule_from_path(repo, null_oid(), submodule);
 		if (!sub) {
 			ret = -1;
 			goto cleanup;
 		}
 		strbuf_reset(buf);
-		submodule_name_to_gitdir(buf, the_repository, sub->name);
+		submodule_name_to_gitdir(buf, repo, sub->name);
 	}
 
 cleanup:
diff --git a/submodule.h b/submodule.h
index 4deb1b5f84..db980c1d08 100644
--- a/submodule.h
+++ b/submodule.h
@@ -136,7 +136,8 @@ int push_unpushed_submodules(struct repository *r,
  * path of that submodule in 'buf'. Return -1 on error or when the
  * 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
-- 
2.48.1.538.gc4cfc42d60.dirty
Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 11 of 36 in “path: remove dependency on `the_repository`”
  1. 00/16 path: remove dependency on `the_repository`Patrick Steinhardt, Feb 6, 2025
  2. 01/16 path: refactor `repo_common_path()` family of functionsPatrick Steinhardt, Feb 6, 2025
  3. Karthik NayakFeb 6, 2025
  4. Patrick SteinhardtFeb 7, 2025
  5. shejialuoFeb 6, 2025
  6. Patrick SteinhardtFeb 7, 2025
  7. 02/16 path: refactor `repo_git_path()` family of functionsPatrick Steinhardt, Feb 6, 2025
  8. Karthik NayakFeb 6, 2025
  9. Patrick SteinhardtFeb 7, 2025
  10. 03/16 path: refactor `repo_worktree_path()` family of functionsPatrick Steinhardt, Feb 6, 2025
  11. 04/16 submodule: refactor `submodule_to_gitdir()` to accept a repoPatrick Steinhardt, Feb 6, 2025
  12. 05/16 path: refactor `repo_submodule_path()` family of functionsPatrick Steinhardt, Feb 6, 2025
  13. Karthik NayakFeb 6, 2025
  14. Patrick SteinhardtFeb 7, 2025
  15. Karthik NayakFeb 7, 2025
  16. shejialuoFeb 6, 2025
  17. 06/16 path: drop unused `strbuf_git_path()` functionPatrick Steinhardt, Feb 6, 2025
  18. 07/16 path: drop `git_pathdup()` in favor of `repo_git_path()`Patrick Steinhardt, Feb 6, 2025
  19. 08/16 path: drop `git_path_buf()` in favor of `repo_git_path_replace()`Patrick Steinhardt, Feb 6, 2025
  20. 09/16 worktree: return allocated string from `get_worktree_git_dir()`Patrick Steinhardt, Feb 6, 2025
  21. Karthik NayakFeb 7, 2025
  22. Patrick SteinhardtFeb 7, 2025
  23. 10/16 path: drop `git_common_path()` in favor of `repo_common_path()`Patrick Steinhardt, Feb 6, 2025
  24. shejialuoFeb 6, 2025
  25. Patrick SteinhardtFeb 7, 2025
  26. 11/16 rerere: let `rerere_path()` write paths into a caller-provided bufferPatrick Steinhardt, Feb 6, 2025
  27. 12/16 path: drop `git_path()` in favor of `repo_git_path()`Patrick Steinhardt, Feb 6, 2025
  28. shejialuoFeb 6, 2025
  29. Patrick SteinhardtFeb 7, 2025
  30. 13/16 repo-settings: introduce function to clear structPatrick Steinhardt, Feb 6, 2025
  31. 14/16 environment: move access to "core.hooksPath" into repo settingsPatrick Steinhardt, Feb 6, 2025
  32. 15/16 environment: move access to "core.sharedRepository" into repo settingsPatrick Steinhardt, Feb 6, 2025
  33. 16/16 path: adjust last remaining users of `the_repository`Patrick Steinhardt, Feb 6, 2025
  34. shejialuoFeb 6, 2025
  35. Patrick SteinhardtFeb 7, 2025
  36. Karthik NayakFeb 7, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.