Merge branch 'kn/ref-filter-branch-list'
"git for-each-ref --format=..." with %(HEAD) in the format used to resolve the HEAD symref as many times as it had processed refs, which was wasteful, and "git branch" shared the same problem. * kn/ref-filter-branch-list: ref-filter: resolve HEAD when parsing %(HEAD) atom
This commit is contained in:
16
ref-filter.c
16
ref-filter.c
@ -93,6 +93,7 @@ static struct used_atom {
|
|||||||
unsigned int length;
|
unsigned int length;
|
||||||
} objectname;
|
} objectname;
|
||||||
struct refname_atom refname;
|
struct refname_atom refname;
|
||||||
|
char *head;
|
||||||
} u;
|
} u;
|
||||||
} *used_atom;
|
} *used_atom;
|
||||||
static int used_atom_cnt, need_tagged, need_symref;
|
static int used_atom_cnt, need_tagged, need_symref;
|
||||||
@ -287,6 +288,12 @@ static void if_atom_parser(struct used_atom *atom, const char *arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void head_atom_parser(struct used_atom *atom, const char *arg)
|
||||||
|
{
|
||||||
|
struct object_id unused;
|
||||||
|
|
||||||
|
atom->u.head = resolve_refdup("HEAD", RESOLVE_REF_READING, unused.hash, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
@ -325,7 +332,7 @@ static struct {
|
|||||||
{ "push", FIELD_STR, remote_ref_atom_parser },
|
{ "push", FIELD_STR, remote_ref_atom_parser },
|
||||||
{ "symref", FIELD_STR, refname_atom_parser },
|
{ "symref", FIELD_STR, refname_atom_parser },
|
||||||
{ "flag" },
|
{ "flag" },
|
||||||
{ "HEAD" },
|
{ "HEAD", FIELD_STR, head_atom_parser },
|
||||||
{ "color", FIELD_STR, color_atom_parser },
|
{ "color", FIELD_STR, color_atom_parser },
|
||||||
{ "align", FIELD_STR, align_atom_parser },
|
{ "align", FIELD_STR, align_atom_parser },
|
||||||
{ "end" },
|
{ "end" },
|
||||||
@ -1369,12 +1376,7 @@ static void populate_value(struct ref_array_item *ref)
|
|||||||
} else if (!deref && grab_objectname(name, ref->objectname.hash, v, atom)) {
|
} else if (!deref && grab_objectname(name, ref->objectname.hash, v, atom)) {
|
||||||
continue;
|
continue;
|
||||||
} else if (!strcmp(name, "HEAD")) {
|
} else if (!strcmp(name, "HEAD")) {
|
||||||
const char *head;
|
if (atom->u.head && !strcmp(ref->refname, atom->u.head))
|
||||||
struct object_id oid;
|
|
||||||
|
|
||||||
head = resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
|
|
||||||
oid.hash, NULL);
|
|
||||||
if (head && !strcmp(ref->refname, head))
|
|
||||||
v->s = "*";
|
v->s = "*";
|
||||||
else
|
else
|
||||||
v->s = " ";
|
v->s = " ";
|
||||||
|
Reference in New Issue
Block a user