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

[PATCH 3/4] for-each-ref --format='%(symref) %(symref:short)'

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 13, 2010, 20:30 UTC
Message-ID
<1266093033-9526-4-git-send-email-gitster@pobox.com>
In-Reply-To
<1266093033-9526-1-git-send-email-gitster@pobox.com>

New %(symref) output atom expands to the name of the ref a symbolic ref points at, or an empty string if the ref being shown is not a symref.

This may help scripted Porcelain writers.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin-for-each-ref.c |   20 +++++++++++++++++++-
 1 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/builtin-for-each-ref.c b/builtin-for-each-ref.c
index d68977e..b9b03e1 100644
--- a/builtin-for-each-ref.c
+++ b/builtin-for-each-ref.c
@@ -33,6 +33,8 @@ struct ref_sort {
 struct refinfo {
 	char *refname;
 	unsigned char objectname[20];
+	int flag;
+	const char *symref;
 	struct atom_value *value;
 };
 
@@ -68,6 +70,7 @@ static struct {
 	{ "body" },
 	{ "contents" },
 	{ "upstream" },
+	{ "symref" },
 };
 
 /*
@@ -82,7 +85,7 @@ static struct {
  */
 static const char **used_atom;
 static cmp_type *used_atom_type;
-static int used_atom_cnt, sort_atom_limit, need_tagged;
+static int used_atom_cnt, sort_atom_limit, need_tagged, need_symref;
 
 /*
  * Used to parse format string and sort specifiers
@@ -135,6 +138,8 @@ static int parse_atom(const char *atom, const char *ep)
 	used_atom_type[at] = valid_atom[i].cmp_type;
 	if (*atom == '*')
 		need_tagged = 1;
+	if (!strcmp(used_atom[at], "symref"))
+		need_symref = 1;
 	return at;
 }
 
@@ -566,6 +571,16 @@ static void populate_value(struct refinfo *ref)
 
 	ref->value = xcalloc(sizeof(struct atom_value), used_atom_cnt);
 
+	if (need_symref && (ref->flag & REF_ISSYMREF) && !ref->symref) {
+		unsigned char unused1[20];
+		const char *symref;
+		symref = resolve_ref(ref->refname, unused1, 1, NULL);
+		if (symref)
+			ref->symref = xstrdup(symref);
+		else
+			ref->symref = "";
+	}
+
 	/* Fill in specials first */
 	for (i = 0; i < used_atom_cnt; i++) {
 		const char *name = used_atom[i];
@@ -581,6 +596,8 @@ static void populate_value(struct refinfo *ref)
 
 		if (!prefixcmp(name, "refname"))
 			refname = ref->refname;
+		else if (!prefixcmp(name, "symref"))
+			refname = ref->symref ? ref->symref : "";
 		else if (!prefixcmp(name, "upstream")) {
 			struct branch *branch;
 			/* only local branches may have an upstream */
@@ -726,6 +743,7 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1, int f
 	ref = xcalloc(1, sizeof(*ref));
 	ref->refname = xstrdup(refname);
 	hashcpy(ref->objectname, sha1);
+	ref->flag = flag;
 
 	cnt = cb->grab_cnt;
 	cb->grab_array = xrealloc(cb->grab_array,
-- 
1.7.0.169.g57c99
Previous: Junio C HamanoNext: Jeff King
Message 4 of 8 in “for-each-ref --format='%(symref) %(symref:short) %(flag)'”
  1. 0/4 for-each-ref --format='%(symref) %(symref:short) %(flag)'Junio C Hamano, Feb 13, 2010
  2. 1/4 builtin-for-each-ref.c: comment fixesJunio C Hamano, Feb 13, 2010
  3. 2/4 builtin-for-each-ref.c: check if we need to peel onion while parsing the formatJunio C Hamano, Feb 13, 2010
  4. 3/4 for-each-ref --format='%(symref) %(symref:short)'Junio C Hamano, Feb 13, 2010
  5. Jeff KingFeb 14, 2010
  6. Junio C HamanoFeb 14, 2010
  7. Jeff KingFeb 15, 2010
  8. 4/4 for-each-ref --format='%(flag)'Junio C Hamano, Feb 13, 2010

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.