git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jacob Keller <jacob.keller@gmail.com>
To: Karthik Nayak <karthik.188@gmail.com>
Cc: Git List <git@vger.kernel.org>,
	Christian Couder <christian.couder@gmail.com>,
	Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>,
	Junio C Hamano <gitster@pobox.com>
Subject: Re: [RFC/PATCH 04/11] ref-filter: add 'ifexists' atom
Date: Tue, 28 Jul 2015 00:54:52 -0700	[thread overview]
Message-ID: <CA+P7+xq_jC=gE3J=PTkVx8BpTRzCJCfU0V-ydBve2FYbg1gmBg@mail.gmail.com> (raw)
In-Reply-To: <1438066594-5620-4-git-send-email-Karthik.188@gmail.com>

On Mon, Jul 27, 2015 at 11:56 PM, Karthik Nayak <karthik.188@gmail.com> wrote:
> The 'ifexists' atom allows us to print a required format if the
> preceeding atom has a value. If the preceeding atom has no value then

Don't you mean "following atom" here? since you do document it as "the
next atom" below you should fix the commit message as well to match.
In any respect, this is a useful formatting atom :)

%(ifexists:[%s])%(atom) where the contents of atom will be placed into %s?

> the format given is not printed. e.g. to print "[<refname>]" we can
> now use the format "%(ifexists:[%s])%(refname)".
>
> Add documentation and test 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>
> ---
>  Documentation/git-for-each-ref.txt |  8 ++++++++
>  ref-filter.c                       | 37 ++++++++++++++++++++++++++++++++++---
>  ref-filter.h                       |  5 +++--
>  t/t6302-for-each-ref-filter.sh     | 21 +++++++++++++++++++++
>  4 files changed, 66 insertions(+), 5 deletions(-)
>
> diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
> index 9dc02aa..4424020 100644
> --- a/Documentation/git-for-each-ref.txt
> +++ b/Documentation/git-for-each-ref.txt
> @@ -138,6 +138,14 @@ colornext::
>         `<:colorname>`.  Not compatible with `padright` and resets any
>         previous `color`, if set.
>
> +ifexists::
> +       Print required string only if the next atom specified in the
> +       '--format' option exists.
> +       e.g. --format="%(ifexists:[%s])%(symref)" prints the symref
> +       like "[<symref>]" only if the ref has a symref.  This was
> +       incorporated to simulate the output of 'git branch -vv', where
> +       we need to display the upstream branch in square brackets.
> +

I suggest documenting that the atom will be placed into the contents
of ifexists via the %s indicator, as you do show an example but don't
explicitely say %s is the formatting character.

