Browse Source

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>
maint
Junio C Hamano 10 years ago
parent
commit
073bd75e17
  1. 59
      builtin/commit.c

59
builtin/commit.c

@ -593,6 +593,37 @@ static char *cut_ident_timestamp_part(char *string) @@ -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, @@ -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…
Cancel
Save