Phillip Wood <phillip.wood123@xxxxxxxxx> writes: > Hi Linus > > Sorry I'm late to the party here I've left a couple of thoughts below > but I don't want to derail this series if everyone else is happy. Hi Phillip, no problem. > On 02/05/2024 05:54, Linus Arver via GitGitGadget wrote: >> From: Linus Arver <linus@xxxxxxxx> >> >> Previously the iterator did not iterate over non-trailer lines. This was >> somewhat unfortunate, because trailer blocks could have non-trailer >> lines in them since 146245063e (trailer: allow non-trailers in trailer >> block, 2016-10-21), which was before the iterator was created in >> f0939a0eb1 (trailer: add interface for iterating over commit trailers, >> 2020-09-27). >> >> So if trailer API users wanted to iterate over all lines in a trailer >> block (including non-trailer lines), they could not use the iterator and >> were forced to use the lower-level trailer_info struct directly (which >> provides a raw string array that includes all lines in the trailer >> block). >> >> Change the iterator's behavior so that we also iterate over non-trailer >> lines, instead of skipping over them. The new "raw" member of the >> iterator allows API users to access previously inaccessible non-trailer >> lines. Reword the variable "trailer" to just "line" because this >> variable can now hold both trailer lines _and_ non-trailer lines. >> >> The new "raw" member is important because anyone currently not using the >> iterator is using trailer_info's raw string array directly to access >> lines to check what the combined key + value looks like. If we didn't >> provide a "raw" member here, iterator users would have to re-construct >> the unparsed line by concatenating the key and value back together again >> --- which places an undue burden for iterator users. > > Comparing the raw line is error prone as it ignores custom separators > and variations in the amount of space between the key and the value. > Therefore I'd argue that the sequencer should in fact be comparing the > trailer key and value separately rather than comparing the whole line. I agree, but that is likely beyond the scope of this series as the behavior of comparing the whole line was preserved (not introduced) by this series. For reference, the "Signed-off-by: " is hardcoded in "sign_off_header" in sequencer.c, and it is again hardcoded in "git_generated_prefixes" in trailer.c. We always use the hardcoded key and colon ":" separator in a few areas, so changing the code to be more precise to check for only the key (to account for variability in the separator and space around it as you pointed out) would be a more involved change (I think many tests would need to be updated). > There is an issue that we want to add a new Signed-off-by: trailer for > "C.O. Mitter" when the trailers look like > > Signed-off-by: C.O. Mitter <c.o.mitter@xxxxxxxxxxx> > non-trailer-line > > but not when they look like > > Signed-off-by: C.O. Mitter <c.o.mitter@xxxxxxxxxxx> > > so we still need some way of indicating that there was a non-trailer > line after the last trailer though. What is the issue, exactly? Also can you clarify if the issue is introduced by this series (did you spot a regression)? >> The next commit demonstrates the use of the iterator in sequencer.c as an >> example of where "raw" will be useful, so that it can start using the >> iterator. >> >> For the existing use of the iterator in builtin/shortlog.c, we don't >> have to change the code there because that code does > > An interface that lets the caller pass a flag if they want to know about > non-trailer lines might be easier to use for the callers that don't want > to worry about such lines and wouldn't need a justification as to why it > was safe for existing callers. Makes sense. But perhaps such API enhancements belong in a future series, when other callers that need such flexibility could benefit from it? > Best Wishes > > Phillip > >> trailer_iterator_init(&iter, body); >> while (trailer_iterator_advance(&iter)) { >> const char *value = iter.val.buf; >> >> if (!string_list_has_string(&log->trailers, iter.key.buf)) >> continue; >> >> ... >> >> and the >> >> if (!string_list_has_string(&log->trailers, iter.key.buf)) >> >> condition already skips over non-trailer lines (iter.key.buf is empty >> for non-trailer lines, making the comparison still work even with this >> commit). >> >> Rename "num_expected_trailers" to "num_expected" in >> t/unit-tests/t-trailer.c because the items we iterate over now include >> non-trailer lines. >> >> Signed-off-by: Linus Arver <linus@xxxxxxxx> >> [...]