Skip to content

Commit

Permalink
ref-filter: introduce match_atom_name()
Browse files Browse the repository at this point in the history
Introduce match_atom_name() which helps in checking if a particular
atom is the atom we're looking for and if it has a value attached to
it or not.

Use it instead of starts_with() for checking the value of %(color:...)
atom. Write a test for the same.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
Thanks-to: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Karthik Nayak authored and Junio C Hamano committed Sep 17, 2015
1 parent 63d89fb commit 40a7551
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
23 changes: 21 additions & 2 deletions ref-filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,22 @@ static void pop_stack_element(struct ref_formatting_stack **stack)
*stack = prev;
}

static int match_atom_name(const char *name, const char *atom_name, const char **val)
{
const char *body;

if (!skip_prefix(name, atom_name, &body))
return 0; /* doesn't even begin with "atom_name" */
if (!body[0]) {
*val = NULL; /* %(atom_name) and no customization */
return 1;
}
if (body[0] != ':')
return 0; /* "atom_namefoo" is not "atom_name" or "atom_name:..." */
*val = body + 1; /* "atom_name:val" */
return 1;
}

/*
* In a format string, find the next occurrence of %(atom).
*/
Expand Down Expand Up @@ -687,6 +703,7 @@ static void populate_value(struct ref_array_item *ref)
int deref = 0;
const char *refname;
const char *formatp;
const char *valp;
struct branch *branch = NULL;

v->handler = append_atom;
Expand Down Expand Up @@ -721,10 +738,12 @@ static void populate_value(struct ref_array_item *ref)
refname = branch_get_push(branch, NULL);
if (!refname)
continue;
} else if (starts_with(name, "color:")) {
} else if (match_atom_name(name, "color", &valp)) {
char color[COLOR_MAXLEN] = "";

if (color_parse(name + 6, color) < 0)
if (!valp)
die(_("expected format: %%(color:<color>)"));
if (color_parse(valp, color) < 0)
die(_("unable to parse format"));
v->s = xstrdup(color);
continue;
Expand Down
4 changes: 4 additions & 0 deletions t/t6302-for-each-ref-filter.sh
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,8 @@ test_expect_success 'filtering with --contains' '
test_cmp expect actual
'

test_expect_success '%(color) must fail' '
test_must_fail git for-each-ref --format="%(color)%(refname)"
'

test_done

0 comments on commit 40a7551

Please sign in to comment.