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
"[ahead N, behind M]" and `:trackshort` to show the terse
version: ">" (ahead), "<" (behind), "<>" (ahead and behind),
or "=" (in sync). Has no effect if the ref does not have
tracking information associated with it. `:track` also prints
"[gone]" whenever unknown upstream ref is encountered.
or "=" (in sync). `:track` also prints "[gone]" whenever
unknown upstream ref is encountered. Append `:track,nobracket`
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::
The name of a local ref which represents the `@{push}` location

View File

@ -48,8 +48,10 @@ static struct used_atom {
union {
char color[COLOR_MAXLEN];
struct align align;
enum { RR_NORMAL, RR_SHORTEN, RR_TRACK, RR_TRACKSHORT }
remote_ref;
struct {
enum { RR_NORMAL, RR_SHORTEN, RR_TRACK, RR_TRACKSHORT } option;
unsigned int nobracket : 1;
} remote_ref;
struct {
enum { C_BARE, C_BODY, C_BODY_DEP, C_LINES, C_SIG, C_SUB, C_TRAILERS } option;
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)
{
if (!arg)
atom->u.remote_ref = RR_NORMAL;
else if (!strcmp(arg, "short"))
atom->u.remote_ref = RR_SHORTEN;
else if (!strcmp(arg, "track"))
atom->u.remote_ref = RR_TRACK;
else if (!strcmp(arg, "trackshort"))
atom->u.remote_ref = RR_TRACKSHORT;
else
die(_("unrecognized format: %%(%s)"), atom->name);
struct string_list params = STRING_LIST_INIT_DUP;
int i;
if (!arg) {
atom->u.remote_ref.option = RR_NORMAL;
return;
}
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
die(_("unrecognized format: %%(%s)"), atom->name);
}
string_list_clear(&params, 0);
}
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)
{
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);
else if (atom->u.remote_ref == RR_TRACK) {
else if (atom->u.remote_ref.option == RR_TRACK) {
if (stat_tracking_info(branch, &num_ours,
&num_theirs, NULL)) {
*s = "[gone]";
return;
}
if (!num_ours && !num_theirs)
*s = xstrdup("gone");
} else if (!num_ours && !num_theirs)
*s = "";
else if (!num_ours)
*s = xstrfmt("[behind %d]", num_theirs);
*s = xstrfmt("behind %d", num_theirs);
else if (!num_theirs)
*s = xstrfmt("[ahead %d]", num_ours);
*s = xstrfmt("ahead %d", num_ours);
else
*s = xstrfmt("[ahead %d, behind %d]",
*s = xstrfmt("ahead %d, behind %d",
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,
&num_theirs, NULL))
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: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:trackshort '>'