From: Linus Arver <linusa@google.com>
To: Junio C Hamano <gitster@pobox.com>,
Linus Arver via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Christian Couder <chriscool@tuxfamily.org>,
Emily Shaffer <nasamuffin@google.com>,
Josh Steadmon <steadmon@google.com>,
"Randall S. Becker" <rsbecker@nexbridge.com>
Subject: Re: [PATCH v3 03/10] trailer: unify trailer formatting machinery
Date: Wed, 31 Jan 2024 16:46:03 -0800 [thread overview]
Message-ID: <owlyv879106s.fsf@fine.c.googlers.com> (raw)
In-Reply-To: <xmqqa5ol409k.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
> Junio C Hamano <gitster@pobox.com> writes:
>
>>> + if (opts->unfold)
>>> + unfold_value(&val);
>>
>> So, ... how would this affect an invocation of
>>
>> $ git interpret-trailers --unfold
>>
>> which would have set opts.unfold to true in cmd_interpret_trailers()
>> and eventually called process_trailers() with it, which eventually
>> called print_all(), which conditionally called print_tok_val() but
>> never gave the val to unfold_value()?
>>
>> ... goes and digs a bit more ...
>>
>> Ahhhh, original process_trailers() did this by calling
>> parse_trailers() that munged the value. So its print_all()
>> codepath only had to print what has already been munged.
>>
>> But then in this new code, do we unfold only here? I thought that
>> in the new code you moved around, the caller, whose name is now
>> interpret_trailers(), still calls parse_trailers() and that calls
>> the unfold_value(). So, are we doing redundant work that may merely
>> be unneeded (if we are lucky) or could be harmful (if things, other
>> than the unfold thing I just noticed, that are done both in
>> parse_trailers() and this function are not idempotent)?
>
> I was too confused by the code flow and resorted to tracing what
> happens when "git interpret-trailers --unfold" is run in a way
> similar to how t7513 does in gdb. Shame shame.
In my larger series I've made the parser and formater much simpler
(removing nesting, calling helper functions, _only parsing once and only
once_, etc) to make both parsing and formatting much easier to
understand. While I am biased as the author of these refactors, I do
think they make the code simpler.
> In any case, the updated code does try to call unfold_value() in
> format_trailers() on "val" that has already been unfolded in
> parse_trailers().
Correct. But this was already the case before this series. IOW the
existing code assumes that this function is idempotent: we call
unfold_value() in parse_trailers() and again in format_trailer_info().
In my tests if I remove the redundant call to unfold_value() in
the new formatter (so that unfolding only happens during
parse_trailers()), all trailer-related tests still pass:
prove -j47 t{7513,3507,7502,4205,3511,3428,6300}*.sh
FWIW in the larger series we prohibit the parser from making mutations
to the input (unfolding is one such mutation), and allow multiline
(folded) strings to be stored as is in "val", only unfolding the value
if we need to during formatting.
> This may not produce an incorrect result if
> unfold_value() is truly idempotent (I do not know), but even if it
> is correct for its handling of .unfold bit, this episode lowered my
> confidence level on the new code significantly, as I do not know
> what unintended effects [*] all the other new things done in this
> function have, or if none of these unintended effects are
> error-free.
I think dropping the redundant call to unfold_value() would help address
some of your concerns. Of course, all of the existing test cases pass
(with and without the redundant call). As for addressing _all_ (not just
some) concerns, I am not confident I can deliver that as an additional
patch or two to this series because ...
>> It could be that a bit more preparatory refactoring would clarify.
>> I dunno.
... this is basically what I've done in the larger series, because there
are many areas that could be simplified (not to mention addressing some
bugs some bugs are lurking around). Granted, those are more aggressive
refactorings, and are not "preparatory refactoring" at all.
I could just grow this series with another ~22 patches to include those
additional refactors, but I am hesitant about doing so, simply due to
the sheer number of them.
How would you like me to proceed, other than deleting the redundant
unfold_value() call in the next reroll?
For reference, here's a list of those 22 commits that build on this
series as a preview (roughly grouped on themes):
trailer formatter: deprecate format_trailers()
trailer formatter: introduce format_trailer_block()
trailer parser: parse_trailer_v2() for '--trailer <...>' CLI arguments
trailer parser: parse_trailer_v2() for configuration
trailer parser: parse_trailer_v2() for trailer blocks
trailer parser: introduce parse_trailer_v2()
interpret-trailers: preserve trailers coming from the input
trailer_block: remove trailer_strings member
trailer_block: parse trailers in one place
trailer_block: prepare to remove trailer_strings member
trailer: make find_same_and_apply_arg() do one thing
trailer: unify global configuration
interpret-trailers: print error if given unrecognized arguments
trailer: make entire iterator struct private
trailer: rename terms for consistency
trailer: use create_new_target_for() everywhere
trailer: capture behavior of addIfDifferentNeighbor
trailer: EXISTS_REPLACE preserves original position
trailer: capture replacement behavior for multiple matches
trailer: split template application into 2 steps
trailer: free templates in one place
trailer: template's final value does not depend on in_tok
and "trailer formatter: introduce format_trailer_block()" is the one
that refactors the unified formatter introduced in this patch to have
multiple smaller helper functions.
next prev parent reply other threads:[~2024-02-01 0:46 UTC|newest]
Thread overview: 202+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-10 6:51 [PATCH 00/10] Enrich Trailer API Linus Arver via GitGitGadget
2024-01-10 6:51 ` [PATCH 01/10] trailer: move process_trailers() to interpret-trailers.c Linus Arver via GitGitGadget
2024-01-18 22:26 ` Junio C Hamano
2024-01-19 0:21 ` Linus Arver
2024-01-10 6:51 ` [PATCH 02/10] trailer: include "trailer" term in API functions Linus Arver via GitGitGadget
2024-01-18 22:28 ` Junio C Hamano
2024-01-19 0:12 ` Linus Arver
2024-01-19 0:15 ` Junio C Hamano
2024-01-10 6:51 ` [PATCH 03/10] trailer: unify trailer formatting machinery Linus Arver via GitGitGadget
2024-01-18 22:56 ` Junio C Hamano
2024-01-19 1:12 ` Linus Arver
2024-01-10 6:51 ` [PATCH 04/10] trailer: delete obsolete formatting functions Linus Arver via GitGitGadget
2024-01-19 0:31 ` Junio C Hamano
2024-01-10 6:51 ` [PATCH 05/10] sequencer: use the trailer iterator Linus Arver via GitGitGadget
2024-01-19 0:45 ` Junio C Hamano
2024-01-20 20:04 ` Linus Arver
2024-01-22 23:22 ` Linus Arver
2024-01-10 6:51 ` [PATCH 06/10] trailer: make trailer_info struct private Linus Arver via GitGitGadget
2024-01-19 0:58 ` Junio C Hamano
2024-01-25 19:35 ` Josh Steadmon
2024-01-25 20:32 ` Junio C Hamano
2024-01-10 6:51 ` [PATCH 07/10] trailer: spread usage of "trailer_block" language Linus Arver via GitGitGadget
2024-01-19 1:03 ` Junio C Hamano
2024-01-20 20:09 ` Linus Arver
2024-01-10 6:51 ` [PATCH 08/10] trailer: prepare to move parse_trailers_from_command_line_args() to builtin Linus Arver via GitGitGadget
2024-01-25 23:39 ` Josh Steadmon
2024-01-26 0:14 ` Linus Arver
2024-01-10 6:51 ` [PATCH 09/10] trailer: move arg handling to interpret-trailers.c Linus Arver via GitGitGadget
2024-01-19 1:14 ` Junio C Hamano
2024-01-20 20:14 ` Linus Arver
2024-01-10 6:51 ` [PATCH 10/10] trailer: delete obsolete argument handling code from API Linus Arver via GitGitGadget
2024-01-10 19:45 ` [PATCH 00/10] Enrich Trailer API Junio C Hamano
2024-01-13 1:35 ` Linus Arver
2024-01-14 20:05 ` Linus Arver
2024-01-25 23:54 ` Josh Steadmon
2024-01-26 22:38 ` [PATCH v2 " Linus Arver via GitGitGadget
2024-01-26 22:38 ` [PATCH v2 01/10] trailer: prepare to expose functions as part of API Linus Arver via GitGitGadget
2024-01-30 0:44 ` Josh Steadmon
2024-01-30 2:43 ` Linus Arver
2024-01-26 22:38 ` [PATCH v2 02/10] trailer: move interpret_trailers() to interpret-trailers.c Linus Arver via GitGitGadget
2024-01-26 22:38 ` [PATCH v2 03/10] trailer: unify trailer formatting machinery Linus Arver via GitGitGadget
2024-01-30 0:24 ` Josh Steadmon
2024-01-30 2:58 ` Linus Arver
2024-01-26 22:38 ` [PATCH v2 04/10] trailer: delete obsolete formatting functions Linus Arver via GitGitGadget
2024-01-26 22:38 ` [PATCH v2 05/10] sequencer: use the trailer iterator Linus Arver via GitGitGadget
2024-01-26 22:38 ` [PATCH v2 06/10] trailer: make trailer_info struct private Linus Arver via GitGitGadget
2024-01-26 22:38 ` [PATCH v2 07/10] trailer: spread usage of "trailer_block" language Linus Arver via GitGitGadget
2024-01-26 22:38 ` [PATCH v2 08/10] trailer: prepare to move parse_trailers_from_command_line_args() to builtin Linus Arver via GitGitGadget
2024-01-26 22:38 ` [PATCH v2 09/10] trailer: move arg handling to interpret-trailers.c Linus Arver via GitGitGadget
2024-01-28 5:01 ` Linus Arver
2024-01-28 6:39 ` Linus Arver
2024-01-26 22:38 ` [PATCH v2 10/10] trailer: delete obsolete argument handling code from API Linus Arver via GitGitGadget
2024-01-31 1:22 ` [PATCH v3 00/10] Enrich Trailer API Linus Arver via GitGitGadget
2024-01-31 1:22 ` [PATCH v3 01/10] trailer: prepare to expose functions as part of API Linus Arver via GitGitGadget
2024-01-31 1:22 ` [PATCH v3 02/10] trailer: move interpret_trailers() to interpret-trailers.c Linus Arver via GitGitGadget
2024-01-31 18:54 ` Junio C Hamano
2024-01-31 23:20 ` Linus Arver
2024-01-31 1:22 ` [PATCH v3 03/10] trailer: unify trailer formatting machinery Linus Arver via GitGitGadget
2024-01-31 20:02 ` Josh Steadmon
2024-01-31 23:21 ` Linus Arver
2024-02-01 17:48 ` Junio C Hamano
2024-02-01 18:22 ` Linus Arver
2024-01-31 20:13 ` Junio C Hamano
2024-01-31 22:16 ` Junio C Hamano
2024-02-01 0:46 ` Linus Arver [this message]
2024-02-01 1:07 ` Junio C Hamano
2024-02-01 16:41 ` Junio C Hamano
2024-02-01 18:26 ` Linus Arver
2024-02-01 19:21 ` Junio C Hamano
2024-02-02 7:23 ` Linus Arver
2024-02-02 17:26 ` Junio C Hamano
2024-01-31 23:29 ` Linus Arver
2024-01-31 1:22 ` [PATCH v3 04/10] sequencer: use the trailer iterator Linus Arver via GitGitGadget
2024-02-01 18:06 ` Junio C Hamano
2024-02-01 19:14 ` Linus Arver
2024-02-03 0:39 ` Linus Arver
2024-01-31 1:22 ` [PATCH v3 05/10] trailer: make trailer_info struct private Linus Arver via GitGitGadget
2024-02-01 18:49 ` Junio C Hamano
2024-02-03 1:09 ` Linus Arver
2024-02-03 4:43 ` Junio C Hamano
2024-01-31 1:22 ` [PATCH v3 06/10] trailer: spread usage of "trailer_block" language Linus Arver via GitGitGadget
2024-02-01 18:57 ` Junio C Hamano
2024-02-03 1:37 ` Linus Arver
2024-01-31 1:22 ` [PATCH v3 07/10] trailer: prepare to move parse_trailers_from_command_line_args() to builtin Linus Arver via GitGitGadget
2024-02-01 19:06 ` Junio C Hamano
2024-01-31 1:22 ` [PATCH v3 08/10] trailer: move arg handling to interpret-trailers.c Linus Arver via GitGitGadget
2024-02-01 22:23 ` Junio C Hamano
2024-02-03 1:48 ` Linus Arver
2024-02-06 1:01 ` Linus Arver
2024-01-31 1:22 ` [PATCH v3 09/10] trailer: delete obsolete argument handling code from API Linus Arver via GitGitGadget
2024-02-01 22:25 ` Junio C Hamano
2024-02-03 1:40 ` Linus Arver
2024-01-31 1:22 ` [PATCH v3 10/10] trailer: introduce "template" term for readability Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 00/28] Enrich Trailer API Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 01/28] trailer: free trailer_info _after_ all related usage Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 02/28] shortlog: add test for de-duplicating folded trailers Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 03/28] trailer: prepare to expose functions as part of API Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 04/28] trailer: move interpret_trailers() to interpret-trailers.c Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 05/28] trailer: start preparing for formatting unification Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 06/28] trailer_info_get(): reorder parameters Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 07/28] format_trailers(): use strbuf instead of FILE Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 08/28] format_trailer_info(): move "fast path" to caller Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 09/28] format_trailers_from_commit(): indirectly call trailer_info_get() Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 10/28] format_trailer_info(): use trailer_item objects Linus Arver via GitGitGadget
2024-02-09 21:53 ` Junio C Hamano
2024-02-13 16:35 ` Linus Arver
2024-02-06 5:12 ` [PATCH v4 11/28] format_trailer_info(): drop redundant unfold_value() Linus Arver via GitGitGadget
2024-02-09 21:54 ` Junio C Hamano
2024-02-06 5:12 ` [PATCH v4 12/28] format_trailer_info(): append newline for non-trailer lines Linus Arver via GitGitGadget
2024-02-09 21:53 ` Junio C Hamano
2024-02-12 23:37 ` Christian Couder
2024-02-13 16:49 ` Linus Arver
2024-02-06 5:12 ` [PATCH v4 13/28] trailer: begin formatting unification Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 14/28] format_trailer_info(): teach it about opts->trim_empty Linus Arver via GitGitGadget
2024-02-12 23:38 ` Christian Couder
2024-02-13 17:05 ` Linus Arver
2024-02-13 17:21 ` Christian Couder
2024-02-06 5:12 ` [PATCH v4 15/28] format_trailer_info(): avoid double-printing the separator Linus Arver via GitGitGadget
2024-02-12 23:38 ` Christian Couder
2024-02-13 17:21 ` Linus Arver
2024-02-13 17:25 ` Christian Couder
2024-02-13 19:52 ` Linus Arver
2024-03-15 5:31 ` Linus Arver
2024-02-13 20:41 ` Kristoffer Haugsbakk
2024-02-06 5:12 ` [PATCH v4 16/28] trailer: finish formatting unification Linus Arver via GitGitGadget
2024-02-09 21:53 ` Junio C Hamano
2024-02-12 23:38 ` Christian Couder
2024-02-13 17:30 ` Linus Arver
2024-02-06 5:12 ` [PATCH v4 17/28] trailer: teach iterator about non-trailer lines Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 18/28] sequencer: use the trailer iterator Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 19/28] trailer: make trailer_info struct private Linus Arver via GitGitGadget
2024-02-09 21:53 ` Junio C Hamano
2024-02-13 17:36 ` Linus Arver
2024-02-12 23:38 ` Christian Couder
2024-02-13 17:41 ` Linus Arver
2024-02-06 5:12 ` [PATCH v4 20/28] trailer: retire trailer_info_get() from API Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 21/28] trailer: spread usage of "trailer_block" language Linus Arver via GitGitGadget
2024-02-12 23:39 ` Christian Couder
2024-02-13 17:47 ` Linus Arver
2024-02-06 5:12 ` [PATCH v4 22/28] trailer: prepare to delete "parse_trailers_from_command_line_args()" Linus Arver via GitGitGadget
2024-02-12 23:39 ` Christian Couder
2024-02-13 17:53 ` Linus Arver
2024-02-06 5:12 ` [PATCH v4 23/28] trailer: add new helper functions to API Linus Arver via GitGitGadget
2024-02-12 23:39 ` Christian Couder
2024-02-13 17:57 ` Linus Arver
2024-02-06 5:12 ` [PATCH v4 24/28] trailer_add_arg_item(): drop new_trailer_item usage Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 25/28] trailer: deprecate "new_trailer_item" struct from API Linus Arver via GitGitGadget
2024-02-06 5:12 ` [PATCH v4 26/28] trailer: unify "--trailer ..." arg handling Linus Arver via GitGitGadget
2024-02-12 23:39 ` Christian Couder
2024-02-13 18:12 ` Linus Arver
2024-02-06 5:12 ` [PATCH v4 27/28] trailer_set_*(): put out parameter at the end Linus Arver via GitGitGadget
2024-02-12 23:39 ` Christian Couder
2024-02-13 18:14 ` Linus Arver
2024-02-06 5:12 ` [PATCH v4 28/28] trailer: introduce "template" term for readability Linus Arver via GitGitGadget
2024-02-12 23:40 ` Christian Couder
2024-02-13 18:20 ` Linus Arver
2024-02-12 23:37 ` [PATCH v4 00/28] Enrich Trailer API Christian Couder
2024-02-13 0:11 ` Junio C Hamano
2024-02-13 6:55 ` Christian Couder
2024-02-13 17:30 ` Junio C Hamano
2024-02-13 20:25 ` Christian Couder
2024-02-16 2:25 ` Linus Arver
2024-02-13 19:39 ` Linus Arver
2024-02-13 19:57 ` Junio C Hamano
2024-02-13 20:25 ` Kristoffer Haugsbakk
2024-02-13 20:55 ` Christian Couder
2024-02-16 2:17 ` Linus Arver
2024-02-16 23:09 ` [PATCH v5 0/9] " Linus Arver via GitGitGadget
2024-02-16 23:09 ` [PATCH v5 1/9] trailer: free trailer_info _after_ all related usage Linus Arver via GitGitGadget
2024-02-16 23:09 ` [PATCH v5 2/9] shortlog: add test for de-duplicating folded trailers Linus Arver via GitGitGadget
2024-02-16 23:09 ` [PATCH v5 3/9] trailer: prepare to expose functions as part of API Linus Arver via GitGitGadget
2024-02-19 21:31 ` Christian Couder
2024-02-29 22:33 ` Linus Arver
2024-02-29 23:21 ` Junio C Hamano
2024-02-29 23:53 ` Linus Arver
2024-02-16 23:09 ` [PATCH v5 4/9] trailer: move interpret_trailers() to interpret-trailers.c Linus Arver via GitGitGadget
2024-02-16 23:09 ` [PATCH v5 5/9] trailer: start preparing for formatting unification Linus Arver via GitGitGadget
2024-02-19 21:31 ` Christian Couder
2024-02-29 22:53 ` Linus Arver
2024-02-16 23:09 ` [PATCH v5 6/9] trailer_info_get(): reorder parameters Linus Arver via GitGitGadget
2024-02-16 23:09 ` [PATCH v5 7/9] format_trailers(): use strbuf instead of FILE Linus Arver via GitGitGadget
2024-02-16 23:09 ` [PATCH v5 8/9] format_trailer_info(): move "fast path" to caller Linus Arver via GitGitGadget
2024-02-16 23:09 ` [PATCH v5 9/9] format_trailers_from_commit(): indirectly call trailer_info_get() Linus Arver via GitGitGadget
2024-02-19 21:32 ` Christian Couder
2024-02-29 23:00 ` Linus Arver
2024-02-19 21:40 ` [PATCH v5 0/9] Enrich Trailer API Christian Couder
2024-03-01 0:14 ` [PATCH v6 " Linus Arver via GitGitGadget
2024-03-01 0:14 ` [PATCH v6 1/9] trailer: free trailer_info _after_ all related usage Linus Arver via GitGitGadget
2024-03-01 0:14 ` [PATCH v6 2/9] shortlog: add test for de-duplicating folded trailers Linus Arver via GitGitGadget
2024-03-01 0:14 ` [PATCH v6 3/9] trailer: rename functions to use 'trailer' Linus Arver via GitGitGadget
2024-03-01 0:14 ` [PATCH v6 4/9] trailer: move interpret_trailers() to interpret-trailers.c Linus Arver via GitGitGadget
2024-03-01 0:14 ` [PATCH v6 5/9] trailer: reorder format_trailers_from_commit() parameters Linus Arver via GitGitGadget
2024-03-01 0:14 ` [PATCH v6 6/9] trailer_info_get(): reorder parameters Linus Arver via GitGitGadget
2024-03-01 0:14 ` [PATCH v6 7/9] format_trailers(): use strbuf instead of FILE Linus Arver via GitGitGadget
2024-03-01 0:14 ` [PATCH v6 8/9] format_trailer_info(): move "fast path" to caller Linus Arver via GitGitGadget
2024-03-01 0:14 ` [PATCH v6 9/9] format_trailers_from_commit(): indirectly call trailer_info_get() Linus Arver via GitGitGadget
2024-03-05 18:03 ` [PATCH v6 0/9] Enrich Trailer API Junio C Hamano
2024-03-05 19:07 ` Josh Steadmon
2024-03-05 19:41 ` Junio C Hamano
2024-03-06 14:41 ` Christian Couder
2024-03-06 16:59 ` Junio C Hamano
2024-03-06 17:09 ` Junio C Hamano
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=owlyv879106s.fsf@fine.c.googlers.com \
--to=linusa@google.com \
--cc=chriscool@tuxfamily.org \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=gitster@pobox.com \
--cc=nasamuffin@google.com \
--cc=rsbecker@nexbridge.com \
--cc=steadmon@google.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.
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 NNTP newsgroup(s).