git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>
To: Karthik Nayak <karthik.188@gmail.com>
Cc: git@vger.kernel.org, christian.couder@gmail.com, gitster@pobox.com
Subject: Re: [PATCH v12 03/13] ref-filter: introduce the ref_formatting_state stack machinery
Date: Wed, 19 Aug 2015 16:56:45 +0200	[thread overview]
Message-ID: <vpqvbcb2uoi.fsf@anie.imag.fr> (raw)
In-Reply-To: <1439923052-7373-4-git-send-email-Karthik.188@gmail.com> (Karthik Nayak's message of "Wed, 19 Aug 2015 00:07:22 +0530")

Karthik Nayak <karthik.188@gmail.com> writes:

> +static void pop_state(struct ref_formatting_state **stack)
> +{
> +	struct ref_formatting_state *current = *stack;
> +	struct ref_formatting_state *prev = current->prev;
> +
> +	if (prev)
> +		strbuf_addbuf(&prev->output, &current->output);

I find this "if (prev)" suspicious: if there's a previous element in the
stack, push to it, but otherwise, you're throwing away the content of
the stack top silently.

Given the rest of the patch, this is correct, since you're using
state->output before pop_state(), but I find it weird to have the same
function to actually pop a state, and to destroy the last element.

Just thinking out loudly, I don't have specific alternative to propose
here.

> @@ -1262,23 +1284,24 @@ static void append_literal(const char *cp, const char *ep, struct ref_formatting
>  void show_ref_array_item(struct ref_array_item *info, const char *format, int quote_style)
>  {
>  	const char *cp, *sp, *ep;
> -	struct ref_formatting_state state;
> +	struct strbuf *final_buf;
> +	struct ref_formatting_state *state = NULL;
>  
> -	strbuf_init(&state.output, 0);
> -	state.quote_style = quote_style;
> +	push_new_state(&state);
> +	state->quote_style = quote_style;

I do not think that the quote_style should belong to the stack. At the
moment, only the bottom of the stack has it set, and as a result you're
getting weird results like:

$ ./git for-each-ref --shell --format '|%(align:80,left)<%(author)>%(end)|' | head -n 3 
|<Junio C Hamano <gitster@pobox.com> 1435173702 -0700>                           ''|
|<Junio C Hamano <gitster@pobox.com> 1435173701 -0700>                           ''|
|<Junio C Hamano <gitster@pobox.com> 1433277352 -0700>                           ''|

See, the '' are inserted where the %(end) was, but not around atoms as
one would expect.

One stupid fix would be to propagate the quote_style accross the stack,
like this:

--- a/ref-filter.c
+++ b/ref-filter.c
@@ -155,6 +155,8 @@ static void push_new_state(struct ref_formatting_state **stack)
 
        strbuf_init(&s->output, 0);
        s->prev = *stack;
+       if (*stack)
+               s->quote_style = (*stack)->quote_style;
        *stack = s;
 }
 

After applying this, I do get the '' around the author (= correct
behavior I think), but then one wonders even more why this is part of
the stack.

You replaced the quote_style argument with ref_formatting_state, and I
think you should have kept this argument and added ref_formatting_state.
The other option is to add an extra indirection like

struct ref_formatting_state {
	int quote_style;
	struct ref_formatting_stack *stack;
}

(ref_formatting_stack would be what you currently call
ref_formatting_state). But that's probably overkill.

Also, after applying my toy patch above, I get useless '' around
%(align) and %(end). I can get rid of them with

--- a/ref-filter.c
+++ b/ref-filter.c
@@ -1499,7 +1501,8 @@ void show_ref_array_item(struct ref_array_item *info, const char *format,
                get_ref_atom_value(info, parse_ref_filter_atom(sp + 2, ep), &atomv);
                if (atomv->handler)
                        atomv->handler(atomv, &state);
-               append_atom(atomv, state);
+               else
+                       append_atom(atomv, state);
        }
        if (*cp) {
                sp = cp + strlen(cp);

Unless I missed something, this second patch is sensible anyway and
should be squashed into [PATCH v12 05/13]: you don't need to call
append_atom() when you have a handler, right?

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

  reply	other threads:[~2015-08-19 14:56 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-18 18:37 [PATCH v12 00/13] port tag.c to use ref-filter.c APIs Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 01/13] ref-filter: move `struct atom_value` to ref-filter.c Karthik Nayak
2015-08-19 14:56   ` Matthieu Moy
2015-08-19 15:29     ` Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 02/13] ref-filter: introduce ref_formatting_state Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 03/13] ref-filter: introduce the ref_formatting_state stack machinery Karthik Nayak
2015-08-19 14:56   ` Matthieu Moy [this message]
2015-08-19 15:39     ` Karthik Nayak
2015-08-19 15:44       ` Matthieu Moy
2015-08-19 15:54         ` Karthik Nayak
2015-08-19 16:10           ` Karthik Nayak
2015-08-20  7:29             ` Matthieu Moy
2015-08-20 10:29               ` Karthik Nayak
2015-08-20 16:47               ` Junio C Hamano
2015-08-20 17:19                 ` Matthieu Moy
2015-08-20 18:29                   ` Junio C Hamano
2015-08-19 18:52     ` Junio C Hamano
2015-08-20 10:31       ` Karthik Nayak
2015-08-20 16:51       ` Junio C Hamano
2015-08-18 18:37 ` [PATCH v12 04/13] utf8: add function to align a string into given strbuf Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 05/13] ref-filter: implement an `align` atom Karthik Nayak
2015-08-18 19:28   ` Karthik Nayak
2015-08-20 20:23   ` Eric Sunshine
2015-08-21  1:55     ` Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 06/13] ref-filter: add option to filter out tags, branches and remotes Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 07/13] ref-filter: support printing N lines from tag annotation Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 08/13] ref-filter: add support to sort by version Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 09/13] ref-filter: add option to match literal pattern Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 10/13] tag.c: use 'ref-filter' data structures Karthik Nayak
2015-08-19 14:56   ` Matthieu Moy
2015-08-19 15:51     ` Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 11/13] tag.c: use 'ref-filter' APIs Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 12/13] tag.c: implement '--format' option Karthik Nayak
2015-08-19 14:53   ` Matthieu Moy
2015-08-20 15:50     ` Karthik Nayak
2015-08-18 18:37 ` [PATCH v12 13/13] tag.c: implement '--merged' and '--no-merged' options Karthik Nayak
2015-08-18 19:18 ` [PATCH v12 00/13] port tag.c to use ref-filter.c APIs Eric Sunshine
2015-08-18 19:25   ` 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=vpqvbcb2uoi.fsf@anie.imag.fr \
    --to=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).