diff options
author | Junio C Hamano <gitster@pobox.com> | 2010-02-13 11:57:08 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-02-13 11:57:08 -0800 |
commit | 5cdd628c84d808feb6ec407b2ecd74dfea63f865 (patch) | |
tree | 1b0d628ab64a6d72aece27807cb8b8b0b2a4a6a3 | |
parent | 20322e0b552b9860377c162675ce5c49bfd32e83 (diff) | |
download | git-5cdd628c84d808feb6ec407b2ecd74dfea63f865.tar.gz git-5cdd628c84d808feb6ec407b2ecd74dfea63f865.tar.xz |
for-each-ref --format='%(symref) %(symref:short)'
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>
-rw-r--r-- | 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 d68977ee6..b9b03e14d 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, |