ref-filter: add support for %(upstream:track,nobracket)
authorKarthik Nayak <karthik.188@gmail.com>
Tue, 10 Jan 2017 08:49:41 +0000 (14:19 +0530)
committerJunio C Hamano <gitster@pobox.com>
Tue, 10 Jan 2017 20:44:31 +0000 (12:44 -0800)
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>
Documentation/git-for-each-ref.txt
ref-filter.c
t/t6300-for-each-ref.sh
index 94c6b88faa971ab97478a8b78b3cd00a2be4a1fd..14240b407544d1be7be90b8427d92c78da05224f 100644 (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),
        `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
 
 push::
        The name of a local ref which represents the `@{push}` location
index 4a05150578d71fc68d0335a41719fe738df2fca9..c58765fa7fd25c63c625f4eae738367f61db6dbf 100644 (file)
@@ -48,8 +48,10 @@ static struct used_atom {
        union {
                char color[COLOR_MAXLEN];
                struct align align;
        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;
                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)
 {
 
 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)
 }
 
 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;
                                    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);
                *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)) {
                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 = "";
                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,
                                       &num_theirs, NULL))
                        return;
                if (stat_tracking_info(branch, &num_ours,
                                       &num_theirs, NULL))
                        return;
index a2e3f5525ffd3f76691e3eba29dbd50185e2af0c..af76dc530212a77e56b86775712be8080510705c 100755 (executable)
@@ -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 '[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 '>'
 
 test_atom head push:track '[ahead 1]'
 test_atom head push:trackshort '>'