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

[PATCH v2 12/16] refs: drop `git_default_branch_name()`

From
Patrick Steinhardt <ps@pks.im>
Date
May 17, 2024, 08:19 UTC
Message-ID
<e02e76701f94a062337a303e90bf276fc9a5a0b9.1715929858.git.ps@pks.im>
In-Reply-To
<cover.1715929858.git.ps@pks.im>

The `git_default_branch_name()` function is a thin wrapper around `repo_default_branch_name()` with two differences:

  - We implicitly rely on `the_repository`.
  - We cache the default branch name.

None of the callsites of `git_default_branch_name()` are hot code paths though, so the caching of the branch name is not really required.

Refactor the callsites to use `repo_default_branch_name()` instead and drop `git_default_branch_name()`, thus getting rid of one more case where we rely on `the_repository`.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/clone.c |  5 ++++-
 builtin/var.c   |  2 +-
 refs.c          | 10 ----------
 refs.h          |  4 +---
 remote.c        | 12 ++++++++----
 setup.c         |  5 ++++-
 6 files changed, 18 insertions(+), 20 deletions(-)
diff --git a/builtin/clone.c b/builtin/clone.c
index 554b29768c..bd3e8302ed 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -1468,6 +1468,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 	} else if (remote_head) {
 		our_head_points_at = NULL;
 	} else {
+		char *to_free = NULL;
 		const char *branch;
 
 		if (!mapped_refs) {
@@ -1480,7 +1481,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 				"refs/heads/", &branch)) {
 			unborn_head  = xstrdup(transport_ls_refs_options.unborn_head_target);
 		} else {
-			branch = git_default_branch_name(0);
+			branch = to_free = repo_default_branch_name(the_repository, 0);
 			unborn_head = xstrfmt("refs/heads/%s", branch);
 		}
 
@@ -1496,6 +1497,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 		 * a match.
 		 */
 		our_head_points_at = find_remote_branch(mapped_refs, branch);
+
+		free(to_free);
 	}
 
 	write_refspec_config(src_ref_prefix, our_head_points_at,
diff --git a/builtin/var.c b/builtin/var.c
index cf5567208a..5dc384810c 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -46,7 +46,7 @@ static char *pager(int ident_flag UNUSED)
 
 static char *default_branch(int ident_flag UNUSED)
 {
-	return xstrdup_or_null(git_default_branch_name(1));
+	return repo_default_branch_name(the_repository, 1);
 }
 
 static char *shell_path(int ident_flag UNUSED)
diff --git a/refs.c b/refs.c
index 5f1819b33e..83cd965a26 100644
--- a/refs.c
+++ b/refs.c
@@ -664,16 +664,6 @@ char *repo_default_branch_name(struct repository *r, int quiet)
 	return ret;
 }
 
-const char *git_default_branch_name(int quiet)
-{
-	static char *ret;
-
-	if (!ret)
-		ret = repo_default_branch_name(the_repository, quiet);
-
-	return ret;
-}
-
 /*
  * *string and *len will only be substituted, and *string returned (for
  * later free()ing) if the string passed in is a magic short-hand form
diff --git a/refs.h b/refs.h
index e043b6cfa3..e906dbb44a 100644
--- a/refs.h
+++ b/refs.h
@@ -169,10 +169,8 @@ int dwim_log(const char *str, int len, struct object_id *oid, char **ref);
 /*
  * Retrieves the default branch name for newly-initialized repositories.
  *
- * The return value of `repo_default_branch_name()` is an allocated string. The
- * return value of `git_default_branch_name()` is a singleton.
+ * The return value is an allocated string.
  */
-const char *git_default_branch_name(int quiet);
 char *repo_default_branch_name(struct repository *r, int quiet);
 
 /*
diff --git a/remote.c b/remote.c
index ec8c158e60..85c390b199 100644
--- a/remote.c
+++ b/remote.c
@@ -305,7 +305,7 @@ static void read_remotes_file(struct remote_state *remote_state,
 static void read_branches_file(struct remote_state *remote_state,
 			       struct remote *remote)
 {
-	char *frag;
+	char *frag, *to_free = NULL;
 	struct strbuf buf = STRBUF_INIT;
 	FILE *f = fopen_or_warn(git_path("branches/%s", remote->name), "r");
 
@@ -333,7 +333,7 @@ static void read_branches_file(struct remote_state *remote_state,
 	if (frag)
 		*(frag++) = '\0';
 	else
-		frag = (char *)git_default_branch_name(0);
+		frag = to_free = repo_default_branch_name(the_repository, 0);
 
 	add_url_alias(remote_state, remote, strbuf_detach(&buf, NULL));
 	refspec_appendf(&remote->fetch, "refs/heads/%s:refs/heads/%s",
@@ -345,6 +345,8 @@ static void read_branches_file(struct remote_state *remote_state,
 	 */
 	refspec_appendf(&remote->push, "HEAD:refs/heads/%s", frag);
 	remote->fetch_tags = 1; /* always auto-follow */
