@ -669,6 +669,52 @@ static void adjust_comment_line_char(const struct strbuf *sb)
comment_line_char = *p;
comment_line_char = *p;
}
}
/*
* 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 comment lines and blank lines, and also the traditional
* "Conflicts:" block that is not commented out, so that we can use
* "git commit -s --amend" on an existing commit that forgot to remove
* it.
*
* 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 boc = 0;
int bol = 0;
int in_old_conflicts_block = 0;
while (bol < sb->len) {
char *next_line;
if (!(next_line = memchr(sb->buf + bol, '\n', sb->len - bol)))
next_line = sb->buf + sb->len;
else
next_line++;
if (sb->buf[bol] == comment_line_char || sb->buf[bol] == '\n') {
/* is this the first of the run of comments? */
if (!boc)
boc = bol;
/* otherwise, it is just continuing */
} else if (starts_with(sb->buf + bol, "Conflicts:\n")) {
in_old_conflicts_block = 1;
if (!boc)
boc = bol;
} else if (in_old_conflicts_block && sb->buf[bol] == '\t') {
; /* a pathname in the conflicts block */
} else if (boc) {
/* the previous was not trailing comment */
boc = 0;
in_old_conflicts_block = 0;
}
bol = next_line - sb->buf;
}
return boc ? sb->len - boc : 0;
}
static int prepare_to_commit(const char *index_file, const char *prefix,
static int prepare_to_commit(const char *index_file, const char *prefix,
struct commit *current_head,
struct commit *current_head,
struct wt_status *s,
struct wt_status *s,
@ -792,32 +838,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
if (clean_message_contents)
if (clean_message_contents)
stripspace(&sb, 0);
stripspace(&sb, 0);
if (signoff) {
if (signoff)
/*
append_signoff(&sb, ignore_non_trailer(&sb), 0);
* 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 (starts_with(sb.buf + previous, "\nConflicts:\n")) {
ignore_footer = sb.len - previous;
break;
}
while (i < eol)
i++;
previous = eol;
}
append_signoff(&sb, ignore_footer, 0);
}
if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
die_errno(_("could not write commit template"));
die_errno(_("could not write commit template"));