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:
parent
ffd921d311
commit
7743fcca5b
@ -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
|
||||
|
67
ref-filter.c
67
ref-filter.c
@ -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(¶ms, 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(¶ms, 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;
|
||||
|
@ -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 '>'
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user