+
+	free(to_free);
 }
 
 static int handle_config(const char *key, const char *value,
@@ -2388,11 +2390,13 @@ struct ref *guess_remote_head(const struct ref *head,
 
 	/* If a remote branch exists with the default branch name, let's use it. */
 	if (!all) {
-		char *ref = xstrfmt("refs/heads/%s",
-				    git_default_branch_name(0));
+		char *default_branch = repo_default_branch_name(the_repository, 0);
+		char *ref = xstrfmt("refs/heads/%s", default_branch);
 
 		r = find_ref_by_name(refs, ref);
 		free(ref);
+		free(default_branch);
+
 		if (r && oideq(&r->old_oid, &head->old_oid))
 			return copy_ref(r);
 
diff --git a/setup.c b/setup.c
index fec6bfd5fa..481b57d523 100644
--- a/setup.c
+++ b/setup.c
@@ -2046,6 +2046,7 @@ void create_reference_database(unsigned int ref_storage_format,
 			       const char *initial_branch, int quiet)
 {
 	struct strbuf err = STRBUF_INIT;
+	char *to_free = NULL;
 	int reinit = is_reinit();
 
 	repo_set_ref_storage_format(the_repository, ref_storage_format);
@@ -2060,7 +2061,8 @@ void create_reference_database(unsigned int ref_storage_format,
 		char *ref;
 
 		if (!initial_branch)
-			initial_branch = git_default_branch_name(quiet);
+			initial_branch = to_free =
+				repo_default_branch_name(the_repository, quiet);
 
 		ref = xstrfmt("refs/heads/%s", initial_branch);
 		if (check_refname_format(ref, 0) < 0)
@@ -2077,6 +2079,7 @@ void create_reference_database(unsigned int ref_storage_format,
 			initial_branch);
 
 	strbuf_release(&err);
+	free(to_free);
 }
 
 static int create_default_files(const char *template_path,
-- 
2.45.1.190.g19fe900cfc.dirty
Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 13 of 17 in “refs: drop all references to `the_repository`”
  1. 00/16 refs: drop all references to `the_repository`Patrick Steinhardt, May 17, 2024
  2. 01/16 refs: adjust names for `init` and `init_db` callbacksPatrick Steinhardt, May 17, 2024
  3. 02/16 refs: rename `init_db` callback to avoid confusionPatrick Steinhardt, May 17, 2024
  4. 03/16 refs: implement releasing ref storagesPatrick Steinhardt, May 17, 2024
  5. 04/16 refs: track ref stores via strmapPatrick Steinhardt, May 17, 2024
  6. 05/16 refs: pass repo when retrieving submodule ref storePatrick Steinhardt, May 17, 2024
  7. 06/16 refs: refactor `resolve_gitlink_ref()` to accept a repositoryPatrick Steinhardt, May 17, 2024
  8. 07/16 refs: retrieve worktree ref stores via associated repositoryPatrick Steinhardt, May 17, 2024
  9. 08/16 refs: convert iteration over replace refs to accept ref storePatrick Steinhardt, May 17, 2024
  10. 09/16 refs: pass ref store when detecting dangling symrefsPatrick Steinhardt, May 17, 2024
  11. 10/16 refs: move object peeling into "object.c"Patrick Steinhardt, May 17, 2024
  12. 11/16 refs: pass repo when peeling objectsPatrick Steinhardt, May 17, 2024
  13. 12/16 refs: drop `git_default_branch_name()`Patrick Steinhardt, May 17, 2024
  14. 13/16 refs: remove `dwim_log()`Patrick Steinhardt, May 17, 2024
  15. 14/16 refs/files: use correct repositoryPatrick Steinhardt, May 17, 2024
  16. 15/16 refs/files: remove references to `the_hash_algo`Patrick Steinhardt, May 17, 2024
  17. 16/16 refs/packed: remove references to `the_hash_algo`Patrick Steinhardt, May 17, 2024

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.