Jonathan Tan <[email protected]> writes:
> Sounds reasonable to me. Would the "[" be a bit of overspecification,
> though, since Git doesn't produce it? Also, identifying it as a
> garbage line probably wouldn't change any behavior - in the Linux
> kernel examples, it is used to show what happened in between
> sign-offs, so there will always be one "Signed-off-by:" at the top.
Good thinking. As "interpret trailers" cannot locate such a line to
manipulate (as it lacks <token>), we can simply treat it as a
garbage line.
>> struct {
>> const char *whole;
>> const char *end_of_message_proper;
>> struct {
>> const char *token;
>> const char *contents;
>> } *trailer;
>> int alloc_trailers, nr_trailers;
>> };
>>
>> where
>>
>> - whole points at the first byte of the input, i.e. the beginning
>> of the commit message buffer.
>>
>> - end-of-message-proper points at the first byte of the trailer
>> block into the buffer at "whole".
>>
>> - token is a canonical header name for easy comparison for
>> interpret-trailers (you can use NULL for garbage lines, and made
>> up token like "[bracket]" and "(cherrypick)" that would not clash
>> with real tokens like "Signed-off-by").
>>
>> - contents is the bytes on the logical line, including the header
>> part
>>
>> E.g. an element in trailer[] array may say
>>
>> {
>> .token = "Signed-off-by",
>> .contents = "Signed-Off-By: Some Body <[email protected]>\n",
>> }
>
> I get the impression from the rest of your e-mail that no strings are
> meant to be copied - is that true? (That sounds like a good idea to
> me.)
I was envisioning that "whole", "end-of-message" can point into the
input buffer, while trailer[].contents may have to be copied, if
only to make it to a NUL-terminated string. But I am fine with
<ptr,len> or <begin,end> pair to avoid copying .contents if that is
desired. You'd need to worry about differentiating .contents that
need to be freed after "interpret trailers" inserted a new entry or
replaced the contents, though.