diff options
| author | Junio C Hamano <gitster@pobox.com> | 2014-11-10 09:56:39 -0800 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2014-11-10 09:56:39 -0800 | 
| commit | 216d29ef257e48f95bc14765d5da17e7854a3109 (patch) | |
| tree | 7cd0e31b75f442d9ae146f222b102b9982bd60ce /builtin/commit.c | |
| parent | d52adf1f328162a9513940913ced044d24c0212f (diff) | |
| parent | 261f315bebfa9af2d09f20211960100ff06f87cb (diff) | |
| download | git-216d29ef257e48f95bc14765d5da17e7854a3109.tar.gz | |
Merge branch 'jc/conflict-hint' into cc/interpret-trailers-more
* jc/conflict-hint:
  merge & sequencer: turn "Conflicts:" hint into a comment
  builtin/commit.c: extract ignore_non_trailer() helper function
  merge & sequencer: unify codepaths that write "Conflicts:" hint
  builtin/merge.c: drop a parameter that is never used
  git-tag.txt: Add a missing hyphen to `-s`
Diffstat (limited to 'builtin/commit.c')
| -rw-r--r-- | builtin/commit.c | 74 | 
1 files changed, 48 insertions, 26 deletions
| diff --git a/builtin/commit.c b/builtin/commit.c index 41f481bd03..80a618fe13 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -669,6 +669,52 @@ static void adjust_comment_line_char(const struct strbuf *sb)  	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,  			     struct commit *current_head,  			     struct wt_status *s, @@ -792,32 +838,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 (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 (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")); | 
