ref-filter: add support for %(upstream:track,nobracket)

Add support for %(upstream:track,nobracket) which will print the
tracking information without the brackets (i.e. "ahead N, behind M").
This is needed when we port branch.c to use ref-filter's printing APIs.

Add test and documentation for the same.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Karthik Nayak 2017-01-10 14:19:41 +05:30 committed by Junio C Hamano
parent ffd921d311
commit 7743fcca5b
3 changed files with 53 additions and 26 deletions

View File

@ -120,9 +120,13 @@ upstream::
`refname` above. Additionally respects `:track` to show `refname` above. Additionally respects `:track` to show
"[ahead N, behind M]" and `:trackshort` to show the terse "[ahead N, behind M]" and `:trackshort` to show the terse
version: ">" (ahead), "<" (behind), "<>" (ahead and behind), version: ">" (ahead), "<" (behind), "<>" (ahead and behind),
or "=" (in sync). Has no effect if the ref does not have or "=" (in sync). `:track` also prints "[gone]" whenever
tracking information associated with it. `:track` also prints unknown upstream ref is encountered. Append `:track,nobracket`
"[gone]" whenever unknown upstream ref is encountered. to show tracking information without brackets (i.e "ahead N,
behind M"). Has no effect if the ref does not have tracking
information associated with it. All the options apart from
`nobracket` are mutually exclusive, but if used together the
last option is selected.
push:: push::
The name of a local ref which represents the `@{push}` location The name of a local ref which represents the `@{push}` location

View File

@ -48,8 +48,10 @@ static struct used_atom {
union { union {
char color[COLOR_MAXLEN]; char color[COLOR_MAXLEN];
struct align align; struct align align;
enum { RR_NORMAL, RR_SHORTEN, RR_TRACK, RR_TRACKSHORT } struct {
remote_ref; enum { RR_NORMAL, RR_SHORTEN, RR_TRACK, RR_TRACKSHORT } option;
unsigned int nobracket : 1;
} remote_ref;
struct { struct {
enum { C_BARE, C_BODY, C_BODY_DEP, C_LINES, C_SIG, C_SUB, C_TRAILERS } option; enum { C_BARE, C_BODY, C_BODY_DEP, C_LINES, C_SIG, C_SUB, C_TRAILERS } option;
unsigned int nlines; unsigned int nlines;
@ -77,16 +79,33 @@ static void color_atom_parser(struct used_atom *atom, const char *color_value)
static void remote_ref_atom_parser(struct used_atom *atom, const char *arg) static void remote_ref_atom_parser(struct used_atom *atom, const char *arg)
{ {
if (!arg) struct string_list params = STRING_LIST_INIT_DUP;
atom->u.remote_ref = RR_NORMAL; int i;
else if (!strcmp(arg, "short"))
atom->u.remote_ref = RR_SHORTEN; if (!arg) {
else if (!strcmp(arg, "track")) atom->u.remote_ref.option = RR_NORMAL;
atom->u.remote_ref = RR_TRACK; return;
else if (!strcmp(arg, "trackshort")) }
atom->u.remote_ref = RR_TRACKSHORT;
atom->u.remote_ref.nobracket = 0;
string_list_split(&params, arg, ',', -1);
for (i = 0; i < params.nr; i++) {
const char *s = params.items[i].string;
if (!strcmp(s, "short"))
atom->u.remote_ref.option = RR_SHORTEN;
else if (!strcmp(s, "track"))
atom->u.remote_ref.option = RR_TRACK;
else if (!strcmp(s, "trackshort"))
atom->u.remote_ref.option = RR_TRACKSHORT;
else if (!strcmp(s, "nobracket"))
atom->u.remote_ref.nobracket = 1;
else else
die(_("unrecognized format: %%(%s)"), atom->name); die(_("unrecognized format: %%(%s)"), atom->name);
}
string_list_clear(&params, 0);
} }
static void body_atom_parser(struct used_atom *atom, const char *arg) static void body_atom_parser(struct used_atom *atom, const char *arg)
@ -1069,25 +1088,27 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
struct branch *branch, const char **s) struct branch *branch, const char **s)
{ {
int num_ours, num_theirs; int num_ours, num_theirs;
if (atom->u.remote_ref == RR_SHORTEN) if (atom->u.remote_ref.option == RR_SHORTEN)
*s = shorten_unambiguous_ref(refname, warn_ambiguous_refs); *s = shorten_unambiguous_ref(refname, warn_ambiguous_refs);
else if (atom->u.remote_ref == RR_TRACK) { else if (atom->u.remote_ref.option == RR_TRACK) {
if (stat_tracking_info(branch, &num_ours, if (stat_tracking_info(branch, &num_ours,
&num_theirs, NULL)) { &num_theirs, NULL)) {
*s = "[gone]"; *s = xstrdup("gone");
return; } else if (!num_ours && !num_theirs)
}
if (!num_ours && !num_theirs)
*s = ""; *s = "";
else if (!num_ours) else if (!num_ours)
*s = xstrfmt("[behind %d]", num_theirs); *s = xstrfmt("behind %d", num_theirs);
else if (!num_theirs) else if (!num_theirs)
*s = xstrfmt("[ahead %d]", num_ours); *s = xstrfmt("ahead %d", num_ours);
else else
*s = xstrfmt("[ahead %d, behind %d]", *s = xstrfmt("ahead %d, behind %d",
num_ours, num_theirs); num_ours, num_theirs);
} else if (atom->u.remote_ref == RR_TRACKSHORT) { if (!atom->u.remote_ref.nobracket && *s[0]) {
const char *to_free = *s;
*s = xstrfmt("[%s]", *s);
free((void *)to_free);
}
} else if (atom->u.remote_ref.option == RR_TRACKSHORT) {
if (stat_tracking_info(branch, &num_ours, if (stat_tracking_info(branch, &num_ours,
&num_theirs, NULL)) &num_theirs, NULL))
return; return;

View File

@ -372,6 +372,8 @@ test_expect_success 'setup for upstream:track[short]' '
test_atom head upstream:track '[ahead 1]' test_atom head upstream:track '[ahead 1]'
test_atom head upstream:trackshort '>' test_atom head upstream:trackshort '>'
test_atom head upstream:track,nobracket 'ahead 1'
test_atom head upstream:nobracket,track 'ahead 1'
test_atom head push:track '[ahead 1]' test_atom head push:track '[ahead 1]'
test_atom head push:trackshort '>' test_atom head push:trackshort '>'