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

[PATCH 4/5] remote: read symbolic refs via `refs_read_symbolic_ref()`

From
Patrick Steinhardt <ps@pks.im>
Date
Feb 23, 2022, 12:35 UTC
Message-ID
<1d24101fe4fb296257110eb82da67c95b5e03189.1645619224.git.ps@pks.im>
In-Reply-To
<cover.1645619224.git.ps@pks.im>

We have two cases in the remote code where we check whether a reference is symbolic or not, but don't mind in case it doesn't exist or in case it exists but is a non-symbolic reference. Convert these two callsites to use the new `refs_read_symbolic_ref()` function, whose intent is to implement exactly that usecase.

No change in behaviour is expected from this change.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/remote.c |  8 +++++---
 remote.c         | 14 +++++++-------
 2 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/builtin/remote.c b/builtin/remote.c
index 6f27ddc47b..0142ed09b5 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -766,13 +766,15 @@ static int mv(int argc, const char **argv)
 	for_each_ref(read_remote_branches, &rename);
 	for (i = 0; i < remote_branches.nr; i++) {
 		struct string_list_item *item = remote_branches.items + i;
-		int flag = 0;
+		struct strbuf referent = STRBUF_INIT;
 
-		read_ref_full(item->string, RESOLVE_REF_READING, NULL, &flag);
-		if (!(flag & REF_ISSYMREF))
+		if (refs_read_symbolic_ref(get_main_ref_store(the_repository), item->string,
+					   &referent))
 			continue;
 		if (delete_ref(NULL, item->string, NULL, REF_NO_DEREF))
 			die(_("deleting '%s' failed"), item->string);
+
+		strbuf_release(&referent);
 	}
 	for (i = 0; i < remote_branches.nr; i++) {
 		struct string_list_item *item = remote_branches.items + i;
diff --git a/remote.c b/remote.c
index c97c626eaa..42a4e7106e 100644
--- a/remote.c
+++ b/remote.c
@@ -1945,13 +1945,9 @@ const char *branch_get_push(struct branch *branch, struct strbuf *err)
 	return branch->push_tracking_ref;
 }
 
-static int ignore_symref_update(const char *refname)
+static int ignore_symref_update(const char *refname, struct strbuf *scratch)
 {
-	int flag;
-
-	if (!resolve_ref_unsafe(refname, 0, NULL, &flag))
-		return 0; /* non-existing refs are OK */
-	return (flag & REF_ISSYMREF);
+	return !refs_read_symbolic_ref(get_main_ref_store(the_repository), refname, scratch);
 }
 
 /*
@@ -1964,6 +1960,7 @@ static int ignore_symref_update(const char *refname)
 static struct ref *get_expanded_map(const struct ref *remote_refs,
 				    const struct refspec_item *refspec)
 {
+	struct strbuf scratch = STRBUF_INIT;
 	const struct ref *ref;
 	struct ref *ret = NULL;
 	struct ref **tail = &ret;
@@ -1971,11 +1968,13 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
 	for (ref = remote_refs; ref; ref = ref->next) {
 		char *expn_name = NULL;
 
+		strbuf_reset(&scratch);
+
 		if (strchr(ref->name, '^'))
 			continue; /* a dereference item */
 		if (match_name_with_pattern(refspec->src, ref->name,
 					    refspec->dst, &expn_name) &&
-		    !ignore_symref_update(expn_name)) {
+		    !ignore_symref_update(expn_name, &scratch)) {
 			struct ref *cpy = copy_ref(ref);
 
 			cpy->peer_ref = alloc_ref(expn_name);
@@ -1987,6 +1986,7 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
 		free(expn_name);
 	}
 
+	strbuf_release(&scratch);
 	return ret;
 }
 
-- 
2.35.1
Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 11 of 20 in “fetch: more optimizations for mirror fetches”
  1. 0/5 fetch: more optimizations for mirror fetchesPatrick Steinhardt, Feb 23, 2022
  2. 2/5 fetch: avoid lookup of commits when not appending to FETCH_HEADPatrick Steinhardt, Feb 23, 2022
  3. Derrick StoleeFeb 23, 2022
  4. Patrick SteinhardtMar 1, 2022
  5. 1/5 upload-pack: look up "want" lines via commit-graphPatrick Steinhardt, Feb 23, 2022
  6. Derrick StoleeFeb 23, 2022
  7. Patrick SteinhardtMar 1, 2022
  8. Patrick SteinhardtMar 1, 2022
  9. Derrick StoleeMar 2, 2022
  10. 3/5 refs: add ability for backends to special-case reading of symbolic refsPatrick Steinhardt, Feb 23, 2022
  11. 4/5 remote: read symbolic refs via `refs_read_symbolic_ref()`Patrick Steinhardt, Feb 23, 2022
  12. 5/5 refs/files-backend: optimize reading of symbolic refsPatrick Steinhardt, Feb 23, 2022
  13. 0/5 fetch: more optimizations for mirror fetchesPatrick Steinhardt, Mar 1, 2022
  14. 1/5 upload-pack: look up "want" lines via commit-graphPatrick Steinhardt, Mar 1, 2022
  15. 2/5 fetch: avoid lookup of commits when not appending to FETCH_HEADPatrick Steinhardt, Mar 1, 2022
  16. 3/5 refs: add ability for backends to special-case reading of symbolic refsPatrick Steinhardt, Mar 1, 2022
  17. 4/5 remote: read symbolic refs via `refs_read_symbolic_ref()`Patrick Steinhardt, Mar 1, 2022
  18. 5/5 refs/files-backend: optimize reading of symbolic refsPatrick Steinhardt, Mar 1, 2022
  19. Junio C HamanoMar 1, 2022
  20. Derrick StoleeMar 2, 2022

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.