>  In addition to the above, for commit and tag objects, the header
>  field names (`tree`, `parent`, `object`, `type`, and `tag`) can
>  be used to specify the value in the header field.
> diff --git a/ref-filter.c b/ref-filter.c
> index 3f40144..ff5a16b 100644
> --- a/ref-filter.c
> +++ b/ref-filter.c
> @@ -58,6 +58,7 @@ static struct {
>         { "color" },
>         { "padright" },
>         { "colornext" },
> +       { "ifexists" },
>  };
>
>  /*
> @@ -722,6 +723,13 @@ static void populate_value(struct ref_array_item *ref)
>                         v->modifier_atom = 1;
>                         v->color_next = 1;
>                         continue;
> +               } else if (starts_with(name, "ifexists:")) {
> +                       skip_prefix(name, "ifexists:", &v->s);
> +                       if (!*v->s)
> +                               die(_("no string given with 'ifexists:'"));
> +                       v->modifier_atom = 1;
> +                       v->ifexists = 1;
> +                       continue;
>                 } else
>                         continue;
>
> @@ -1315,11 +1323,32 @@ static void apply_formatting_state(struct ref_formatting_state *state,
>  {
>         if (state->color_next && state->pad_to_right)
>                 die(_("cannot use `colornext` and `padright` together"));
> -       if (state->color_next) {
> +       if (state->pad_to_right && state->ifexists)
> +               die(_("cannot use 'align' and 'ifexists' together"));
> +       if (state->color_next && !state->ifexists) {
>                 strbuf_addf(value, "%s%s%s", state->color_next, v->s, GIT_COLOR_RESET);
>                 return;
> -       }
> -       else if (state->pad_to_right) {
> +       } else if (state->ifexists) {
> +               const char *sp = state->ifexists;
> +
> +               while (*sp) {
> +                       if (*sp != '%') {
> +                               strbuf_addch(value, *sp++);
> +                               continue;
> +                       } else if (sp[1] == '%') {
> +                               strbuf_addch(value, *sp++);
> +                               continue;
> +                       } else if (sp[1] == 's') {
> +                               if (state->color_next)
> +                                       strbuf_addf(value, "%s%s%s", state->color_next, v->s, GIT_COLOR_RESET);
> +                               else
> +                                       strbuf_addstr(value, v->s);
> +                               sp += 2;
> +                       }
> +               }
> +
> +               return;
> +       } else if (state->pad_to_right) {
>                 if (!is_utf8(v->s))
>                         strbuf_addf(value, "%-*s", state->pad_to_right, v->s);
>                 else {
> @@ -1413,6 +1442,8 @@ static void store_formatting_state(struct ref_formatting_state *state,
>                 state->color_next = atomv->s;
>         if (atomv->pad_to_right)
>                 state->pad_to_right = atomv->ul;
> +       if (atomv->ifexists)
> +               state->ifexists = atomv->s;
>  }
>
>  static void reset_formatting_state(struct ref_formatting_state *state)
> diff --git a/ref-filter.h b/ref-filter.h
> index a021b04..7d1871d 100644
> --- a/ref-filter.h
> +++ b/ref-filter.h
> @@ -28,13 +28,14 @@ struct atom_value {
>         unsigned long ul; /* used for sorting when not FIELD_STR */
>         unsigned int modifier_atom : 1, /*  atoms which act as modifiers for the next atom */
>                 pad_to_right : 1,
> -               color_next : 1;
> +               color_next : 1,
> +               ifexists : 1;
>  };
>
>  struct ref_formatting_state {
>         int quote_style;
>         unsigned int pad_to_right;
> -       const char *color_next;
> +       const char *color_next, *ifexists;
>  };
>
>  struct ref_sorting {
> diff --git a/t/t6302-for-each-ref-filter.sh b/t/t6302-for-each-ref-filter.sh
> index 6aad069..29ed97b 100755
> --- a/t/t6302-for-each-ref-filter.sh
> +++ b/t/t6302-for-each-ref-filter.sh
> @@ -149,4 +149,25 @@ test_expect_success 'check `colornext` format option' '
>         test_cmp expect actual
>  '
>
> +test_expect_success 'check `ifexists` format option' '
> +       cat >expect <<-\EOF &&
> +       [foo1.10]
> +       [foo1.3]
> +       [foo1.6]
> +       EOF
> +       git for-each-ref --format="%(ifexists:[%s])%(refname:short)" | grep "foo" >actual &&
> +       test_cmp expect actual
> +'
> +
> +cat >expect <<EOF &&
> +[$(get_color green)foo1.10$(get_color reset)]||foo1.10
> +[$(get_color green)foo1.3$(get_color reset)]||foo1.3
> +[$(get_color green)foo1.6$(get_color reset)]||foo1.6
> +EOF
> +
> +test_expect_success 'check `ifexists` with `colornext` format option' '
> +       git for-each-ref --format="%(ifexists:[%s])%(colornext:green)%(refname:short)||%(refname:short)" | grep "foo" >actual &&
> +       test_cmp expect actual
> +'
> +
>  test_done
> --
> 2.4.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2015-07-28  7:55 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-28  6:55 [RFC/PATCH] Port branch.c to use ref-filter APIs Karthik Nayak
2015-07-28  6:56 ` [RFC/PATCH 01/11] ref-filter: add "%(objectname:size=X)" option Karthik Nayak
2015-07-28  6:56   ` [RFC/PATCH 02/11] ref-filter: add 'colornext' atom Karthik Nayak
2015-07-28  8:45     ` Matthieu Moy
2015-07-28 16:03       ` Karthik Nayak
2015-07-28  9:13     ` Christian Couder
2015-07-28 16:04       ` Karthik Nayak
2015-07-29 20:10     ` Eric Sunshine
2015-07-29 21:30       ` Matthieu Moy
2015-07-30  4:27         ` Jacob Keller
2015-07-30 16:17           ` Junio C Hamano
2015-08-01 13:06             ` Karthik Nayak
2015-07-28  6:56   ` [RFC/PATCH 03/11] ref-filter: add option to filter only branches Karthik Nayak
2015-07-28 13:38     ` Matthieu Moy
2015-07-28 16:42       ` Karthik Nayak
2015-07-28  6:56   ` [RFC/PATCH 04/11] ref-filter: add 'ifexists' atom Karthik Nayak
2015-07-28  7:54     ` Jacob Keller [this message]
2015-07-28 16:47       ` Karthik Nayak
2015-07-28  8:50     ` Matthieu Moy
2015-07-28 17:39       ` Karthik Nayak
2015-07-28 17:57     ` Junio C Hamano
2015-07-29 17:48       ` Karthik Nayak
2015-07-29 18:00         ` Junio C Hamano
2015-07-29 18:56           ` Junio C Hamano
2015-07-29 21:21             ` Matthieu Moy
2015-07-29 22:05               ` Junio C Hamano
2015-08-01  6:46               ` Karthik Nayak
2015-08-01  7:05                 ` Jacob Keller
2015-08-01  6:44           ` Karthik Nayak
2015-07-28  6:56   ` [RFC/PATCH 05/11] branch: fix width computation Karthik Nayak
2015-07-28  9:47     ` Matthieu Moy
2015-07-28 18:16       ` Karthik Nayak
2015-07-28  6:56   ` [RFC/PATCH 06/11] branch: roll show_detached HEAD into regular ref_list Karthik Nayak
2015-07-28 13:01     ` Matthieu Moy
2015-07-28 19:19       ` Karthik Nayak
2015-07-29  9:56         ` Matthieu Moy
2015-07-29 17:54           ` Karthik Nayak
2015-07-28  6:56   ` [RFC/PATCH 07/11] branch: move 'current' check down to the presentation layer Karthik Nayak
2015-07-28 13:09     ` Matthieu Moy
2015-07-28 20:12       ` Karthik Nayak
2015-07-29  0:46         ` Jacob Keller
2015-07-29 18:44           ` Karthik Nayak
2015-07-29 10:01         ` Matthieu Moy
2015-07-29 18:52           ` Karthik Nayak
2015-07-29 21:27             ` Matthieu Moy
2015-08-01  6:48               ` Karthik Nayak
2015-08-01  7:06                 ` Jacob Keller
2015-08-01  9:03                 ` Eric Sunshine
2015-08-02 12:59                   ` Karthik Nayak
2015-08-02 17:58                     ` Junio C Hamano
2015-07-28  6:56   ` [RFC/PATCH 08/11] branch: drop non-commit error reporting Karthik Nayak
2015-07-28  6:56   ` [RFC/PATCH 09/11] branch.c: use 'ref-filter' data structures Karthik Nayak
2015-07-28  8:17     ` Christian Couder
2015-07-28 13:48       ` Matthieu Moy
2015-07-28 20:41         ` Karthik Nayak
2015-07-29 10:08           ` Matthieu Moy
2015-07-29 19:38             ` Karthik Nayak
2015-07-28 20:38       ` Karthik Nayak
2015-07-28  8:22     ` Christian Couder
2015-07-28 20:31       ` Karthik Nayak
2015-07-28  8:42   ` [RFC/PATCH 01/11] ref-filter: add "%(objectname:size=X)" option Matthieu Moy
2015-07-28 15:54     ` Karthik Nayak
2015-07-28 15:43   ` Junio C Hamano
2015-07-28 15:55     ` Karthik Nayak
2015-07-28 16:19   ` Junio C Hamano
2015-07-29 16:02     ` Karthik Nayak
2015-07-28  7:11 ` [RFC/PATCH 10/11] branch.c: use 'ref-filter' APIs Karthik Nayak
2015-07-28  7:57   ` Jacob Keller
2015-07-29  3:46     ` Karthik Nayak
2015-07-28  8:09   ` Christian Couder
2015-07-29  3:48     ` Karthik Nayak
2015-07-28 14:17   ` Matthieu Moy
2015-07-29 15:32     ` Karthik Nayak
2015-07-29 15:46       ` Matthieu Moy
2015-07-29 15:37     ` Karthik Nayak
2015-07-29 15:56       ` Matthieu Moy
2015-07-30  6:37         ` Karthik Nayak
2015-07-30  7:29           ` Matthieu Moy
2015-08-03 10:20             ` Karthik Nayak
2015-08-19 15:49               ` Matthieu Moy
2015-08-19 15:52                 ` Karthik Nayak
2015-07-28  7:11 ` [RFC/PATCH 11/11] branch: add '--points-at' option Karthik Nayak
2015-07-28  7:46   ` Jacob Keller
2015-07-29 15:44     ` Karthik Nayak
2015-07-28 13:35 ` [RFC/PATCH] Port branch.c to use ref-filter APIs Matthieu Moy
2015-07-28 15:48   ` Karthik Nayak
2015-07-28 17:53     ` Matthieu Moy
2015-07-29 15:54       ` Karthik Nayak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CA+P7+xq_jC=gE3J=PTkVx8BpTRzCJCfU0V-ydBve2FYbg1gmBg@mail.gmail.com' \
    --to=jacob.keller@gmail.com \
    --cc=Matthieu.Moy@grenoble-inp.fr \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=karthik.188@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).