"Linus Arver via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > From: Linus Arver <linusa@xxxxxxxxxx> > > Previously, trailer_info_get() computed the trailer block end position > by > > (1) checking for the opts->no_divider flag and optionally calling > find_patch_start() to find the "patch start" location (patch_start), and > (2) calling find_trailer_end() to find the end of the trailer block > using patch_start as a guide, saving the return value into > "trailer_end". > > The logic in (1) was awkward because the variable "patch_start" is > misleading if there is no patch in the input. The logic in (2) was > misleading because it could be the case that no trailers are in the > input (yet we are setting a "trailer_end" variable before even searching > for trailers, which happens later in find_trailer_start()). The name > "find_trailer_end" was misleading because that function did not look for > any trailer block itself --- instead it just computed the end position > of the log message in the input where the end of the trailer block (if > it exists) would be (because trailer blocks must always come after the > end of the log message). > > Combine the logic in (1) and (2) together into find_patch_start() by > renaming it to find_end_of_log_message(). The end of the log message is > the starting point which find_trailer_start() needs to start searching > backward to parse individual trailers (if any). > > Helped-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> > Helped-by: Junio C Hamano <gitster@xxxxxxxxx> > Signed-off-by: Linus Arver <linusa@xxxxxxxxxx> > --- > trailer.c | 64 +++++++++++++++++++++++++++++++++++-------------------- > 1 file changed, 41 insertions(+), 23 deletions(-) > > diff --git a/trailer.c b/trailer.c > index 3c54b38a85a..70c81fda710 100644 > --- a/trailer.c > +++ b/trailer.c > @@ -809,21 +809,50 @@ static ssize_t last_line(const char *buf, size_t len) > } > > /* > - * Return the position of the start of the patch or the length of str if there > - * is no patch in the message. > + * Find the end of the log message as an offset from the start of the input > + * (where callers of this function are interested in looking for a trailers > + * block in the same input). We have to consider two categories of content that > + * can come at the end of the input which we want to ignore (because they don't > + * belong in the log message): > + * > + * (1) the "patch part" which begins with a "---" divider and has patch > + * information (like the output of git-format-patch), and > + * > + * (2) any trailing comment lines, blank lines like in the output of "git > + * commit -v", or stuff below the "cut" (scissor) line. > + * > + * As a formula, the situation looks like this: > + * > + * INPUT = LOG MESSAGE + IGNORED > + * > + * where IGNORED can be either of the two categories described above. It may be > + * that there is nothing to ignore. Now it may be the case that the LOG MESSAGE > + * contains a trailer block, but that's not the concern of this function. > */ > -static size_t find_patch_start(const char *str) > +static size_t find_end_of_log_message(const char *input, int no_divider) > { > + size_t end; > const char *s; > > - for (s = str; *s; s = next_line(s)) { > + /* Assume the naive end of the input is already what we want. */ > + end = strlen(input); > + > + if (no_divider) { > + return end; > + } OK. The early return may make sense, as we are essentially declaring that everything is the "INPUT (= message + ignored)". You do not need {braces} around a single-statement block, though. Other than that, I didn't find anything quesionable in any of the patches in this round. Looking good. Thanks.