Teach mailinfo to ignore everything before -- >8 -- mark
This teaches mailinfo the scissors -- >8 -- mark; the command ignores everything before it in the message body. For lefties among us, we also support -- 8< -- ;-) Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									606417bc6d
								
							
						
					
					
						commit
						200c75f0d6
					
				|  | @ -712,6 +712,56 @@ static inline int patchbreak(const struct strbuf *line) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int is_scissors_line(const struct strbuf *line) | ||||||
|  | { | ||||||
|  | 	size_t i, len = line->len; | ||||||
|  | 	int scissors = 0, gap = 0; | ||||||
|  | 	int first_nonblank = -1; | ||||||
|  | 	int last_nonblank = 0, visible, perforation = 0, in_perforation = 0; | ||||||
|  | 	const char *buf = line->buf; | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < len; i++) { | ||||||
|  | 		if (isspace(buf[i])) { | ||||||
|  | 			if (in_perforation) { | ||||||
|  | 				perforation++; | ||||||
|  | 				gap++; | ||||||
|  | 			} | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		last_nonblank = i; | ||||||
|  | 		if (first_nonblank < 0) | ||||||
|  | 			first_nonblank = i; | ||||||
|  | 		if (buf[i] == '-') { | ||||||
|  | 			in_perforation = 1; | ||||||
|  | 			perforation++; | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		if (i + 1 < len && | ||||||
|  | 		    (!memcmp(buf + i, ">8", 2) || !memcmp(buf + i, "8<", 2))) { | ||||||
|  | 			in_perforation = 1; | ||||||
|  | 			perforation += 2; | ||||||
|  | 			scissors += 2; | ||||||
|  | 			i++; | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		in_perforation = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * The mark must be at least 8 bytes long (e.g. "-- >8 --"). | ||||||
|  | 	 * Even though there can be arbitrary cruft on the same line | ||||||
|  | 	 * (e.g. "cut here"), in order to avoid misidentification, the | ||||||
|  | 	 * perforation must occupy more than a third of the visible | ||||||
|  | 	 * width of the line, and dashes and scissors must occupy more | ||||||
|  | 	 * than half of the perforation. | ||||||
|  | 	 */ | ||||||
|  |  | ||||||
|  | 	visible = last_nonblank - first_nonblank + 1; | ||||||
|  | 	return (scissors && 8 <= visible && | ||||||
|  | 		visible < perforation * 3 && | ||||||
|  | 		gap * 2 < perforation); | ||||||
|  | } | ||||||
|  |  | ||||||
| static int handle_commit_msg(struct strbuf *line) | static int handle_commit_msg(struct strbuf *line) | ||||||
| { | { | ||||||
| 	static int still_looking = 1; | 	static int still_looking = 1; | ||||||
|  | @ -723,7 +773,8 @@ static int handle_commit_msg(struct strbuf *line) | ||||||
| 		strbuf_ltrim(line); | 		strbuf_ltrim(line); | ||||||
| 		if (!line->len) | 		if (!line->len) | ||||||
| 			return 0; | 			return 0; | ||||||
| 		if ((still_looking = check_header(line, s_hdr_data, 0)) != 0) | 		still_looking = check_header(line, s_hdr_data, 0); | ||||||
|  | 		if (still_looking) | ||||||
| 			return 0; | 			return 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -731,6 +782,24 @@ static int handle_commit_msg(struct strbuf *line) | ||||||
| 	if (metainfo_charset) | 	if (metainfo_charset) | ||||||
| 		convert_to_utf8(line, charset.buf); | 		convert_to_utf8(line, charset.buf); | ||||||
|  |  | ||||||
|  | 	if (is_scissors_line(line)) { | ||||||
|  | 		int i; | ||||||
|  | 		rewind(cmitmsg); | ||||||
|  | 		ftruncate(fileno(cmitmsg), 0); | ||||||
|  | 		still_looking = 1; | ||||||
|  |  | ||||||
|  | 		/* | ||||||
|  | 		 * We may have already read "secondary headers"; purge | ||||||
|  | 		 * them to give ourselves a clean restart. | ||||||
|  | 		 */ | ||||||
|  | 		for (i = 0; header[i]; i++) { | ||||||
|  | 			if (s_hdr_data[i]) | ||||||
|  | 				strbuf_release(s_hdr_data[i]); | ||||||
|  | 			s_hdr_data[i] = NULL; | ||||||
|  | 		} | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (patchbreak(line)) { | 	if (patchbreak(line)) { | ||||||
| 		fclose(cmitmsg); | 		fclose(cmitmsg); | ||||||
| 		cmitmsg = NULL; | 		cmitmsg = NULL; | ||||||
|  |  | ||||||
|  | @ -11,7 +11,7 @@ test_expect_success 'split sample box' \ | ||||||
| 	'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last && | 	'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last && | ||||||
| 	last=`cat last` && | 	last=`cat last` && | ||||||
| 	echo total is $last && | 	echo total is $last && | ||||||
| 	test `cat last` = 13' | 	test `cat last` = 14' | ||||||
|  |  | ||||||
| for mail in `echo 00*` | for mail in `echo 00*` | ||||||
| do | do | ||||||
|  |  | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | Author: Junio C Hamano | ||||||
|  | Email: gitster@pobox.com | ||||||
|  | Subject: Teach mailinfo to ignore everything before -- >8 -- mark | ||||||
|  | Date: Thu, 20 Aug 2009 17:18:22 -0700 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,4 @@ | ||||||
|  | This teaches mailinfo the scissors -- >8 -- mark; the command ignores | ||||||
|  | everything before it in the message body. | ||||||
|  |  | ||||||
|  | Signed-off-by: Junio C Hamano <gitster@pobox.com> | ||||||
|  | @ -0,0 +1,64 @@ | ||||||
|  | --- | ||||||
|  |  builtin-mailinfo.c |   37 ++++++++++++++++++++++++++++++++++++- | ||||||
|  |  1 files changed, 36 insertions(+), 1 deletions(-) | ||||||
|  |  | ||||||
|  | diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c | ||||||
|  | index b0b5d8f..461c47e 100644 | ||||||
|  | --- a/builtin-mailinfo.c | ||||||
|  | +++ b/builtin-mailinfo.c | ||||||
|  | @@ -712,6 +712,34 @@ static inline int patchbreak(const struct strbuf *line) | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static int scissors(const struct strbuf *line) | ||||||
|  | +{ | ||||||
|  | +	size_t i, len = line->len; | ||||||
|  | +	int scissors_dashes_seen = 0; | ||||||
|  | +	const char *buf = line->buf; | ||||||
|  | + | ||||||
|  | +	for (i = 0; i < len; i++) { | ||||||
|  | +		if (isspace(buf[i])) | ||||||
|  | +			continue; | ||||||
|  | +		if (buf[i] == '-') { | ||||||
|  | +			scissors_dashes_seen |= 02; | ||||||
|  | +			continue; | ||||||
|  | +		} | ||||||
|  | +		if (i + 1 < len && !memcmp(buf + i, ">8", 2)) { | ||||||
|  | +			scissors_dashes_seen |= 01; | ||||||
|  | +			i++; | ||||||
|  | +			continue; | ||||||
|  | +		} | ||||||
|  | +		if (i + 7 < len && !memcmp(buf + i, "cut here", 8)) { | ||||||
|  | +			i += 7; | ||||||
|  | +			continue; | ||||||
|  | +		} | ||||||
|  | +		/* everything else --- not scissors */ | ||||||
|  | +		break; | ||||||
|  | +	} | ||||||
|  | +	return scissors_dashes_seen == 03; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static int handle_commit_msg(struct strbuf *line) | ||||||
|  |  { | ||||||
|  |  	static int still_looking = 1; | ||||||
|  | @@ -723,10 +751,17 @@ static int handle_commit_msg(struct strbuf *line) | ||||||
|  |  		strbuf_ltrim(line); | ||||||
|  |  		if (!line->len) | ||||||
|  |  			return 0; | ||||||
|  | -		if ((still_looking = check_header(line, s_hdr_data, 0)) != 0) | ||||||
|  | +		still_looking = check_header(line, s_hdr_data, 0); | ||||||
|  | +		if (still_looking) | ||||||
|  |  			return 0; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | +	if (scissors(line)) { | ||||||
|  | +		fseek(cmitmsg, 0L, SEEK_SET); | ||||||
|  | +		still_looking = 1; | ||||||
|  | +		return 0; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  |  	/* normalize the log message to UTF-8. */ | ||||||
|  |  	if (metainfo_charset) | ||||||
|  |  		convert_to_utf8(line, charset.buf); | ||||||
|  | --  | ||||||
|  | 1.6.4.1 | ||||||
|  | @ -561,3 +561,92 @@ From: <a.u.thor@example.com> (A U Thor) | ||||||
| Date: Fri, 9 Jun 2006 00:44:16 -0700 | Date: Fri, 9 Jun 2006 00:44:16 -0700 | ||||||
| Subject: [PATCH] a patch | Subject: [PATCH] a patch | ||||||
|  |  | ||||||
|  | From nobody Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Junio Hamano <junkio@cox.net> | ||||||
|  | Date: Thu, 20 Aug 2009 17:18:22 -0700 | ||||||
|  | Subject: Why doesn't git-am does not like >8 scissors mark? | ||||||
|  |  | ||||||
|  | Subject: [PATCH] BLAH ONE | ||||||
|  |  | ||||||
|  | In real life, we will see a discussion that inspired this patch | ||||||
|  | discussing related and unrelated things around >8 scissors mark | ||||||
|  | in this part of the message. | ||||||
|  |  | ||||||
|  | Subject: [PATCH] BLAH TWO | ||||||
|  |  | ||||||
|  | And then we will see the scissors. | ||||||
|  |  | ||||||
|  |  This line is not a scissors mark -- >8 -- but talks about it. | ||||||
|  |  - - >8 - - please remove everything above this line - - >8 - - | ||||||
|  |  | ||||||
|  | Subject: [PATCH] Teach mailinfo to ignore everything before -- >8 -- mark | ||||||
|  | From: Junio C Hamano <gitster@pobox.com> | ||||||
|  |  | ||||||
|  | This teaches mailinfo the scissors -- >8 -- mark; the command ignores | ||||||
|  | everything before it in the message body. | ||||||
|  |  | ||||||
|  | Signed-off-by: Junio C Hamano <gitster@pobox.com> | ||||||
|  | --- | ||||||
|  |  builtin-mailinfo.c |   37 ++++++++++++++++++++++++++++++++++++- | ||||||
|  |  1 files changed, 36 insertions(+), 1 deletions(-) | ||||||
|  |  | ||||||
|  | diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c | ||||||
|  | index b0b5d8f..461c47e 100644 | ||||||
|  | --- a/builtin-mailinfo.c | ||||||
|  | +++ b/builtin-mailinfo.c | ||||||
|  | @@ -712,6 +712,34 @@ static inline int patchbreak(const struct strbuf *line) | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static int scissors(const struct strbuf *line) | ||||||
|  | +{ | ||||||
|  | +	size_t i, len = line->len; | ||||||
|  | +	int scissors_dashes_seen = 0; | ||||||
|  | +	const char *buf = line->buf; | ||||||
|  | + | ||||||
|  | +	for (i = 0; i < len; i++) { | ||||||
|  | +		if (isspace(buf[i])) | ||||||
|  | +			continue; | ||||||
|  | +		if (buf[i] == '-') { | ||||||
|  | +			scissors_dashes_seen |= 02; | ||||||
|  | +			continue; | ||||||
|  | +		} | ||||||
|  | +		if (i + 1 < len && !memcmp(buf + i, ">8", 2)) { | ||||||
|  | +			scissors_dashes_seen |= 01; | ||||||
|  | +			i++; | ||||||
|  | +			continue; | ||||||
|  | +		} | ||||||
|  | +		if (i + 7 < len && !memcmp(buf + i, "cut here", 8)) { | ||||||
|  | +			i += 7; | ||||||
|  | +			continue; | ||||||
|  | +		} | ||||||
|  | +		/* everything else --- not scissors */ | ||||||
|  | +		break; | ||||||
|  | +	} | ||||||
|  | +	return scissors_dashes_seen == 03; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  |  static int handle_commit_msg(struct strbuf *line) | ||||||
|  |  { | ||||||
|  |  	static int still_looking = 1; | ||||||
|  | @@ -723,10 +751,17 @@ static int handle_commit_msg(struct strbuf *line) | ||||||
|  |  		strbuf_ltrim(line); | ||||||
|  |  		if (!line->len) | ||||||
|  |  			return 0; | ||||||
|  | -		if ((still_looking = check_header(line, s_hdr_data, 0)) != 0) | ||||||
|  | +		still_looking = check_header(line, s_hdr_data, 0); | ||||||
|  | +		if (still_looking) | ||||||
|  |  			return 0; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | +	if (scissors(line)) { | ||||||
|  | +		fseek(cmitmsg, 0L, SEEK_SET); | ||||||
|  | +		still_looking = 1; | ||||||
|  | +		return 0; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  |  	/* normalize the log message to UTF-8. */ | ||||||
|  |  	if (metainfo_charset) | ||||||
|  |  		convert_to_utf8(line, charset.buf); | ||||||
|  | --  | ||||||
|  | 1.6.4.1 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano