git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v16 00/14] port tag.c to use ref-filter APIs

From
Karthik Nayak <karthik.188@gmail.com>
Date
Sep 7, 2015, 13:56 UTC
Message-ID
<CAOLa=ZQFZRKY_hHEVQQ6CuYC9XNWHJFYg1CFZCGUr-68phDMHQ@mail.gmail.com>
In-Reply-To
<xmqqh9n6agcf.fsf@gitster.mtv.corp.google.com>
On Mon, Sep 7, 2015 at 12:03 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 49 quoted lines
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
>> index d039f40..c5154bb 100644
>> --- a/Documentation/git-for-each-ref.txt
>> +++ b/Documentation/git-for-each-ref.txt
>> @@ -128,13 +128,14 @@ color::
>>       are described in `color.branch.*`.
>>
>>  align::
>> -     Left-, middle-, or right-align the content between %(align:..)
>> +     Left-, middle-, or right-align the content between %(align:...)
>>       and %(end). Followed by `:<width>,<position>`, where the
>>       `<position>` is either left, right or middle and `<width>` is
>>       the total length of the content with alignment. If the
>>       contents length is more than the width then no alignment is
>>       performed. If used with '--quote' everything in between
>> -     %(align:..)  and %(end) is quoted.
>> +     %(align:...) and %(end) is quoted, but if nested then only the
>> +     topmost level performs quoting.
>
> I am not sure if the description of quote belongs to "align".  Isn't
> the general rule at the endgame when there are more opening things
> that would buffer its effect up to the corresponding %(end):
>
>  - Some atoms like %(align) and %(if) always require a matching
>    %(end).  We call them "opening atoms" and sometimes denote them
>    as %($open).
>
>  - When a scripting language specific quoting is in effect, except
>    for opening atoms, replacement from every %(atom) is quoted when
>    and only when it appears at the top-level (that is, when it
>    appears outside %($open)...%(end)).
>
>  - When a scripting language specific quoting is in effect,
>    everything between a top-level opening atom and its matching
>    %(end) is evaluated according to the semantics of the opening
>    atom and its result is quoted.
>
> To put the third item above in a different way, a matching
> %($open)...  %(end) pair behaves as if it is a single normal atom,
> from the point of view of the quoting rule.  All top-level atoms are
> invidivually quoted, whether they are normal atoms or open/end pairs.
> And that rule is not limited to %(align).
>
> I am flexible with the terminology, but the point is that I think
> the quoting rules are better be specified _outside_ the description
> of a particular atom, but as a general rule.
>

I definitely agree, but like Matthieu said, corrently we have only one such atom and it makes sense to note this behaviour under that. When we get %(if) to work we could move this over to a more general section?

Show 16 quoted lines
>> diff --git a/builtin/tag.c b/builtin/tag.c
>> index 9fa1400..f55dfda 100644
>> --- a/builtin/tag.c
>> +++ b/builtin/tag.c
>> @@ -43,8 +43,8 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, con
>>
>>       if (!format) {
>>               if (filter->lines)
>> -                     format = to_free = xstrfmt("%%(align:15,left)%%(refname:short)%%(end) %%(contents:lines=%d)",
>> -                                                filter->lines);
>> +                     format = to_free = xstrfmt("%%(align:15,left)%%(refname:short)%%(end) "
>> +                                                "%%(contents:lines=%d)", filter->lines);
>
> This line still looks overlong.  Would it help to stop spelling this
> as a double "a = b = overlong expression" assignment?
>
I'm not sure, I get what you mean.
Show 30 quoted lines
>>       /*
>>        * Perform quote formatting when the stack element is that of
>> -      * a modifier atom and right above the first stack element.
>> +      * a supporting atom. If nested then perform quote formatting
>> +      * only on the topmost supporting atom.
>>        */
>>       if (!state->stack->prev->prev) {
>>               quote_formatting(&s, current->output.buf, state->quote_style);
>> @@ -261,6 +262,22 @@ static void end_atom_handler(struct atom_value *atomv, struct ref_formatting_sta
>>       pop_stack_element(&state->stack);
>>  }
>>
>> +static int match_atom_name(const char *name, const char *atom_name, const char **val)
>> +{
>> +     const char *body;
>> +
>> +     if (!skip_prefix(name, atom_name, &body))
>> +             return 0; /* doesn't even begin with "atom_name" */
>> +     if (!body[0] || !body[1]) {
>> +             *val = NULL; /* %(atom_name) and no customization */
>> +             return 1;
>> +     }
>
> This if condition is puzzling.  !body[0] would mean the name was
> exactly atom_name, which is what you want to catch.
>
> But the other part does not make any sense to me.  what does
> (body[0] != '\0' && !body[1]) mean?  atom_name asked for was "align"
> and name was "aligna"?  That is not "%(align) and no customization".
>
The idea was to ensure that the atom doesn't end at the ':'.
Show 8 quoted lines
>> +     if (body[0] != ':')
>> +             return 0; /* "atom_namefoo" is not "atom_name" or "atom_name:..." */
>
> This one makes sense to me.
>
>> +     *val = body + 1; /* "atomname:val" */
>
> Spell that "atom_name:val" perhaps?
Yeah will do.
-- 
Regards,
Karthik Nayak
Previous: Matthieu MoyNext: Matthieu Moy
Message 24 of 30 in “port tag.c to use ref-filter APIs”
  1. 00/14 port tag.c to use ref-filter APIsKarthik Nayak, Sep 5, 2015
  2. 01/14 ref-filter: move `struct atom_value` to ref-filter.cKarthik Nayak, Sep 5, 2015
  3. 02/14 ref-filter: introduce ref_formatting_state and ref_formatting_stackKarthik Nayak, Sep 5, 2015
  4. 03/14 utf8: add function to align a string into given strbufKarthik Nayak, Sep 5, 2015
  5. 04/14 ref-filter: introduce handler function for each atomKarthik Nayak, Sep 5, 2015
  6. 05/14 ref-filter: introduce match_atom_name()Karthik Nayak, Sep 5, 2015
  7. Eric SunshineSep 6, 2015
  8. Karthik NayakSep 7, 2015
  9. 06/14 ref-filter: implement an `align` atomKarthik Nayak, Sep 5, 2015
  10. Eric SunshineSep 6, 2015
  11. Karthik NayakSep 7, 2015
  12. 07/14 ref-filter: add option to filter out tags, branches and remotesKarthik Nayak, Sep 5, 2015
  13. 08/14 ref-filter: add support for %(contents:lines=X)Karthik Nayak, Sep 5, 2015
  14. 09/14 ref-filter: add support to sort by versionKarthik Nayak, Sep 5, 2015
  15. 10/14 ref-filter: add option to match literal patternKarthik Nayak, Sep 5, 2015
  16. 11/14 tag.c: use 'ref-filter' data structuresKarthik Nayak, Sep 5, 2015
  17. 12/14 tag.c: use 'ref-filter' APIsKarthik Nayak, Sep 5, 2015
  18. 13/14 tag.c: implement '--format' optionKarthik Nayak, Sep 5, 2015
  19. 14/14 tag.c: implement '--merged' and '--no-merged' optionsKarthik Nayak, Sep 5, 2015
  20. Matthieu MoySep 6, 2015
  21. Karthik NayakSep 6, 2015
  22. Junio C HamanoSep 7, 2015
  23. Matthieu MoySep 7, 2015
  24. Karthik NayakSep 7, 2015
  25. Matthieu MoySep 7, 2015
  26. Karthik NayakSep 8, 2015
  27. Junio C HamanoSep 8, 2015
  28. Karthik NayakSep 9, 2015
  29. Junio C HamanoSep 9, 2015
  30. Junio C HamanoSep 8, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.