builtin/commit.c: extract ignore_non_trailer() helper function
Extract a helper function from prepare_to_commit() to determine where to place a new Signed-off-by: line, which is essentially the true "end" of the log message, ignoring the trailing "Conflicts:" line and everything below it. The detection _should_ make sure the "Conflicts:" line it finds is truly the conflict hint block by checking everything that follows is a HT indented pathname to avoid false positive, but this logic will be revamped in a later patch to ignore comments and blanks anyway, so it is left as-is in this step. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
75c961b767
commit
073bd75e17
@ -593,6 +593,37 @@ static char *cut_ident_timestamp_part(char *string)
|
||||
return ket;
|
||||
}
|
||||
|
||||
/*
|
||||
* Inspect sb and determine the true "end" of the log message, in
|
||||
* order to find where to put a new Signed-off-by: line. Ignored are
|
||||
* trailing "Conflict:" block.
|
||||
*
|
||||
* Returns the number of bytes from the tail to ignore, to be fed as
|
||||
* the second parameter to append_signoff().
|
||||
*/
|
||||
static int ignore_non_trailer(struct strbuf *sb)
|
||||
{
|
||||
int ignore_footer = 0;
|
||||
int i, eol, previous = 0;
|
||||
const char *nl;
|
||||
|
||||
for (i = 0; i < sb->len; i++) {
|
||||
nl = memchr(sb->buf + i, '\n', sb->len - i);
|
||||
if (nl)
|
||||
eol = nl - sb->buf;
|
||||
else
|
||||
eol = sb->len;
|
||||
if (!prefixcmp(sb->buf + previous, "\nConflicts:\n")) {
|
||||
ignore_footer = sb->len - previous;
|
||||
break;
|
||||
}
|
||||
while (i < eol)
|
||||
i++;
|
||||
previous = eol;
|
||||
}
|
||||
return ignore_footer;
|
||||
}
|
||||
|
||||
static int prepare_to_commit(const char *index_file, const char *prefix,
|
||||
struct commit *current_head,
|
||||
struct wt_status *s,
|
||||
@ -718,32 +749,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
|
||||
if (clean_message_contents)
|
||||
stripspace(&sb, 0);
|
||||
|
||||
if (signoff) {
|
||||
/*
|
||||
* See if we have a Conflicts: block at the end. If yes, count
|
||||
* its size, so we can ignore it.
|
||||
*/
|
||||
int ignore_footer = 0;
|
||||
int i, eol, previous = 0;
|
||||
const char *nl;
|
||||
|
||||
for (i = 0; i < sb.len; i++) {
|
||||
nl = memchr(sb.buf + i, '\n', sb.len - i);
|
||||
if (nl)
|
||||
eol = nl - sb.buf;
|
||||
else
|
||||
eol = sb.len;
|
||||
if (!prefixcmp(sb.buf + previous, "\nConflicts:\n")) {
|
||||
ignore_footer = sb.len - previous;
|
||||
break;
|
||||
}
|
||||
while (i < eol)
|
||||
i++;
|
||||
previous = eol;
|
||||
}
|
||||
|
||||
append_signoff(&sb, ignore_footer, 0);
|
||||
}
|
||||
if (signoff)
|
||||
append_signoff(&sb, ignore_non_trailer(&sb), 0);
|
||||
|
||||
if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
|
||||
die_errno(_("could not write commit template"));
|
||||
|
Loading…
Reference in New Issue
Block a user