http-push: stop setting up `the_repository` for each reference

When pushing references via HTTP we call `repo_init_revisions()` in a loop for each reference that we're about to push. As third argument we pass the result of `setup_git_directory()`, which causes us to reinitialize the repository every single time. This is an obvious waste of compute, as the repository that we're working in will never change across any of the initializations. The only reason that we do this is to retrieve the directory of the repository. Furthermore, this is about to create issues in a subsequent commit, where reinitializing the repository will cause a `BUG()`. Address this by storing the Git directory in a variable instead so that we don't have to call the function repeatedly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Nov 19, 2025 at 08:50 UTC c257bd59165e2f55dfa2c97b0ca1e39131513654
1 file changed +3 -2
http-push.c
+3 -2
@@ -1725,6 +1725,7 @@ int cmd_main(int argc, const char **argv)
1725 int i;
1726 int new_refs;
1727 struct ref *ref, *local_refs = NULL;
1728 + const char *gitdir;
1729
1730 CALLOC_ARRAY(repo, 1);
1731
@@ -1787,7 +1788,7 @@ int cmd_main(int argc, const char **argv)
1788 if (delete_branch && rs.nr != 1)
1789 die("You must specify only one branch name when deleting a remote branch");
1790
1790 - setup_git_directory();
1791 + gitdir = setup_git_directory();
1792
1793 memset(remote_dir_exists, -1, 256);
1794
@@ -1941,7 +1942,7 @@ int cmd_main(int argc, const char **argv)
1942 if (!push_all && !is_null_oid(&ref->old_oid))
1943 strvec_pushf(&commit_argv, "^%s",
1944 oid_to_hex(&ref->old_oid));
1944 - repo_init_revisions(the_repository, &revs, setup_git_directory());
1945 + repo_init_revisions(the_repository, &revs, gitdir);
1946 setup_revisions_from_strvec(&commit_argv, &revs, NULL);
1947 revs.edge_hint = 0; /* just in case */
1948