Merge branch 'bm/interpret-trailers-cut-line-is-eom' into maint
"git interpret-trailers", when used as GIT_EDITOR for "git commit -v", looked for and appended to a trailer block at the very end, i.e. at the end of the "diff" output. The command has been corrected to pay attention to the cut-mark line "commit -v" adds to the buffer---the real trailer block should appear just before it. * bm/interpret-trailers-cut-line-is-eom: interpret-trailers: honor the cut linemaint
						commit
						00c0e40f02
					
				|  | @ -1735,7 +1735,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) | ||||||
|  |  | ||||||
| 	if (verbose || /* Truncate the message just before the diff, if any. */ | 	if (verbose || /* Truncate the message just before the diff, if any. */ | ||||||
| 	    cleanup_mode == CLEANUP_SCISSORS) | 	    cleanup_mode == CLEANUP_SCISSORS) | ||||||
| 		wt_status_truncate_message_at_cut_line(&sb); | 		strbuf_setlen(&sb, wt_status_locate_end(sb.buf, sb.len)); | ||||||
|  |  | ||||||
| 	if (cleanup_mode != CLEANUP_NONE) | 	if (cleanup_mode != CLEANUP_NONE) | ||||||
| 		strbuf_stripspace(&sb, cleanup_mode == CLEANUP_ALL); | 		strbuf_stripspace(&sb, cleanup_mode == CLEANUP_ALL); | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								commit.c
								
								
								
								
							
							
						
						
									
										13
									
								
								commit.c
								
								
								
								
							|  | @ -11,6 +11,7 @@ | ||||||
| #include "commit-slab.h" | #include "commit-slab.h" | ||||||
| #include "prio-queue.h" | #include "prio-queue.h" | ||||||
| #include "sha1-lookup.h" | #include "sha1-lookup.h" | ||||||
|  | #include "wt-status.h" | ||||||
|  |  | ||||||
| static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **); | static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **); | ||||||
|  |  | ||||||
|  | @ -1648,10 +1649,9 @@ const char *find_commit_header(const char *msg, const char *key, size_t *out_len | ||||||
| /* | /* | ||||||
|  * Inspect the given string and determine the true "end" of the log message, in |  * Inspect the given string and determine the true "end" of the log message, in | ||||||
|  * order to find where to put a new Signed-off-by: line.  Ignored are |  * order to find where to put a new Signed-off-by: line.  Ignored are | ||||||
|  * trailing comment lines and blank lines, and also the traditional |  * trailing comment lines and blank lines.  To support "git commit -s | ||||||
|  * "Conflicts:" block that is not commented out, so that we can use |  * --amend" on an existing commit, we also ignore "Conflicts:".  To | ||||||
|  * "git commit -s --amend" on an existing commit that forgot to remove |  * support "git commit -v", we truncate at cut lines. | ||||||
|  * it. |  | ||||||
|  * |  * | ||||||
|  * Returns the number of bytes from the tail to ignore, to be fed as |  * Returns the number of bytes from the tail to ignore, to be fed as | ||||||
|  * the second parameter to append_signoff(). |  * the second parameter to append_signoff(). | ||||||
|  | @ -1661,8 +1661,9 @@ int ignore_non_trailer(const char *buf, size_t len) | ||||||
| 	int boc = 0; | 	int boc = 0; | ||||||
| 	int bol = 0; | 	int bol = 0; | ||||||
| 	int in_old_conflicts_block = 0; | 	int in_old_conflicts_block = 0; | ||||||
|  | 	size_t cutoff = wt_status_locate_end(buf, len); | ||||||
|  |  | ||||||
| 	while (bol < len) { | 	while (bol < cutoff) { | ||||||
| 		const char *next_line = memchr(buf + bol, '\n', len - bol); | 		const char *next_line = memchr(buf + bol, '\n', len - bol); | ||||||
|  |  | ||||||
| 		if (!next_line) | 		if (!next_line) | ||||||
|  | @ -1688,5 +1689,5 @@ int ignore_non_trailer(const char *buf, size_t len) | ||||||
| 		} | 		} | ||||||
| 		bol = next_line - buf; | 		bol = next_line - buf; | ||||||
| 	} | 	} | ||||||
| 	return boc ? len - boc : 0; | 	return boc ? len - boc : len - cutoff; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1258,4 +1258,21 @@ test_expect_success 'with no command and no key' ' | ||||||
| 	test_cmp expected actual | 	test_cmp expected actual | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'with cut line' ' | ||||||
|  | 	cat >expected <<-\EOF && | ||||||
|  | 		my subject | ||||||
|  |  | ||||||
|  | 		review: Brian | ||||||
|  | 		sign: A U Thor <author@example.com> | ||||||
|  | 		# ------------------------ >8 ------------------------ | ||||||
|  | 		ignore this | ||||||
|  | 	EOF | ||||||
|  | 	git interpret-trailers --trailer review:Brian >actual <<-\EOF && | ||||||
|  | 		my subject | ||||||
|  | 		# ------------------------ >8 ------------------------ | ||||||
|  | 		ignore this | ||||||
|  | 	EOF | ||||||
|  | 	test_cmp expected actual | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
							
								
								
									
										11
									
								
								wt-status.c
								
								
								
								
							
							
						
						
									
										11
									
								
								wt-status.c
								
								
								
								
							|  | @ -896,17 +896,18 @@ conclude: | ||||||
| 	status_printf_ln(s, GIT_COLOR_NORMAL, "%s", ""); | 	status_printf_ln(s, GIT_COLOR_NORMAL, "%s", ""); | ||||||
| } | } | ||||||
|  |  | ||||||
| void wt_status_truncate_message_at_cut_line(struct strbuf *buf) | size_t wt_status_locate_end(const char *s, size_t len) | ||||||
| { | { | ||||||
| 	const char *p; | 	const char *p; | ||||||
| 	struct strbuf pattern = STRBUF_INIT; | 	struct strbuf pattern = STRBUF_INIT; | ||||||
|  |  | ||||||
| 	strbuf_addf(&pattern, "\n%c %s", comment_line_char, cut_line); | 	strbuf_addf(&pattern, "\n%c %s", comment_line_char, cut_line); | ||||||
| 	if (starts_with(buf->buf, pattern.buf + 1)) | 	if (starts_with(s, pattern.buf + 1)) | ||||||
| 		strbuf_setlen(buf, 0); | 		len = 0; | ||||||
| 	else if ((p = strstr(buf->buf, pattern.buf))) | 	else if ((p = strstr(s, pattern.buf))) | ||||||
| 		strbuf_setlen(buf, p - buf->buf + 1); | 		len = p - s + 1; | ||||||
| 	strbuf_release(&pattern); | 	strbuf_release(&pattern); | ||||||
|  | 	return len; | ||||||
| } | } | ||||||
|  |  | ||||||
| void wt_status_add_cut_line(FILE *fp) | void wt_status_add_cut_line(FILE *fp) | ||||||
|  |  | ||||||
|  | @ -112,7 +112,7 @@ struct wt_status_state { | ||||||
| 	unsigned char cherry_pick_head_sha1[20]; | 	unsigned char cherry_pick_head_sha1[20]; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| void wt_status_truncate_message_at_cut_line(struct strbuf *); | size_t wt_status_locate_end(const char *s, size_t len); | ||||||
| void wt_status_add_cut_line(FILE *fp); | void wt_status_add_cut_line(FILE *fp); | ||||||
| void wt_status_prepare(struct wt_status *s); | void wt_status_prepare(struct wt_status *s); | ||||||
| void wt_status_print(struct wt_status *s); | void wt_status_print(struct wt_status *s); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano