Allow mailsplit (and hence git-am) to handle mails with CRLF line-endings
It is not that uncommon to have mails with DOS line-ending, notably Thunderbird and web mailers like Gmail (when saving what they call "original" message). So modify mailsplit to convert CRLF line-endings to just LF. Since git-rebase is built on top of git-am, add an option to mailsplit to be used by git-am when it is acting on behalf of git-rebase, to refrain from doing this conversion. And add a test to make sure that rebase still works. Signed-off-by: Brandon Casey <drafnel@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									6a2d3f50f5
								
							
						
					
					
						commit
						c2ca1d79db
					
				|  | @ -44,6 +44,7 @@ static int is_from_line(const char *line, int len) | ||||||
| } | } | ||||||
|  |  | ||||||
| static struct strbuf buf = STRBUF_INIT; | static struct strbuf buf = STRBUF_INIT; | ||||||
|  | static int keep_cr; | ||||||
|  |  | ||||||
| /* Called with the first line (potentially partial) | /* Called with the first line (potentially partial) | ||||||
|  * already in buf[] -- normally that should begin with |  * already in buf[] -- normally that should begin with | ||||||
|  | @ -69,6 +70,12 @@ static int split_one(FILE *mbox, const char *name, int allow_bare) | ||||||
| 	 * "From " and having something that looks like a date format. | 	 * "From " and having something that looks like a date format. | ||||||
| 	 */ | 	 */ | ||||||
| 	for (;;) { | 	for (;;) { | ||||||
|  | 		if (!keep_cr && buf.len > 1 && buf.buf[buf.len-1] == '\n' && | ||||||
|  | 			buf.buf[buf.len-2] == '\r') { | ||||||
|  | 			strbuf_setlen(&buf, buf.len-2); | ||||||
|  | 			strbuf_addch(&buf, '\n'); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		if (fwrite(buf.buf, 1, buf.len, output) != buf.len) | 		if (fwrite(buf.buf, 1, buf.len, output) != buf.len) | ||||||
| 			die_errno("cannot write output"); | 			die_errno("cannot write output"); | ||||||
|  |  | ||||||
|  | @ -226,6 +233,8 @@ int cmd_mailsplit(int argc, const char **argv, const char *prefix) | ||||||
| 			nr = strtol(arg+2, NULL, 10); | 			nr = strtol(arg+2, NULL, 10); | ||||||
| 		} else if ( arg[1] == 'b' && !arg[2] ) { | 		} else if ( arg[1] == 'b' && !arg[2] ) { | ||||||
| 			allow_bare = 1; | 			allow_bare = 1; | ||||||
|  | 		} else if (!strcmp(arg, "--keep-cr")) { | ||||||
|  | 			keep_cr = 1; | ||||||
| 		} else if ( arg[1] == 'o' && arg[2] ) { | 		} else if ( arg[1] == 'o' && arg[2] ) { | ||||||
| 			dir = arg+2; | 			dir = arg+2; | ||||||
| 		} else if ( arg[1] == '-' && !arg[2] ) { | 		} else if ( arg[1] == '-' && !arg[2] ) { | ||||||
|  |  | ||||||
|  | @ -197,7 +197,13 @@ check_patch_format () { | ||||||
| split_patches () { | split_patches () { | ||||||
| 	case "$patch_format" in | 	case "$patch_format" in | ||||||
| 	mbox) | 	mbox) | ||||||
| 		git mailsplit -d"$prec" -o"$dotest" -b -- "$@" > "$dotest/last" || | 		case "$rebasing" in | ||||||
|  | 		'') | ||||||
|  | 			keep_cr= ;; | ||||||
|  | 		?*) | ||||||
|  | 			keep_cr=--keep-cr ;; | ||||||
|  | 		esac | ||||||
|  | 		git mailsplit -d"$prec" -o"$dotest" -b $keep_cr -- "$@" > "$dotest/last" || | ||||||
| 		clean_abort | 		clean_abort | ||||||
| 		;; | 		;; | ||||||
| 	stgit-series) | 	stgit-series) | ||||||
|  |  | ||||||
|  | @ -3,9 +3,10 @@ | ||||||
| # Copyright (c) 2005 Amos Waterland | # Copyright (c) 2005 Amos Waterland | ||||||
| # | # | ||||||
|  |  | ||||||
| test_description='git rebase should not destroy author information | test_description='git rebase assorted tests | ||||||
|  |  | ||||||
| This test runs git rebase and checks that the author information is not lost. | This test runs git rebase and checks that the author information is not lost | ||||||
|  | among other things. | ||||||
| ' | ' | ||||||
| . ./test-lib.sh | . ./test-lib.sh | ||||||
|  |  | ||||||
|  | @ -133,4 +134,25 @@ test_expect_success 'rebase -q is quiet' ' | ||||||
|      test ! -s output.out |      test ! -s output.out | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | q_to_cr () { | ||||||
|  | 	tr Q '\015' | ||||||
|  | } | ||||||
|  |  | ||||||
|  | test_expect_success 'Rebase a commit that sprinkles CRs in' ' | ||||||
|  | 	( | ||||||
|  | 		echo "One" | ||||||
|  | 		echo "TwoQ" | ||||||
|  | 		echo "Three" | ||||||
|  | 		echo "FQur" | ||||||
|  | 		echo "Five" | ||||||
|  | 	) | q_to_cr >CR && | ||||||
|  | 	git add CR && | ||||||
|  | 	test_tick && | ||||||
|  | 	git commit -a -m "A file with a line with CR" && | ||||||
|  | 	git tag file-with-cr && | ||||||
|  | 	git checkout HEAD^0 && | ||||||
|  | 	git rebase --onto HEAD^^ HEAD^ && | ||||||
|  | 	git diff --exit-code file-with-cr:CR HEAD:CR | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano